1. 程式人生 > >機器學習筆記 (四)Scikit-learn CountVectorizer 與 TfidfVectorizer

機器學習筆記 (四)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)