Lucene評分機制

2021-06-25 09:14:54 字數 3912 閱讀 1156

tfidfsimilarity類中定義了lucene評分的要素。重寫這些要素計算實現可以方便的修改lucene的打分機制。

擴充套件閱讀:introduction to information retrieval, chapter 6

下面將從資訊檢索模型到具體(有效地)實現來描述lucene如何實現評分。我們首先簡要介紹下向量空間模型評分(vsm score),之後匯出lucene理論評分公式,並據此最終推導出lucene實際評分方法(與lucene實現中使用的類、方法相關聯)

lucene混合了資訊檢索的布林模型(bm)和資訊檢索的向量空間模型——通過布林模型確定文件並通過vsm進行匹配程度評分。

在向量空間模型中,文件和查詢被表示為多維空間中的加權向量集。其每個不同的索引詞(term)對應乙個維度,在此維度上的權重是詞頻/逆向檔案頻率(tf-idf)值。

向量空間模型並不要求權重使用tf-idf值,不過tf-idf值被認為可以高效地評價搜尋結果,所以lucene使用tf-idf。之後將更加詳細的表述詞頻tf和逆向檔案頻率idf,但現在(作為結論)我們先設定:對於給定的詞(term)t和文件(或查詢)x,用tf(t,x)表示t在x中出現的次數,類似的用idf(t)表示包含詞t的所有文件數的反比。

文件d對於查詢q的向量空間模型評分vsm score等於加權查詢向量v(q)和v(d)之間的余弦相似性(cosine similarity):

cosine-similarity(q,d)   =  

v(q) · v(d)

–––––––––

|v(q)| |v(d)|

vsm score

其中v(q)·

v(d)是加權向量的

點乘積(dot product),

|v(q)|和

|v(d)|是各自的

歐幾里得度量(euclidean norms)(或者被叫作歐幾里得距離、模)。

note:上述等式可被視作標準化加權向量(v(q)除以它自己的歐幾里得度量,將其標準化為乙個單位向量)的點乘積。

lucene從搜尋質量與可用性方面重新定義了vsm score:

在上述單個索引域的簡化假定下,我們可以得到lucene理論評分公式:

score(q,d)   =   coord-factor(q,d) ·   query-boost(q) ·  

v(q) · v(d)

–––––––––

|v(q)|

·   doc-len-norm(d)   ·  doc-boost(d)

lucene理論評分公式

這個理**式是基於以下前提下的簡化:(1)查詢term和文件是基於域的(2)加權因子通常是加在查詢term上的而不是查詢上的(譯註:乙個查詢可以有眾多的查詢term)

現在我們描述下lucene如何實現上述理**式,並匯出lucene實際評分方法。

為了高效率的評分運算,一些評分組成被預先運算整合:

文件長度標準化因子doc-len-norm(d)和文件權重因子doc-boost(d)在索引建立時確定。它們已經被事先(譯註:在索引建立時)運算並且它們的乘積已經在索引資料中單獨儲存:norm(d)。(在之後匯出的等式中,norm(t in d)意為norm(field(t) in doc d)其中field(t)是查詢term t對應的域。)

lucene實際評分方法從之前敘述中得出:

score(q,d)   =   coord(q,d)

·  querynorm(q)

· ∑(

tf(t in d)

·  idf(t)

2  ·  t.getboost()

·  norm(t,d)

)t in q

lucene實際評分方法

其中:tf(t in d)與term的頻率有關,定義為當前評分的文件d中term t出現的次數。文件中出現給定term的次數越多得到的分值越高。注意tf(t in q)被假定為1,因此它不會出現在等式中,不過,如果乙個查詢包含兩次相同的查詢term,那麼將會有兩個具有相同term的term子查詢,因此計算結果仍然會保持正確(雖然不怎麼高效)。defaultsimilarity中定義的預設的tf(t in d)計算方式為:

tf(t in d)=  

frequency½

idf(t)意為反向檔案頻率。這個值是文件頻率(docfreq)(出現term t的文件數)的反比。這意味著罕見的term會為查詢的總評分貢獻更多的分數。t的idf(t)值在查詢和文件中都會出現因此它在等式中被執行乘方。defaultsimilarity中定義的預設的idf(t)計算方式為:

idf(t)=  

1 + log (

numdocs

–––––––––

docfreq+1

)coord(q,d)是乙個基於「在指定文件中查詢term匹配數」的評分因子。(譯註:term集:field1:query_value1,field2:query_value2,...中匹配數)。典型地,乙個匹配更多查詢term的文件要比乙個匹配少的文件得到更高的分數。這是乙個在進行搜尋時生效的被similarity類中的方法coord(q,d)進行運算得出的搜尋態因子。

querynorm(q)是乙個用於使評分結果在查詢間可以進行比較的標準化因子。這個因子不會影響文件的排序(因為所有的排序文件(的分值)都會乘以相同的因子),而只是嘗試使評分結果在不同查詢間可比較。這是乙個在similarity類中在搜尋時生效進行運算得出的搜尋態因子。defaultsimilarity中預設的運算會給出乙個歐幾里得度量(euclidean norms):

querynorm(q)   =querynorm(sumofsquaredweights)=  

1––––––––––––––

sumofsquaredweights½

(查詢term的)平方加權和通過查詢weight物件計算。例如,乙個booleanquery通過如下方式運算出這個值:

sumofsquaredweights=q.getboost()2

· ∑(

idf(t)  ·  t.getboost()

)2t in q

t.getboost()在查詢文字中指定(參見query syntax)或者通過程式呼叫setboost()進行設定的查詢q中term t的搜尋態加權因子。注意,確實沒有乙個直接的api可以訪問一組混合term查詢中的乙個term的加權因子,不過混合的term被表示成乙個混合了多個termquery物件的查詢,於是查詢中的乙個term的加權因子可以通過呼叫子查詢的getboost()方法來訪問。

norm(t,d)封裝了一小部分加權和長度因子(在索引建立階段):

computenorm(org.apache.lucene.index.fieldinvertstate)方法負責把結合這些因子運算成乙個單獨的浮點數。 當乙個文件被加入索引時,以上所有因子會被相乘。如果文件中存在同名的域(譯註:多值域),那麼它們的加權會乘在一起(譯註:即進行乘方運算):

norm(t,d)   =   lengthnorm  · 

f.boost()

fieldfin d named ast

注意到了執行搜尋操作的時候再修改評分的norm(譯註:規則,而不是值)就太晚了, 例如使用乙個不同的similarity類來執行搜尋時。

Lucene(三)評分機制

每當搜尋到匹配文件時,該文件都會被賦予一定的分值,用以反映匹配程度。該分值會計算文件與查詢之間的相似程度嗎,更高的分值反映了更強的相似程度和匹配程度。評分因子 描述tf t in d 項頻率因子 文件 d 中出現項 t 的頻率 idf t 項在倒排檔案中出現的頻率 它被用來衡量項的 唯一 性。出現頻...

lucene 的評分機制

elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...

lucene 的評分機制

elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...