2012-04-16 69 views
2

我有一個查詢和一組文檔。我需要根據與tf-idf的餘弦相似性對這些文檔進行排序。有人可以告訴我,我可以從Lucene得到什麼樣的支持來計算它嗎?我可以直接從Lucene中計算出什麼參數(我可以通過lucene中的某種方法直接獲得tf,idf?)以及如何計算與Lucene的餘弦相似度(如果我傳遞查詢的兩個向量,是否有任何函數直接返回餘弦相似度,文件?)如何使用Lucene和Java計算與tf-idf的餘弦相似度

Thanx提前

回答

4

Lucene的已經使用餘弦相似度的一個拉皮條的版本,所以如果你需要的原料CS本身,它可能是可行的。我建議討論Lucene評分的official page

如果你想提取對自己的這些信息,這將是該步驟的大綱TF

  1. 指數語料庫;
  2. open an IndexReader;
  3. 迭代所有文檔ID,0到maxDoc();
  4. getTermFreqVector(doc, fieldName);
  5. 遍歷並行數組tfv.getTerms()tfv.getTermFrequencies()

對於docFreq,使用IndexReader.terms()和遍歷這個調用termEnum.docFreq()

+0

我需要計算tf-idf值,然後計算餘弦相似度。我找不到任何示例代碼。 – Paba 2012-04-16 13:30:22

+1

請參見[here。](http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/core/org/apache/lucene/search/DefaultSimilarity.html)這是您分配給的策略對象IndexSearcher所以它將使用它來獲得tf和idf,最後是queryNorm。您還需要通過將相似度分配給索引器並實現computeNorm來控制索引時間字段規範。這不像計算餘弦相似性那樣直截了當,原因在於這是計算的高性能實現,分爲索引時間和查詢時間。 – 2012-04-16 14:04:31

+0

Thanx Marko。但是我有一個大問題,就是如何計算詞頻和文檔頻率。是否有任何方法通過傳遞文檔語料庫來獲得詞頻和文檔頻率? – Paba 2012-04-17 08:31:06