探究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 我們認為兩個向量之間的夾角越小,相關性越大。是以我們計算夾角的餘弦值作為相關性的打分,夾角越小,餘弦值越大,打分高,相關性越大
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO3YjN0ITMyIDNxUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
查詢語句一般是很短的,包含的詞(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篇文檔跟查詢語句的相關性打分分别為:
得到的結果第二個比第一個大,是以傳回的結果第二個排在第一個前面