機器學習筆記 (四)Scikit-learn CountVectorizer 與 TfidfVectorizer
Scikit-learn CountVectorizer 與 TfidfVectorizer
在文字分類問題中,我們通常進行特徵提取,這時,我們需要利用到要介紹的工具,或者其他工具。文字的特徵提取特別重要,體現這個系統做的好壞,分類的準確性,文字的特徵需要自己構建,常用的有 n-gram 模型
,ti-idf 模型
。但是這些模型共同的特點就是太稀疏了。一般情況下需要 降維
,比如 SVD
,其實很多模型也可以用來進行特徵選擇比如 決策樹
,L1 正則
也可以用來進行特徵選擇,具體原理這裡就不講了。sklearn
這個強大的工具幫我們實現了很多演算法,超級好用。
CountVectorizer 與 TfidfVectorizer,這兩個類都是特徵數值計算的常見方法。對於每一個訓練文字,CountVectorizer 只考慮每種詞彙在該訓練文字中出現的頻率,而TfidfVectorizer 除了考量某一詞彙在當前訓練文字中出現的頻率之外,同時關注包含這個詞彙的其它訓練文字數目的倒數。相比之下,訓練文字的數量越多,TfidfVectorizer 這種特徵量化方式就更有優勢。
CountVectorizer
例:
#python2.7 sklearn version 0.18.1 from sklearn.feature_extraction.text import CountVectorizer X_test = ['I sed about sed the lack', 'of any Actually'] count_vec=CountVectorizer(stop_words=None) print count_vec.fit_transform(X_test).toarray() print '\nvocabulary list:\n\n',count_vec.vocabulary_ >> >> [[1 0 0 1 1 0 2 1] [0 1 1 0 0 1 0 0]] (0, 4) 1 (0, 7) 1 (0, 0) 1 (0, 6) 2 (0, 3) 1 (1, 1) 1 (1, 2) 1 (1, 5) 1 vocabulary list: {u'about': 0, u'i': 3, u'of': 5, u'lack': 4, u'actually': 1, u'sed': 6, u'the': 7, u'any': 2}
TfidfVectorizer
tf-idf
首先介紹一下如何計算tf-idf,並且需要明確的是tf-idf=tf*idf,也就是說tf與idf分別是兩個不同的東西。其中tf為謀個訓練文字中,某個詞的出現次數,即詞頻(Term Frequency);idf為逆文件頻率(Inverse Document Frequency),對於詞頻的權重調整係數。
其中:
詞頻(TF)=某個詞在文章中的出現次數
考慮到文章有長短之分,為了便於不同文章的比較,進行”詞頻”標準化。
\begin{align*} 詞頻(TF)=\frac{某個詞在文章中的出現次數}{文章的總詞數} \end{align*} 或者 詞頻(TF)=某個詞在文章中的出現次數該訓練文字中出現最多次的詞數詞頻(TF)=某個詞在文章中的出現次數文章的總詞數或者詞頻(TF)=某個詞在文章中的出現次數該訓練文字中出現最多次的詞數 \begin{align*} &詞頻(TF)=\frac{某個詞在文章中的出現次數}{文章的總詞數}\[1ex] &或者\[1ex] &詞頻(TF)=\frac{某個詞在文章中的出現次數}{該訓練文字中出現最多次的詞數} \end{align*}
逆文件頻率(IDF)=log(總樣本數包含有該詞的文件數+1)