2012-03-04 75 views
0

我想要使用Lucene獲得基於Jaccard的分數。 我已經成功地獲得每個文檔的條款數量,我只需要找到每個文檔中找到的查詢條款數。 雖然搜索的Lucene的Javadoc我碰到在嘗試計算Lucene中的Jaccard係數時得到混合結果

score.freq() 

這種方法根據的Javadoc

返回當前文檔匹配的數量。這返回一個 浮點數(不是int),因爲SloppyPhraseScorer會根據匹配如何「馬虎」來折扣其頻率 。

我有一個非常簡單的文檔,我創建一個具有以下

貓貓貓狗鳥蛇測試它

當我查詢:貓狗

我得到了score.freq()等於2(這是預期的)

當我查詢:

我得到一個score.freq()等於3

任何人都知道爲什麼發生這種情況? 也用更大的查詢來測試它,並且我得到正確的結果。此外,當我的查詢語句(其中有1在文檔頻率) 我score.freq的(預期結果)等於1

預先感謝任何答案!

回答

1

Scorer.freq()是一個專家api,其結果取決於有問題的記分員。

您看到的差異是因爲布爾分數器的freq()表示匹配的匹配器數(例如布爾型分句),而對於術語分數器來說,它是該文檔中出現該匹配項的次數。

因此,您需要從正確的得分手(例如布爾得分手或其葉子)收集freq(),具體取決於您需要哪一個。在3.x版本中,這是一個訪問者API,但在4.x版本中,您可以通過getChildren()迭代地瀏覽記錄器層次結構。這通常是您在Collector.setNextReaderMethod中執行的一種操作,僅將參考保存到您關心的記分員,以便您的實際collect()速度非常快。

注:我覺得這是公平的,提及這個功能是非常新的和先進的,有一些錯誤。在某些情況下是可用的補丁,只是一直沒有寫上去好測試的時間:(

https://issues.apache.org/jira/browse/LUCENE-3505

https://issues.apache.org/jira/browse/LUCENE-2686