Lucene TFIDF打分公式

2021-06-21 14:59:22 字數 1091 閱讀 8041

還沒讀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 ...