熱線電話:13121318867

登錄
首頁精彩閱讀萬萬沒想到,TF-IDF是這么計算的
萬萬沒想到,TF-IDF是這么計算的
2022-03-14
收藏
萬萬沒想到,TF-IDF是這么計算的

作者:小伍哥

來源:小伍哥聊風控

一、了解tf-idf

對于文本處理,tf-idf的使用已經非常普遍,在sklearn等知名的機器學習開源庫中都提供了直接的調用,然而很多人并沒有搞清楚TF-IDF是怎么算出來的,也就無法對這種計算方法進行針對性的改進了。我之前也是稀里糊涂的,在各種開源庫隨手可得的Python年代“調包需謹慎”,不能讓自己成為只會調包的人,我們內功還是需要修煉的,計算之前,我們先了解下tf-idf的基本定義。

tf(term frequency:指的是某一個給定的詞語在該文件中出現的次數,這個數字通常會被歸一化(一般是詞頻除以該文件總詞數),以防止它偏向長的文件。

idf (inverse document frequency):反應了一個詞在所有文本(整個文檔)中出現的頻率,如果一個詞在很多的文本中出現,那么它的idf值應該低,而反過來如果一個詞在比較少的文本中出現,那么它的idf值應該高。
一個詞語的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。

下面我們看看大多數情況下,tf-idf 的定義:
TF的計算公式如下:

萬萬沒想到,TF-IDF是這么計算的

其中

萬萬沒想到,TF-IDF是這么計算的

是在某一文本中詞條w出現的次數,

萬萬沒想到,TF-IDF是這么計算的

是該文本總詞條數。

IDF的計算公式:

萬萬沒想到,TF-IDF是這么計算的

其中Y是語料庫的文檔總數,Yw是包含詞條w的文檔數,分母加一是為了避免

萬萬沒想到,TF-IDF是這么計算的

未出現在任何文檔中從而導致分母為

萬萬沒想到,TF-IDF是這么計算的

的情況。
TF-IDF的就是將TF和IDF相乘

萬萬沒想到,TF-IDF是這么計算的

從以上計算公式便可以看出,某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。

二、手算tf-idf

現在我們來看看,tf-idf到底怎么計算的,和我們手算的能不能對上。

在sklearn中,tf與上述定義一致,我們看看idf在sklearn中的定義,可以看到,分子分母都加了1,做了更多的平滑處理

smooth_idf=False

idf(t) = log [ n / df(t) ] + 1

smooth_idf=True

idf(t) = log [ (1 + n) / (1 + df(t)) ] + 1

下面我們手把手的計算出TF-IDF的值,使用的是sklearn官方的案例:

corpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?'] #初始化  vector = TfidfVectorizer() #tf-idf計算  tfidf = vector.fit_transform(corpus) #直接打印,得到的是一個稀疏矩陣,第1位表示文檔編號,第二位代表詞的編號  print(tfidf) (0, 1) 0.46979138557992045 (0, 2) 0.5802858236844359 (0, 6) 0.38408524091481483 (0, 3) 0.38408524091481483 (0, 8) 0.38408524091481483 (1, 5) 0.5386476208856763 (1, 1) 0.6876235979836938 (1, 6) 0.281088674033753 (1, 3) 0.281088674033753 (1, 8) 0.281088674033753 (2, 4) 0.511848512707169 (2, 7) 0.511848512707169 (2, 0) 0.511848512707169 (2, 6) 0.267103787642168 (2, 3) 0.267103787642168 (2, 8) 0.267103787642168 (3, 1) 0.46979138557992045 (3, 2) 0.5802858236844359 (3, 6) 0.38408524091481483 (3, 3) 0.38408524091481483 (3, 8) 0.38408524091481483

通過vocabulary_屬性,可以查看每個詞對應的數字編號,就可以與上面的矩陣對應起來了

vector.vocabulary_ {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4}

通過上面的字典和矩陣可以知道,第一個文檔'This is the first document'的tf-idf 值如下

(0, 1) 0.46979138557992045 document (0, 2) 0.58028582368443590 first (0, 6) 0.38408524091481483 the (0, 3) 0.38408524091481483 is (0, 8) 0.38408524091481483 this

document first the is this

0.46979 0.58028 0.384085 0.38408 0.384085


我們手動計算來驗證下:

tf 計算

對于第一個文檔,有5個不同的詞,每個詞的詞頻為:tf= 1/5

idf計算

document:log((1+N)/(1+N(document)))+1= log((1+4)/(1+3))+1 = 1.2231435 first   :log((1+N)/(1+N(first)))+1 = log((1+4)/(1+2))+1 = 1.5108256 the     :log((1+N)/(1+N(the )))+1 = log((1+4)/(1+4))+1 = 1.0 is      :log((1+N)/(1+N(is )))+1 = log((1+4)/(1+4))+1 = 1.0 this :log((1+N)/(1+N(this)))+1 = log((1+4)/(1+4))+1 = 1.0
萬萬沒想到,TF-IDF是這么計算的

tf-idf計算

1.2231435*1/5 = 0.24462869 1.5108256*1/5 = 0.30216512 1.0*1/5 = 0.2 1.0*1/5 = 0.2 1.0*1/5 = 0.2

得到我們手工計算的tf-idf

萬萬沒想到,TF-IDF是這么計算的

和我們sklearn計算的

萬萬沒想到,TF-IDF是這么計算的

答案并不對,哪里出了問題呢?我們仔細看看原來的代碼,因為sklearn做了歸一化,我們按同樣的方法進行歸一化計算如下:

計算每個tf-idf 的平方根

(0.24462869**2 + 0.30216512**2 + 0.2**2 + 0.2**2 + 0.2**2)**0.5 = 0.5207177313

對每個值除以平方根

0.24462869/0.5207177313244965 = 0.4697913577434035 0.30216512/0.5207177313244965 = 0.5802858282382923 0.20000000/0.5207177313244965 = 0.3840852499708055 0.20000000/0.5207177313244965 = 0.3840852499708055 0.20000000/0.5207177313244965 = 0.3840852499708055

這樣一看,就和我們的sklearn計算的一致了,到此,我們也算是學會了計算tf-idf值了,加深了對該方法的理解,以便于后期的算法調用,心里有貨,才不懼未知。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢