Lucene學習之計算相似度模型VSM(Vector Space Model)

    最近想學習下Lucene ,以前運行的Demo就感覺很神奇,什麼原理呢,尤其是查找相似度最高的、最優的結果。索性就直接跳到這個問題看,很多資料都提到了VSM(Vector Space Model)即向量空間模型,根據這個模型可以對搜索的結果進行最優化的篩選,目前還不知道如何證明,只能憑藉想象應該是這個樣子的。


1、看一下TF/IDF

     我們先來看下一個叫TF/IDF的概念,一般它用來作爲一個搜索關鍵字在文檔或整個查詢詞組的權重的計算方式。前幾天看了吳軍老師的數學之美系列文章,這個TF/IDF可以追溯到信息論中的相對熵的概念。在有些文獻中它被稱爲成“交叉熵”。在英語中是 Kullback-Leibler Divergence,是以它的兩個提出者庫爾貝克和萊伯勒的名字命名的。相對熵用來衡量兩個正函數是否相似,對於兩個完全相同的函數,它們的相對熵等於零。在自然語言處理中可以用相對熵來衡量兩個常用詞(在語法上和語義上)是否同義,或者兩篇文章的內容是否相近等等。利用相對熵,我們可以到處信息檢索中最重要的一個概念:詞頻率-逆向文檔頻率(TF/IDF)。

影響一個詞(Term)在一篇文檔中的重要性主要有兩個因素:
• Term Frequency (tf):即此Term在此文檔中出現了多少次。tf 越大說明越重要。
• Document Frequency (df):即有多少文檔包含次Term。df 越大說明越不重要。
容易理解嗎?詞(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要,如“搜索”這個詞,在本
文檔中出現的次數很多,說明本文檔主要就是講這方面的事的。然而在一篇英語文檔中,this出現的次數更多,
就說明越重要嗎?不是的,這是由第二個因素進行調整,第二個因素說明,有越多的文檔包含此詞(Term), 說明
此詞(Term)太普通,不足以區分這些文檔,因而重要性越低。

道理明白了,我們來看看公式:


W(t,d):the weight of term t in  document d

tf(t,d):frequency of term t in document d

n      :total number of  documents

df(t):the number of documents that contain term t

一些簡單的模型(Term Count Model)忽略了文檔的總數這個變量,那樣權重的計算就是w_{t,d} = \mathrm{tf}_{t,d}(In a simpler Term Count Model the term specific weights do not include the global parameter. Instead the weights are just the counts of term occurrences: w_{t,d} = \mathrm{tf}_{t,d}.)


2、進入VSM

我們把文檔看作一系列詞(Term),每一個詞(Term)都有一個權重(Term weight),不同的詞(Term)根據自己在
文檔中的權重來影響文檔相關性的打分計算。
於是我們把所有此文檔中詞(term)的權重(term weight) 看作一個向量。
Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}
同樣我們把查詢語句看作一個簡單的文檔,也用向量來表示。
Query = {term1, term 2, …… , term N}
Query Vector = {weight1, weight2, …… , weight N}
我們把所有搜索出的文檔向量及查詢向量放到一個N維空間中,每個詞(term)是一維。

Vector space model.jpg

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

我們只要比較下圖中的α,θ的餘弦值的大小,餘弦值越大,相似度越高。公式如下:


\mathrm{sim}(d_j,q) = \frac{\mathbf{d_j} \cdot \mathbf{q}}{\left\| \mathbf{d_j} \right\| \left \| \mathbf{q} \right\|} = \frac{\sum _{i=1}^N w_{i,j}w_{i,q}}{\sqrt{\sum _{i=1}^N w_{i,j}^2}\sqrt{\sum _{i=1}^N w_{i,q}^2}}

下面列出計算方法:

設d1=(x1,y1),q=(x2,y2)

我們根據餘弦定理,cos(α)=cos(A-B)

                                      =cos(A)cos(B)+sin(A)sin(B)

                                      =(x1/sqr(x1*x1+y1*y1))(x2/sqr(x1*x1+y1*y1))+(y1/sqr(x1*x1+y1*y1))(y2/sqr(x1*x1+y1*y1))

合併同類項,即向量d1與向量q的內積/向量模,也即上面的公式sim(dj,q)。

舉個例子,查詢語句有11個Term,共有三篇文檔搜索出來。其中各自的權重(Term weight),如下表格。


      t1     t2          t3       t4     t5          t6              t7        t8        t9          t10        t11
D1  0      0        0.477     0   0.477   0.176         0         0         0      0.176       0
D2  0    0.176       0    0.477     0          0           0          0      0.954     0         0.176     
D3  0    0.176       0        0      0       0.176         0          0        0       0.176     0.176
Q    0      0           0        0      0       0.176          0          0       0.477     0         0.176


於是計算,三篇文檔同查詢語句的相關性打分分別爲:






於是文檔二相關性最高,先返回,其次是文檔一,最後是文檔三。



參考:

1)tf/idf:http://en.wikipedia.org/wiki/Tf-idf

2)vsm:http://en.wikipedia.org/wiki/Vector_space_model  wikipedia維基百科

3)如何確定查詢相關性:http://www.google.com.hk/ggblog/googlechinablog/2006/06/blog-post_3066.html

4)網絡資料:http://forfuture1978.javaeye.com

發佈了51 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章