2012-02-27 64 views
3

從我從網上找到的文檔中找出用於確定語料庫中詞語的詞頻和反文檔頻率權重的表達式爲如何在python中的gensim工具中實現TF-IDF?

tf-idf(wt)= tf * log( | N |/d);

我正在通過gensim中提到的tf-idf的實現。 文檔中給出的例子是

>>> doc_bow = [(0, 1), (1, 1)] 
>>> print tfidf[doc_bow] # step 2 -- use the model to transform vectors 
[(0, 0.70710678), (1, 0.70710678)] 

,這顯然不符合標準執行TF-IDF的。 這兩個模型有什麼區別?

注:0.70710678是通常在特徵值計算中使用的值2 ^( - 1/2)。 那麼特徵值如何進入TF-IDF模型呢?

回答

4

維基百科:

給定的文檔中的項數僅僅是一個給定的詞出現在該文件中的次數。 此計數通常是標準化,以防止對較長文檔偏置(這可以在文檔中有較高的長期計數,無論是長期的實際重要性)

gensim source線126-127:

if self.normalize: 
     vector = matutils.unitvec(vector) 
0

在一包單詞(doc_bow),t0和t1中有兩個令牌。我們不知道t0和t1是出現在文檔中還是出現在兩個文檔中。我們甚至不知道模型(tfidf)是否建立在包含令牌的文檔上。該包,doc_bow只是一個查詢(測試數據),並且該模型是由訓練數據構建而成的,該訓練數據可能包含或不包含任何t0或t1。

所以我們來做一個假設。 tfidf建立在2個文件d0和d1上,而d0包含t0,d1包含t1。因此,文檔總數(N)爲2,t0和t1的期限頻率和文檔頻率變爲1.

Gensim使用對數基2作爲默認值(參考df2idf函數)和轉換後的tfidf向量doc_bow會像[(0,1),(0,1)]。 (例如tfidf(t0)= 1 * log_2(| 2 |/1)= 1)

另外,我們需要考慮默認執行的L2標準化,最終輸出變爲[(0,1/2^(1/2)),(0,1/2 ^(1/2))]。