特征選擇
1、TF-IDF原理
TF-IDF(Term Frequency-Inverse Document Frequency)是一種統(tǒng)計(jì)方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。
在一份給定的文件里,詞頻 (Term Frequency, TF)指的是某一個給定的詞語在該文件中出現(xiàn)的次數(shù)。這個數(shù)字通常會被歸一化(分子一般小于分母 區(qū)別于IDF),以防止它偏向長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞頻,而不管該詞語重要與否。)
逆向文件頻率 (Inverse Document Frequency, IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取對數(shù)得到。
上面的公式已經(jīng)可以使用了,但是在一些特殊的情況會有一些小問題,比如某一個生僻詞在語料庫中沒有,這樣我們的分母為0, IDF沒有意義了。所以常用的IDF我們需要做一些平滑,使語料庫中沒有出現(xiàn)的詞也可以得到一個合適的IDF值。平滑的方法有很多種,最常見的IDF平滑后的公式之一為:
有了IDF的定義,我們就可以計(jì)算某一個詞的TF-IDF值了:
2、互信息
一般地,兩個離散隨機(jī)變量 X 和 Y 的互信息可以定義為:
p(x,y)是X和Y的聯(lián)合概率分布函數(shù),p(x)和p(y)分別是X和Y的邊緣概率分布函數(shù)。
在連續(xù)隨機(jī)變量的情形下,求和被替換成了二重積分:
p(x,y)是X和Y的聯(lián)合概率密度函數(shù),p(x)和p(y)分別是X和Y的邊緣概率密度函數(shù)。如果對數(shù)以 2 為基底,互信息的單位是bit。
直觀上,互信息度量 X 和 Y 共享的信息:它度量知道這兩個變量其中一個,對另一個不確定度減少的程度。例如,如果 X 和 Y 相互獨(dú)立,則知道 X 不對 Y 提供任何信息,反之亦然,所以它們的互信息為零。在另一個極端,如果 X 是 Y 的一個確定性函數(shù),且 Y 也是 X 的一個確定性函數(shù),那么傳遞的所有信息被 X 和 Y 共享:知道 X 決定 Y 的值,反之亦然。因此,在此情形互信息與 Y(或 X)單獨(dú)包含的不確定度相同,稱作 Y(或 X)的熵。而且,這個互信息與 X 的熵和 Y 的熵相同。(這種情形的一個非常特殊的情況是當(dāng) X 和 Y 為相同隨機(jī)變量時。)
互信息是 X 和 Y 的聯(lián)合分布相對于假定 X 和 Y 獨(dú)立情況下的聯(lián)合分布之間的內(nèi)在依賴性。 于是互信息以下面方式度量依賴性:I(X; Y) = 0 當(dāng)且僅當(dāng)X 和 Y 為獨(dú)立隨機(jī)變量。從一個方向很容易看出:當(dāng) X 和 Y 獨(dú)立時,p(x,y) = p(x) p(y),因此:
此外,互信息是非負(fù)的(即 I(X;Y) ≥ 0),而且是對稱的(即 I(X;Y) = I(Y;X))。
互信息又可以等價地表示成:
其中H(X)和H(Y)是邊緣熵,H(X|Y) 和 H(Y|X) 是條件熵,而 H(X,Y) 是 X 和 Y 的聯(lián)合熵。注意到這組關(guān)系和并集、差集和交集的關(guān)系類似,于是用Venn圖表示。

3、TF-IDF代碼應(yīng)用
在scikit-learn中,有兩種方法進(jìn)行TF-IDF的預(yù)處理。第一種方法是在用CountVectorizer類向量化之后再調(diào)用TfidfTransformer類進(jìn)行預(yù)處理。
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
print(tfidf)
第二種方法是直接用TfidfVectorizer完成向量化與TF-IDF預(yù)處理。
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)
參考鏈接:
https://www.cnblogs.com/pinard/p/6693230.html
https://zh.wikipedia.org/wiki/%E4%BA%92%E4%BF%A1%E6%81%AF