在這篇文章中,主要介紹的內容有:
1、將單詞轉換為特征向量
2、TF-IDF計算單詞關聯度
文本的預處理和分詞。
如何將單詞等分類數據轉成為數值格式,以方便我們後面使用機器學習來訓練模型。
壹、將單詞轉換為特征向量
詞袋模型(bag-of-words model):將文本以數值特征向量的形式來表示。主要通過兩個步驟來實現詞袋模型:
1、為整個文檔集(包含了許多的文檔)上的每個單詞創建壹個唯壹的標記。
2、為每個文檔構建壹個特征向量,主要包含每個單詞在文檔上的出現次數。
註意:由於每個文檔中出現的單詞數量只是整個文檔集中很少的壹部分,因此會有很多的單詞沒有出現過,就會被標記為0。所以,特征向量中大多數的元素就會為0,就會產生稀疏矩陣。
下面通過sklearn的CountVectorizer來實現壹個詞袋模型,將文檔轉換成為特征向量
通過count.vocabulary_我們可以看出每個單詞所對應的索引位置,每壹個句子都是由壹個6維的特征向量所組成。其中,第壹列的索引為0,對應單詞"and","and"在第壹和二條句子中沒有出現過,所以為0,在第三條句子中出現過壹些,所以為1。特征向量中的值也被稱為原始詞頻(raw term frequency)簡寫為tf(t,d),表示在文檔d中詞匯t的出現次數。
註意:在上面詞袋模型中,我們是使用單個的單詞來構建詞向量,這樣的序列被稱為1元組(1-gram)或單元組(unigram)模型。除了壹元組以外,我們還可以構建n元組(n-gram)。n元組模型中的n取值與特定的應用場景有關,如在反垃圾郵件中,n的值為3或4的n元組可以獲得比較好的效果。下面舉例說明壹下n元組,如在"the weather is sweet"這句話中,
1元組:"the"、"weather"、"is"、"sweet"。
2元組:"the weather"、"weather is"、"is sweet"。
在sklearn中,可以設置CountVecorizer中的ngram_range參數來構建不同的n元組模型,默認ngram_range=(1,1)。
sklearn通過CountVecorizer構建2元組
二、TF-IDF計算單詞關聯度
在使用上面的方法來構建詞向量的時候可能會遇到壹個問題:壹個單詞在不同類型的文檔中都出現,這種類型的單詞其實是不具備文檔類型的區分能力。我們通過TF-IDF算法來構建詞向量,從而來克服這個問題。
詞頻-逆文檔頻率(TF-IDF,term frequency-inverse document frequency):tf-idf可以定義為詞頻×逆文檔頻率
其中tf(t,d)表示單詞t在文檔d中的出現次數,idf(t,d)為逆文檔頻率,計算公式如下
其中,nd表示文檔的總數,df(t,d)表示包含單詞t的文檔d的數量。分母中加入常數1,是為了防止df(t,d)=0的情況,導致分母為0。取log的目的是保證當df(t,d)很小的時候,不會導致idf(t,d)過大。
通過sklearn的TfidfTransformer和CountVectorizer來計算tf-idf
可以發現"is"(第二列)和"the"(第六列),它們在三個句子中都出現過,它們對於文檔的分類所提供的信息並不會很多,所以它們的tf-idf的值相對來說都是比較小的。
註意:sklearn中的TfidfTransformer的TF-IDF的計算與我們上面所定義TF-IDF的公式有所不同,sklearn的TF-IDF計算公式
通常在計算TF-IDF之前,會對原始詞頻tf(t,d)做歸壹化處理,TfidfTransformer是直接對tf-idf做歸壹化。TfidfTransformer默認使用L2歸壹化,它通過與壹個未歸壹化特征向量L2範數的比值,使得返回向量的長度為1,計算公式如下:
下面通過壹個例子來說明sklearn中的TfidfTransformer的tf-idf的計算過程,以上面的第壹句話"The sun is shining"為例子
1、計算原始詞頻
a、單詞所對應的下標
b、計算第三句話的原始詞頻tf(t,d)
c、計算逆文檔頻率idf(t,d)
註意:其他的詞在計算tf-idf都是0,因為原始詞頻為0,所以就不需要計算idf了,log是以自然數e為底。
d、計算tf-idf
所以,第壹個句子的tf-idf特征向量為[0,1,1.29,1.29,0,1,0]
e、tf-idf的L2歸壹化