2017-06-13 634 views
0

我有一個來自ISI論文的tf-idf示例。我試圖通過這個例子驗證我的代碼。但是我從我的代碼中得到了不同的結果。我不知道原因是什麼!從紙使用gensim的Tf-idf計算

期限 - 文檔矩陣:

acceptance  [ 0 0.4 0 0.3 0.7 0 
information  0 0.7 0 0.5 0 0 
media   0.3 0 0.2 0 0 1 
model   0 0 0.6 0.5 0 0 
selection  0.9 0 0.6 0 0 0 
technology  0 0.4 0 0.3 0.7 0] 

我的TF-IDF矩陣:

acceptance  [ 0 0.4 0 0.3 0.7 0 
information  0 0.7 0 0.5 0 0 
media   0.5 0 0.4 0 0 1 
model   0 0 0.6 0.5 0 0 
selection  0.8 0 0.6 0 0 0 
technology  0 0.4 0 0.3 0.7 0] 

我的代碼:

從紙

acceptance  [ 0 1 0 1 1 0 
information  0 1 0 1 0 0 
media   1 0 1 0 0 2 
model   0 0 1 1 0 0 
selection  1 0 1 0 0 0 
technology  0 1 0 1 1 0] 

TF-IDF矩陣

tfidf = models.TfidfModel(corpus) 
corpus_tfidf=tfidf[corpus] 

我嘗試另一個像這樣的代碼:

transformer = TfidfTransformer() 
tfidf=transformer.fit_transform(counts).toarray() ##counts is term-document matrix 

但是,正如你提到的是,有許多方法來計算TF我沒有得到合適的答案

+0

什麼是你的語料庫? –

+0

@Mahmood Kohansal - 詞典:'{u'media':0,u'technolog':3,u'accept':4,u'inform':2,u'model':5,u'select': (1,1)'和語料庫:[[(0,1),(1,1)],[(2,1),(3,1),(4,1)],[(0,1),( (1,1,1),(5,1)],[(2,1),(3,1),(4,1),(5,1)],[(3,1),(4,1) ],[(0,2)]]' – mahshid

回答

0

結果之間的這種差異的原因-IDF在論文中。如果讀Wikipedia TF-IDF page它提到,TF-IDF作爲

TFIDF(T,d,d)= TF計算(T,d)。 idf(t,D)

並且tf(t,d)和idf(t,D)都可以用改變TF_IDF值的最後結果的不同函數來計算。實際上,功能在不同的應用程序中的使用是不同的。

Gensim TF-IDF Model可以計算tf(t,d)和idf(t,D)的任何函數,如其文檔中所述。

計算TF-IDF乘以本地組件(詞頻)與 全局分量(逆文檔頻率),和歸一化所得的 文件單元長度。公式中的文件Ĵ 學期我的非標準化重量d文檔的文集:

weight_{i,j} = frequency_{i,j} * log_2(D/document_freq_{i})

,或者更一般地說:

weight_{i,j} = wlocal(frequency_{i,j}) * wglobal(document_freq_{i}, D)

這樣你就可以在自己的自定義wlocal塞和全球功能。

默認爲wlocal是身份(其他選項:math.sqrt,math.log1p, ...)和默認wglobal是log_2(total_docs/doc_freq),得到 上述公式。

現在,如果您想要達到完全的紙張結果,您必須知道它用於計算TF-IDF矩陣的函數。

另外在Gensim google group中有一個很好的例子,它顯示瞭如何使用自定義函數來計算TF-IDF。

+0

您是否認爲此答案有幫助? –

+0

謝謝你的回答。我之前猜到這是因爲算法,但我嘗試了3或4種不同的算法,並且我無法得到所提到的答案......對我來說這很奇怪的事情是,對tf-idf使用任何算法都不會導致完全文本聚類的最終答案不同!但每次我改變tf-idf算法,我都會得到不同的簇! (我使用SVD來提取因子) – mahshid

+0

我認爲答案對tf-idf方法的依賴性很明顯。無論如何,如果你認爲正確,你可以接受答案。 –