1.TF-IDF原理
TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜尋引擎應用,作爲文件與用戶查詢之間相關程度的度量或評級。除了TF-IDF以外,因特網上的搜尋引擎還會使用基於連結分析的評級方法,以確定文件在搜尋結果中出現的順序。
在一份給定的文件裏,詞頻(term frequency,TF)指的是某一個給定的詞語在該文件中出現的頻率。這個數字是對詞數(term count)的歸一化,以防止它偏向長的文件。(同一個詞語在長文件裏可能會比短文件有更高的詞數,而不管該詞語重要與否。)對於在某一特定文件裏的詞語來說,它的重要性可表示爲:
以上式子中 是該詞在文件中的出現次數,而分母則是在文件中所有字詞的出現次數之和。
逆向文件頻率(inverse document frequency,IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到:
其中,
然後
某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。
總之,通過TF-IDF的向量化方法,可以將每個詞向量化成一個表示權重的小數,而不是0,1向量了,它已經帶有了文本的信息了(每個詞都帶上了TF-IDF信息,而TF-IDF的作用就是保留詞在文檔中的權重信息,這就相當於保留了文本的信息)。
2.IF-IDF實例計算
使用以下4個文件內容爲例:
文件 | 分詞結果 |
---|---|
網絡無法連接 | 網絡,無法,連接 |
無法連接網絡 | 無法,連接,網絡 |
所有網頁速度慢 | 所有,網頁,速度慢 |
網絡連接掉線 | 網絡,連接,掉線 |
IF(網絡)=1/3
IDF(網絡)=ln(4/3)
TF-IDF(網絡)=1/3 * ln(4/3) = 1/3 * 0.287682 = 0.095894024
IF(掉線)=1/3
IDF(掉線)=ln(4/1)
TF-IDF(掉線)=1/3 * ln(4/1) = 1/3 * 1.386294361 = 0.46209812
經計算,得到:
詞語 | 網絡 | 無法 | 連接 | 所有 | 網頁 | 速度慢 | 掉線 |
---|---|---|---|---|---|---|---|
IF-IDF | 0.0959 | 0.2310 | 0.0959 | 0.4621 | 0.4621 | 0.4621 | 0.4621 |
得到矩陣:
詞語/文件 | 所有 | 掉線 | 無法 | 網絡 | 網頁 | 連接 | 速度慢 |
---|---|---|---|---|---|---|---|
網絡無法連接 | 0 | 0 | 0.2310 | 0.0959 | 0 | 0.0959 | 0 |
無法連接網絡 | 0 | 0 | 0.2310 | 0.0959 | 0 | 0.0959 | 0 |
所有網頁速度慢 | 0.4621 | 0 | 0 | 0 | 0.4621 | 0 | 0.4621 |
網絡連接掉線 | 0 | 0.4621 | 0 | 0.0959 | 0 | 0.0959 | 0 |
針對上述的計算結果,再使用如下公式進行規範化矩陣
如“網絡無法連接”中的詞“網絡”進行規範後的值爲:
得到各短語的向量:
詞語/文件 | 所有 | 掉線 | 無法 | 網絡 | 網頁 | 連接 | 速度慢 |
---|---|---|---|---|---|---|---|
網絡無法連接 | 0 | 0 | 0.862 | 0.358 | 0 | 0.358 | 0 |
無法連接網絡 | 0 | 0 | 0.862 | 0.358 | 0 | 0.358 | 0 |
所有網頁速度慢 | 0.577 | 0 | 0 | 0 | 0.577 | 0 | 0.577 |
網絡連接掉線 | 0 | 0.960 | 0 | 0.199 | 0 | 0.199 | 0 |
上述計算使用的IDF計算公式是
得各詞語的tf-idf爲:
詞語 | 網絡 | 無法 | 連接 | 所有 | 網頁 | 速度慢 | 掉線 |
---|---|---|---|---|---|---|---|
IF-IDF | 0.408 | 0.504 | 0.408 | 0.639 | 0.639 | 0.639 | 0.639 |
各短語的矩陣:
詞語/文件 | 所有 | 掉線 | 無法 | 網絡 | 網頁 | 連接 | 速度慢 |
---|---|---|---|---|---|---|---|
網絡無法連接 | 0 | 0 | 0.504 | 0.408 | 0 | 0.408 | 0 |
無法連接網絡 | 0 | 0 | 0.504 | 0.408 | 0 | 0.408 | 0 |
所有網頁速度慢 | 0.639 | 0 | 0 | 0 | 0.639 | 0 | 0.639 |
網絡連接掉線 | 0 | 0.639 | 0 | 0.408 | 0 | 0.408 | 0 |
規範後的結果:
詞語/文件 | 所有 | 掉線 | 無法 | 網絡 | 網頁 | 連接 | 速度慢 |
---|---|---|---|---|---|---|---|
網絡無法連接 | 0 | 0 | 0.658 | 0.533 | 0 | 0.533 | 0 |
無法連接網絡 | 0 | 0 | 0.658 | 0.533 | 0 | 0.533 | 0 |
所有網頁速度慢 | 0.577 | 0 | 0 | 0 | 0.577 | 0 | 0.577 |
網絡連接掉線 | 0 | 0.742 | 0 | 0.474 | 0 | 0.474 | 0 |
3.利用sklearn實現對文本向量化
'''
TF-IDF的實現過程
'''
import pandas as pd
text =pd.DataFrame(["網絡,無法,連接",
"無法,連接,網絡",
"所有,網頁,速度慢",
"網絡,連接,掉線",
])
##方法一:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(text[0]))
tfidf=tfidf.toarray()
#方法二:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1,binary = False,decode_error = 'ignore')
vectorizer_2 = vectorizer.fit_transform(text[0]).toarray()
通過TF-IDF計算,得到各短語的向量矩陣:
網絡無法連接 –>[0,0,0.658,0.533,0,0.533,0]
無法連接網絡–>[0,0,0.658,0.533,0,0.533,0]
所有網頁速度慢–>[0.577,0,0,0, 0.577,0,0.577]
網絡連接掉線–>[0,0.742,0,0.474,0,0.474,0]
這裏詞頻的計算使用的是sklearn的TfidfVectorizer。這個類繼承於CountVectorizer,在後者基本的詞頻統計基礎上增加了如TF-IDF之類的功能。
最後需要說明的是,我們會發現這裏計算的結果跟我們之前計算不太一樣。由於函數 TfidfVectorizer() 有很多參數,不同的參數計算idf的公式不一樣,我們這裏僅僅採用了默認的形式,所以輸出的結果可能與採用前面介紹的(最基本最原始的)算法所得出之結果有所差異(但數量的大小關係並不會改變)。
1)參數(默認設置):
TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
使用的計算公式爲:
(公式中的log表示以e爲底的對數)
2)參數設置:smooth_idf=False
使用的計算公式爲:
參考文獻:
[1] http://scikit-learn.org/stable/modules/feature_extraction.html
[2] http://www.cnblogs.com/biyeymyhjob/archive/2012/07/17/2595249.html