sklearn: CountVectorize處理及一些使用參數
CountVectorizer是屬於常見的特征數值計算類,是一個文本特征提取方法。對於每一個訓練文本,它只考慮每種詞匯在該訓練文本中出現的頻率。
CountVectorizer會將文本中的詞語轉換為詞頻矩陣,它通過fit_transform函數計算各個詞語出現的次數。
CountVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=None,
strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
tokenizer=None, vocabulary=None)
CountVectorizer類的參數很多,分為三個處理步驟:preprocessing、tokenizing、n-grams generation.
一般要設置的參數是:ngram_range,max_df,min_df,max_features,analyzer,stop_words,token_pattern等,具體情況具體分析 。
- ngram_range : 例如ngram_range(min,max),是指將text分成min,min+1,min+2,.........max 個不同的詞組。比如 '我 愛 中國' 中ngram_range(1,3)之后可得到'我' '愛' '中國' '我 愛' '愛 中國' 和'我 愛 中國',如果是ngram_range (1,1) 則只能得到單個單詞'我' '愛'和'中國'。
- max_df:可以設置為范圍在[0.0 1.0]的float,也可以設置為沒有范圍限制的int,默認為1.0。 這個參數的作用是作為一個閾值,當構造語料庫的關鍵詞集的時候,如果某個詞的document frequence大於max_df,這個詞不會被當作關鍵詞。如果這個參數是float,則表示詞出現的次數與語料庫文檔數的百分比,如果是int,則表示詞出現的次數。如果參數中已經給定了vocabulary,則這個參數無效。
- min_df: 類似於max_df,不同之處在於如果某個詞的document frequence小於min_df,則這個詞不會被當作關鍵詞。
- max_features:默認為None,可設為int,對所有關鍵詞的term frequency進行降序排序,只取前max_features個作為關鍵詞集。
- analyzer:一般使用默認,可設置為string類型,如’word’, ‘char’, ‘char_wb’,還可設置為callable類型,比如函數是一個callable類型。
- stop_words:設置停用詞,設為english將使用內置的英語停用詞,設為一個list可自定義停用詞,設為None不使用停用詞,設為None且max_df∈[0.7, 1.0)將自動根據當前的語料庫建立停用詞表。
- token_pattern:過濾規則,表示token的正則表達式,需要設置analyzer == ‘word’,默認的正則表達式選擇2個及以上的字母或數字作為token,標點符號默認當作token分隔符,而不會被當作token。
- decode_error:默認為strict,遇到不能解碼的字符將報UnicodeDecodeError錯誤,設為ignore將會忽略解碼錯誤,還可以設為replace,作用尚不明確。
- binary:默認為False,一個關鍵詞在一篇文檔中可能出現n次,如果binary=True,非零的n將全部置為1,這對需要布爾值輸入的離散概率模型的有用的。
實例:
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['我 愛 中國 中國','爸爸 媽媽 愛 我','爸爸 媽媽 愛 中國']
# corpus = ['我愛中國','爸爸媽媽愛我','爸爸媽媽愛中國']
vectorizer = CountVectorizer(min_df=1, ngram_range=(1, 1)) ##創建詞袋數據結構,里面相應參數設置
features = vectorizer.fit_transform(corpus) #擬合模型,並返回文本矩陣
print("CountVectorizer:")
print(vectorizer.get_feature_names()) #顯示所有文本的詞匯,列表類型
#詞表
#['中國', '媽媽', '爸爸']
print(vectorizer.vocabulary_) #詞匯表,字典類型
#key:詞,value:對應編號
#{'中國': 0, '爸爸': 2, '媽媽': 1}
print(features) #文本矩陣
#第一行 (0, 0) 2 表示為:第0個列表元素,**詞典中索引為0的元素**, 詞頻為2
# (0, 0) 2
# (1, 1) 1
# (1, 2) 1
# (2, 1) 1
# (2, 2) 1
# (2, 0) 1
print(features.toarray()) #.toarray() 是將結果轉化為稀疏矩陣
#將結果轉化為稀疏矩陣
#[[2 0 0]
# [0 1 1]
# [1 1 1]]
print(features.toarray().sum(axis=0)) #統計每個詞在所有文檔中的詞頻
#文本中的詞頻
#[3 2 2]