特征選擇
1、TF-IDF原理
TF-IDF(Term Frequency-Inverse Document Frequency)是一種統(tǒng)計(jì)方法茵汰,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語料庫中的其中一份文件的重要程度蹂午。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語料庫中出現(xiàn)的頻率成反比下降豆胸。
在一份給定的文件里配乱,詞頻 (Term Frequency, TF)指的是某一個(gè)給定的詞語在該文件中出現(xiàn)的次數(shù)。這個(gè)數(shù)字通常會(huì)被歸一化(分子一般小于分母 區(qū)別于IDF)搬泥,以防止它偏向長的文件。(同一個(gè)詞語在長文件里可能會(huì)比短文件有更高的詞頻尉尾,而不管該詞語重要與否燥透。)
逆向文件頻率 (Inverse Document Frequency, IDF)是一個(gè)詞語普遍重要性的度量。某一特定詞語的IDF肢藐,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目吱韭,再將得到的商取對(duì)數(shù)得到。
上面的公式已經(jīng)可以使用了痘煤,但是在一些特殊的情況會(huì)有一些小問題猿规,比如某一個(gè)生僻詞在語料庫中沒有,這樣我們的分母為0蘸拔, IDF沒有意義了。所以常用的IDF我們需要做一些平滑调窍,使語料庫中沒有出現(xiàn)的詞也可以得到一個(gè)合適的IDF值陨晶。平滑的方法有很多種帝璧,最常見的IDF平滑后的公式之一為:
有了IDF的定義,我們就可以計(jì)算某一個(gè)詞的TF-IDF值了:
2褐耳、互信息
一般地渴庆,兩個(gè)離散隨機(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ù)砰诵。如果對(duì)數(shù)以 2 為基底捌显,互信息的單位是bit。
直觀上理肺,互信息度量 X 和 Y 共享的信息:它度量知道這兩個(gè)變量其中一個(gè)击罪,對(duì)另一個(gè)不確定度減少的程度。例如媳禁,如果 X 和 Y 相互獨(dú)立竣稽,則知道 X 不對(duì) Y 提供任何信息霍弹,反之亦然娃弓,所以它們的互信息為零。在另一個(gè)極端台丛,如果 X 是 Y 的一個(gè)確定性函數(shù)挽霉,且 Y 也是 X 的一個(gè)確定性函數(shù),那么傳遞的所有信息被 X 和 Y 共享:知道 X 決定 Y 的值侠坎,反之亦然。因此他嫡,在此情形互信息與 Y(或 X)單獨(dú)包含的不確定度相同庐完,稱作 Y(或 X)的熵。而且署咽,這個(gè)互信息與 X 的熵和 Y 的熵相同生音。(這種情形的一個(gè)非常特殊的情況是當(dāng) X 和 Y 為相同隨機(jī)變量時(shí)。)
互信息是 X 和 Y 的聯(lián)合分布相對(duì)于假定 X 和 Y 獨(dú)立情況下的聯(lián)合分布之間的內(nèi)在依賴性慕匠。 于是互信息以下面方式度量依賴性:I(X; Y) = 0 當(dāng)且僅當(dāng)X 和 Y 為獨(dú)立隨機(jī)變量域醇。從一個(gè)方向很容易看出:當(dāng) X 和 Y 獨(dú)立時(shí),p(x,y) = p(x) p(y)锅铅,因此:
此外减宣,互信息是非負(fù)的(即 I(X;Y) ≥ 0),而且是對(duì)稱的(即 I(X;Y) = I(Y;X))贼邓。
互信息又可以等價(jià)地表示成:
其中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