?
1. CountVectorizer(詞頻向量化)
功能與原理
- 作用:將文本轉換為詞頻矩陣,統計每個詞在文檔中的出現次數。
- 核心步驟:
- 分詞:將文本按空格或規則切分為單詞。
- 構建詞表:基于所有文檔生成詞表(詞匯表)。
- 生成詞頻矩陣:每行表示一個文檔,每列表示一個詞,值為詞頻。
關鍵參數
參數 | 說明 |
stop_words | 過濾停用詞(如 "the", "is") |
max_features | 僅保留詞表中前 N 個高頻詞 |
ngram_range | 是否提取 N-gram(如 (1,2) 包含單詞和雙詞組合) |
token_pattern | 通過正則表達式控制分詞規則(如 r"(?u)\b\w\w+\b" 過濾單字詞)。 |
示例代碼
from sklearn.feature_extraction.text import CountVectorizer
?
corpus = ["I love machine learning.","Machine learning is fun!","I hate boring lectures."
]
?
# 初始化向量化器
vectorizer = CountVectorizer(stop_words="english")
# # 調整參數:禁用停用詞過濾,允許包含單字詞
# vectorizer = CountVectorizer(
# stop_words=None, # 不過濾停用詞
# token_pattern=r"(?u)\b\w+\b" # 允許單字詞(如 "I")
# )
X = vectorizer.fit_transform(corpus)
?
# 輸出詞表和詞頻矩陣
print("詞表:", vectorizer.get_feature_names_out())
print("詞頻矩陣:\n", X.toarray())
輸出
詞表: ['boring' 'fun' 'hate' 'learning' 'lectures' 'love' 'machine']
詞頻矩陣:[[0 0 0 1 0 1 1] # "love", "machine", "learning"[0 1 0 1 0 0 1] # "fun", "machine", "learning"[1 0 1 0 1 0 0]] # "boring", "hate", "lectures"
- 代碼中設置了?stop_words="english",因此常見停用詞(如 "I"、"is"、"." 等)被排除在詞表外
- 詞頻矩陣的列數嚴格等于詞表長度,每個列對應詞表中的一個詞,統計其在各文檔中的出現次數。
2. TfidfVectorizer(TF-IDF 向量化)
功能與原理
- 作用:在詞頻基礎上,計算 TF-IDF 值(詞頻-逆文檔頻率),衡量詞的重要性。
- 公式:
- TF (詞頻):詞在文檔中的出現頻率(頻數 / 詞表長度)。
- IDF (逆文檔頻率):log(總文檔數 / 包含該詞的文檔數)。
- TF-IDF:TF * IDF,降低常見詞的權重,突出重要詞。
關鍵參數
參數 | 說明 |
stop_words | 過濾停用詞(如 "the", "is") |
max_features | 僅保留詞表中前 N 個高頻詞 |
ngram_range | 是否提取 N-gram(如 (1,2) 包含單詞和雙詞組合) |
token_pattern | 通過正則表達式控制分詞規則(如 r"(?u)\b\w\w+\b" 過濾單字詞)。 |
use_idf | 是否啟用 IDF 計算(默認為 True) |
smooth_idf | 對 IDF 做平滑處理(避免除零錯誤) |
?
示例代碼
from sklearn.feature_extraction.text import TfidfVectorizer
?
corpus = ["I love machine learning.","Machine learning is fun!","I hate boring lectures."
]
?
# 初始化 TF-IDF 向量化器
vectorizer = TfidfVectorizer(stop_words="english")
X = vectorizer.fit_transform(corpus)
?
# 輸出 TF-IDF 矩陣
print("TF-IDF 矩陣:\n", X.toarray().round(2))
輸出
TF-IDF 矩陣:[[0. 0. 0. 0. 0.85 0.53] # "love" 和 "machine"("machine" 在多個文檔出現,權重較低)[0. 0.74 0. 0. 0. 0.67] # "fun" 和 "machine"[0.66 0. 0.52 0.52 0. 0. ]] # "boring", "hate", "lectures"
3. DictVectorizer(字典向量化)
功能與原理
- 作用:將 字典形式 的特征數據轉換為數值矩陣,支持混合類型特征(數值型 + 類別型)。
- 核心步驟:
關鍵參數
?
參數 | 說明 |
sparse | 是否返回稀疏矩陣(默認為 True) |
?
示例代碼
from sklearn.feature_extraction import DictVectorizer
?
data = [{"age": 25, "gender": "M", "city": "Beijing"},{"age": 30, "gender": "F", "city": "Shanghai"},{"age": 28, "gender": "M", "city": "Guangzhou"}
]
?
# 初始化向量化器
vectorizer = DictVectorizer(sparse=False)
X = vectorizer.fit_transform(data)
?
# 輸出特征名和矩陣
print("特征名:", vectorizer.get_feature_names_out())
print("數值矩陣:\n", X)
輸出
特征名: ['age', 'city=Beijing', 'city=Guangzhou', 'city=Shanghai', 'gender=F', 'gender=M']
數值矩陣:[[25. 1. 0. 0. 0. 1.] # age=25, city=Beijing, gender=M[30. 0. 0. 1. 1. 0.] # age=30, city=Shanghai, gender=F[28. 0. 1. 0. 0. 1.]] # age=28, city=Guangzhou, gender=M
對比總結
工具 | 輸入類型 | 核心功能 | 適用場景 |
CountVectorizer | 文本列表 | 生成詞頻矩陣 | 文本分類、詞頻分析 |
TfidfVectorizer | 文本列表 | 生成 TF-IDF 矩陣 | 文本分類、信息檢索 |
DictVectorizer | 字典列表 | 將混合類型特征轉換為數值矩陣 | 結構化數據(數值 + 類別特征) |
?
選擇建議
1.文本數據:
- 簡單詞頻統計 → CountVectorizer
- 需要評估詞重要性 → TfidfVectorizer
2. 結構化數據:
- 包含數值和類別特征 → DictVectorizer
3.高維稀疏數據:
- 優先使用 sparse=True 節省內存。