天天看點

探究Lucene計算權重的過程

探究Lucene計算權重的過程

我們知道,影響一個詞在一篇文檔中的重要性主要有兩個因素:

1 term frequency (tf):該詞在目前文檔出現了多少次,tf越大,說明越重要。

2 document frequency (df):有多少文檔包含該term,該詞越大說明太普通了,越不重要。

比如solr一詞在文檔中出現次數很多,說明這篇這篇文檔主要是跟solr有關的;那比如the this it which 諸如此類的詞,也很多,但重要嗎,很明顯不重要,為什麼?因為每一篇文檔可能都有很多這樣的詞,是以這時候就是由df來決定了。

計算權重的公式如下:

Wt,d = tft,d * log(n / dft)

Wt,d:詞在文檔中的權重

tft,d:詞在該文檔中出現的頻率次數

n: 文檔總數

dft:包含這個詞的文檔的數量

當然,不同的系統可能有自己不同的實作。

VSM: 向量空間模型算法

1 我們把文檔看做一系列的詞

2 每一個詞在文檔中都有自己的權重

3 不同的詞根據自己在文檔中的權重來影響文檔打分

4 我們把文檔中詞的權重看做一個向量:

Document Vector = {weight1, weight2, …… ,weight N}

5 我們把Query也用向量表示

Query Vector = {weight1, weight2, …… , weight N}

6 我們把搜尋出來的文檔向量和query向量放在一個N維空間,每一個term是一個次元。

7 我們認為兩個向量之間的夾角越小,相關性越大。是以我們計算夾角的餘弦值作為相關性的打分,夾角越小,餘弦值越大,打分高,相關性越大

探究Lucene計算權重的過程
探究Lucene計算權重的過程
查詢語句一般是很短的,包含的詞(Term)是很少的,因而查詢向量的維數很小,而文檔很長,包含詞(Term)很多,文檔向量維數很大。你的圖中兩者維數怎麼都是N呢?在這裡,既然要放到相同的向量空間,自然維數是相同的,不同時,取二者的并集,如果不含某個詞(Term)時,則權重(Term Weight)為0

舉例子:

查詢語句共有3個term, 文檔共有5個term

Term1 Term2 Term3 Term4 Term5
Document1 0.179 0.66 0.345
Document2 0.245 0.123 0.66 0.8
Query 0.154 0.66 0.5

計算2篇文檔跟查詢語句的相關性打分分别為:

探究Lucene計算權重的過程
探究Lucene計算權重的過程

得到的結果第二個比第一個大,是以傳回的結果第二個排在第一個前面

繼續閱讀