Lucene TFIDF打分公式

2021-09-06 15:55:31 字數 1100 閱讀 3793

還沒讀tfidfsimilarity的**,讀了一下lucene的文件,沒有特複雜,感覺還是非常嚴謹的。

對於查詢q和文件d,如果查詢為純token查詢,套用向量空間模型(vsm),相似度度量使用余弦,另外再加乙個coord(q,d)即d中滿足q中must和should查詢條件個數的度量(預計通常是m / n了)。cos直接用向量點積除以兩個向量的模(euclidean norm)。

cos = v(q) * v(d) / (|v(q)|  * |v(d)|)

sim = coord(q,d) * cos

當中:v(q) = (idf(t),...)

v(d) = (tf,...)

當中tf並不是簡單的term freq,而是其平方根,這非常可能是為了讓其模剛好是doclen。

idf = 1 + log(numdocs / (1 + docfreq),因此這個公式裡面,tf的數值被弱化了。

在文件的lucene practical scoring formula,當中對於|v(q)|的計算被歸到querynorm上(querynorm = 1 / |v(q)|) ,對於|v(d)|的計算被歸到norm(t, d)中(norm(t,d) = 1 / |v(d)|)。

querynorm中有個query bootst值,偶認為對於純tf idf計算(無論query多長總是能夠展開成一級)沒什麼意義,並且對最後總分沒影響,僅僅是能夠對不同query的結果進行比較。

querynorm中另乙個t.getboost(),這個事實上非常重要,能夠是乙個主要調參的地方,由於term boost能夠包括field boost的資訊,所以能夠在search時進行設定,有了term boost,v(q)變為:

v(q) = (idf(t) * t.getboost(),...)

|v(d)|的計算歸結到norm(t,d)中,當中引入field.getboost另整個公式不嚴謹,由於點積中沒有乘以這個數字,模也不是正常計算的了,再加上t.getboost()就能夠包括field boost資訊,還有每乙個field儲存的norm值僅僅用乙個位元組表示,精度非常差,我認為這個norm值不有用,倒不如直接用lengthnorm(我倒是非常好奇沒有norm值,lucene怎麼處理的)。

參考文獻:

Lucene TFIDF打分公式

還沒讀tfidfsimilarity的 讀了一下lucene的文件,沒有特複雜,感覺還是很嚴謹的。對於查詢q和文件d,假設查詢為純token查詢,套用向量空間模型 vsm 相似度度量使用余弦,另外再加乙個coord q,d 即d中滿足q中must和should查詢條件個數的度量 估計一般是m n了 ...

Lucene打分公式的數學推導

在進行lucene的搜尋過程解析之前,有必要單獨的一張把lucene score公式的推導,各部分的意義闡述一下。因為lucene的搜尋過程,很重要的乙個步驟就是逐步的計算各部分的分數。lucene的打分公式非常複雜,如下 在推導之前,先逐個介紹每部分的意義 以上在lucene的文件中已經詳細提到,...

lucene打分機制

lucene採用的是基於vsm 向量空間模型 的相似度演算法,查詢向量 query vector 與搜尋出來的文件向量 document vector 形成n個夾角,計算q 和d 之間的夾角,最小的 就是相 似 度最高的。看下lucene的打分公式 tf 乙個term在乙個文件中出現的次數 idf ...