翻譯:Lucene Similarity (Lucene 文檔評分score機制詳解)[轉]

2008-11-28 19:09

文檔的分值代表了該文檔在特定查詢詞下對應的相關性高低,他關聯着信息檢索向量空間模型中的向量夾角的接近度。一個文檔越與查詢詞相關,得分越高。分值計算公式如下:

score(q,d)   =   coord(q,d) · queryNorm(q) ·   ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )
                                                                      t in q  

其中

tf(t in d)

這個值衡量着Term在文檔中出現的頻率,也就是詞頻。關鍵詞在文檔中出現的次數越多,得分越高,這個值在DefaultSimilarity的計算公式如下(詞頻的平方根):

tf(t in d)   =    frequency½

idf(t)

代表着該詞的逆詞頻,這個值衡量了該詞在整個文檔庫中出現的頻度。這意味着,一個詞出現的越少,根據香農的信息公示,他越珍稀。同時將貢獻更多的分值給總分值。默認的計算公式如下(其中numDocs代表整個文檔的數量,docFreq代表了含有Term t的文檔數量):

                                   numDocs
idf(t) =    1 + log    ( –––––––––   )  
                                  docFreq+1

coord(q,d)

這個分值衡量了文檔中含有多少Term。文檔中出現的越多,越全,將獲得越高的分值。舉個例來說,查詢“lucene”和"Apache",同時出現兩個Term的肯定比只出現一個lucene或者Apache的分值高。這個值是搜索時動態計算的,默認的計算公式如下:

coord(q,d) = overlap / maxOverlap

queryNorm(q)

這個標準化因子用於在多個查詢器中進行比較。它並不影響文檔的排名。它的主要作用在於多個查詢器返回的結果進行比較,甚至是結果來自多個索引時。這是搜索時的權重因子,當給查詢器設置權重時就是通過這個因子進行影響的。默認的實現公式如下:

                                                                                                           1
queryNorm(q)   =   queryNorm(sumOfSquaredWeights)   =   ––––––––––––––
                                                                                         sumOfSquaredWeights½

其中的sumOfSquaredWeights的計算公式如下:(可以清晰的看到獲取query的boost,當沒給查詢器設置值時,默認爲1,不起作用)

sumOfSquaredWeights   =   q.getBoost() 2 ·   ∑ ( idf(t) · t.getBoost() ) 2  
                                                                      t in q

t.getBoost()

該值是一個搜索時權重因子,可以在查詢時給不同的Term設置不同的權重,可以通過lucene語法(具體參見我翻譯的另外一篇文章:hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html),也可以通過setBost()函數,注意,在多Term查詢器中,是沒有獲取單一Term權重的函數的,所以如果需要獲取,只能調用相應的子查詢器函數的getBoost()函數。

norm(t,d)

封裝了一些索引時因子以及長度因子。
Document boost - 在索引時,添加到Index前可以通過doc.setBoost()設置,衡量了Document的重要程度。.
Field boost - 在將字段加入到文檔前可以通過調用field.setBoost()來設置字段的權重。
lengthNorm(field) - 該值在將文檔添加到索引時,根據所有文檔中特定字段的Term數來計算。所以默認更短的字段將貢獻更多的分值。

                                                   1
lengthNorm(field) =   ––––––––––––––
                                           numTerms½

當文檔加入索引時,以上因子將相乘,如果一個文檔中有多個同名的字段,那麼將多個多同的權重也相乘。

norm(t,d)   =   doc.getBoost() · lengthNorm(field) ·   ∏ f.getBoost()
                                                                       field f in d named as t

可是還有件值得注意的事情,這個值在索引時計算完畢後將編碼爲一個Byte存儲起來,在搜索時,再從文件中讀取出該值並解碼成float。在這個過程中,可能會造成精度的缺失,並不能保證decode(encode(x)) = x,比如,有可能decode(encode(0.89)) = 0.75,同樣值得注意的是,在搜索時改變此值已經太晚了。例如,用一個不同於DefaultSimilarity的實現。


相關函數:
setDefault(Similarity), IndexWriter.setSimilarity(Similarity), Searcher.setSimilarity(Similarity)

本翻譯屬於原創,轉載時請註明出處。英文原版請查看:

hudson.zones.apache.org/hudson/job/Lucene-trunk/javadoc//org/apache/lucene/search/Similarity.html

 

發佈了25 篇原創文章 · 獲贊 0 · 訪問量 1579
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章