Lucene打分公式的數學推導

2021-09-12 05:15:34 字數 2421 閱讀 4431

在進行lucene的搜尋過程解析之前,有必要單獨的一張把lucene score公式的推導,各部分的意義闡述一下。因為lucene的搜尋過程,很重要的乙個步驟就是逐步的計算各部分的分數。

lucene的打分公式非常複雜,如下:

在推導之前,先逐個介紹每部分的意義:

以上在lucene的文件中已經詳細提到,並在很多文章中也被闡述過,如何調整上面的各部分,以影響文件的打分,請參考有關lucene的問題(4):影響lucene對文件打分的四種方式一文。

然而上面各部分為什麼要這樣計算在一起呢?這麼複雜的公式是怎麼得出來的呢?下面我們來推導。

首先,將以上各部分代入score(q, d)公式,將得到乙個非常複雜的公式,讓我們忽略所有的boost,因為這些屬於人為的調整,也省略coord,這和公式所要表達的原理無關。得到下面的公式:

然後,有lucene學習總結之一:全文檢索的基本原理中的描述我們知道,lucene的打分機制是採用向量空間模型的:

我們把文件看作一系列詞(term),每乙個詞(term)都有乙個權重(term weight),不同的詞(term)根據自己在文件中的權重來影響文件相關性的打分計算。

於是我們把所有此文件中詞(term)的權重(term weight) 看作乙個向量。

document =

document vector =

同樣我們把查詢語句看作乙個簡單的文件,也用向量來表示。

query =

query vector =

我們把所有搜尋出的文件向量及查詢向量放到乙個n維空間中,每個詞(term)是一維。

我們認為兩個向量之間的夾角越小,相關性越大。

所以我們計算夾角的余弦值作為相關性的打分,夾角越小,余弦值越大,打分越高,相關性越大。

余弦公式如下:

下面我們假設:

查詢向量為vq =

文件向量為vd =

向量空間維數為n,是查詢語句和文件的並集的長度,當某個term不在查詢語句**現的時候,w(t, q)為零,當某個term不在文件**現的時候,w(t, d)為零。

w代表weight,計算公式一般為tf*idf。

我們首先計算余弦公式的分子部分,也即兩個向量的點積:

vq*vd = w(t1, q)*w(t1, d) + w(t2, q)*w(t2, d) + …… + w(tn ,q)*w(tn, d)

把w的公式代入,則為

vq*vd = tf(t1, q)*idf(t1, q)*tf(t1, d)*idf(t1, d) + tf(t2, q)*idf(t2, q)*tf(t2, d)*idf(t2, d) + …… + tf(tn ,q)*idf(tn, q)*tf(tn, d)*idf(tn, d)

在這裡有三點需要指出:

基於上述三點,點積公式為:

vq*vd = tf(t1, d) * idf(t1) * idf(t1) + tf(t2, d) * idf(t2) * idf(t2) + …… + tf(tn, d) * idf(tn) * idf(tn)

所以余弦公式變為:

下面要推導的就是查詢語句的長度了。

由上面的討論,查詢語句中tf都為1,idf都忽略查詢語句這篇小文件,得到如下公式

所以余弦公式變為:

下面推導的就是文件的長度了,本來文件長度的公式應該如下:

這裡需要討論的是,為什麼在打分過程中,需要除以文件的長度呢?

因為在索引中,不同的文件長度不一樣,很顯然,對於任意乙個term,在長的文件中的tf要大的多,因而分數也越高,這樣對小的文件不公平,舉乙個極端的例子,在一篇1000萬個詞的鴻篇巨著中,"lucene"這個詞出現了11次,而在一篇12個詞的短小文件中,"lucene"這個詞出現了10次,如果不考慮長度在內,當然鴻篇巨著應該分數更高,然而顯然這篇小文件才是真正關注"lucene"的。

然而如果按照標準的余弦計算公式,完全消除文件長度的影響,則又對長文件不公平(畢竟它是包含了更多的資訊),偏向於首先返回短小的文件的,這樣在實際應用中使得搜尋結果很難看。

所以在lucene中,similarity的lengthnorm介面是開放出來,使用者可以根據自己應用的需要,改寫lengthnorm的計算公式。比如我想做乙個經濟學**的搜尋系統,經過一定時間的調研,發現大多數的經濟學**的長度在8000到10000詞,因而lengthnorm的公式應該是乙個倒拋物線型的,8000到 10000詞的**分數最高,更短或更長的分數都應該偏低,方能夠返回給使用者最好的資料。

在預設狀況下,lucene採用defaultsimilarity,認為在計算文件的向量長度的時候,每個term的權重就不再考慮在內了,而是全部為一。

而從term的定義我們可以知道,term是包含域資訊的,也即title:hello和content:hello是不同的term,也即乙個term只可能在文件中的乙個域**現。

所以文件長度的公式為:

代入余弦公式:

再加上各種boost和coord,則可得出lucene的打分計算公式。

BP神經網路的數學公式推導

學習神經網路挺長一段時間了,最近才弄明白這其中的推導過程 推導過程參考cousera上andrew ng的機器學習課程 我盡量細緻通俗的解釋推導過程 假設我們有上圖的這樣乙個神經網路 輸入層為l 0,輸出層l 2 隱層l 1 引數則有兩層theta1和theta2 以下的公式均採用向量化的方式表達省...

Lucene預設的打分演算法 ES預設

隨著apache lucene 4.0版本在2012年的發布,這款偉大的全文檢索工具包終於允許使用者修改預設的基於tf idf原理的打分演算法。lucene api變得更加容易修改和擴充套件打分公式。但是,對於文件的打分計算,lucene並只是允許使用者在打分公式上修修補補,lucene 4.0推出...

矩陣求導公式的推導和計算(公式推導法)

但是在實際的公式推導中,我們不可能按照定義逐個進行求導,一方面這樣很麻煩,另一方面,對於包含矩陣和向量的公式的求導用這種方式進行求解也是不合適的。就好像你不會每次在求導的時候都是從極限的定義開始求解的一樣。這部分內容,相信大部分同學和我一樣,在簡單推導的時候還可以看個大概,遇到複雜的就不知所云。究其...