2012-07-01 70 views
0

我想正常化,我已經從這個給定的代碼得到了TFIDF結果:正火TF-IDF導致

for (int docNum = 0; docNum < ir.numDocs(); docNum++) { 
      TermFreqVector tfv = ir.getTermFreqVector(docNum, "contents"); 
      if (tfv == null) { 
       // ignore empty fields 
       continue; 
      } 
      String[] tterms = tfv.getTerms(); 
      int termCount = tterms.length; 
      int[] freqs = tfv.getTermFrequencies(); 
      for (int t = 0; t < termCount; t++) { 
       double idf = ir.numDocs()/ir.docFreq(new Term("contents", tterms[t])); 
       System.out.println(" " + tterms[t] + " " + freqs[t]*Math.log(idf)); 
      } 
     } 

輸出此代碼是:

area 0.0 
areola 5.877735781779639 
ari 3.9318256327243257 
art 1.6094379124341003 
artifici 1.0986122886681098 
assign 2.1972245773362196 
associ 3.295836866004329 
assur 1.9459101490553132 
averag 1.0986122886681098 
avoid 0.6931471805599453 
. 
. 
. 

任何幫助非常感謝。謝謝

+1

你的問題是什麼? –

+0

我想正常化我從這個給定的代碼得到的tfidf結果: – John

+3

TF-IDF **是**正常化。 –

回答

5

常用的方法是按文檔大小規範化。即代替使用項計數(或絕對頻率),您可以使用相對頻率。

freqsum是你的頻率數組的總和。然後使用

freqs[t]/(double)freqsum*Math.log(idf) 

爲了避免這種類型的混亂,我建議使用的術語:

  • 項計數爲「絕對頻率」
  • 相對頻率的字處理在文件比率

而不是含糊不清的術語「期限頻率「。

我知道歷史上,如果您查閱薩爾頓楊,關於自動索引(1973)中的術語值的說明,他們指的是絕對計數。餘弦相似性將會消除這個尺度,所以它在那裏並不重要。像Lucene這樣的現代系統會試圖更好地控制文檔的影響。

+0

只是爲了說清楚一點 - 所以你的意思是'freqsum'根據我上面的代碼是'termCount'?我只是想澄清抱歉的兄弟。 – John

+0

不,「termCount」是*不同*的數量,不是嗎?我在談論總數。考慮**相對詞頻率**並且應該清楚。 –

+0

這是正確的先生Anony? 'int [] freqs = tfv.getTermFrequencies();' 'double freqsum = Math.sqrt(freqs [i])/ tterms.length;' – John