在上一篇文章中,我們大概了解了如何使用搜索語句對索引進行搜索,但是在搜索完成之后如何對找到的文章進行排序并返回的問題產生了疑惑,那么我們是如何去判斷搜索出的文檔和搜索語句的相關性的呢?現在,我們來解決如何對文檔之間的相關性進行打分的問題。
要對文檔之間的關系進行打分可不是一個容易的事情,我們先看一個例子:如何去判斷人之間的關系。
首先,看一個人,往往會綜合許多的要素,比如性格、信仰、興趣愛好、衣著打扮、高矮胖瘦等。
其次,對于人與人之間的關系,不同的要素重要性不同,性格、信仰、愛好可能會重要一些,而個人的衣著打扮和高矮胖瘦等可能重要性要相對小一個層次,故而擁有相同或者相似的性格、信仰和興趣愛好的人會更容易成為好朋友,不過衣著打扮和高矮胖瘦不同的人,也能夠成為好朋友。
因此判斷人與人之間的關系,首先要知道哪些因素對人與人之間的關系更重要,比如性格、信仰和興趣愛好等。其次,是判斷兩個人的這些要素之間的關系。例如A性格開朗,B性格外向,A信仰佛教,B信仰上帝,A喜歡打籃球,B喜歡踢足球。我們可以看到,A和B兩個人的性格都很積極,都喜歡運動,而且兩個人的信仰也都是善良積極的,因此我們判斷兩個人之間的關系應該會很好。
可能大家會說上面這個例子中的關聯要素可能有點抽象,那我們再看一個更加直觀的例子:公司之間的關系。
首先,一個公司由很多人構成,比如總經理,經理,首席技術官,普通員工,保安,門衛等,這些人的重要性不同,總經理、經理和首席技術官可能更重要點,而普通員工、保安、門衛等可能不是那么重要。所以說如果兩個公司的總經理以前是同學,經理是老鄉,首席技術官曾是一起創業的伙伴,那么,我們會判斷這兩家公司的關系一定很好。
通過上面的兩個例子,我們知道判斷兩者之間的關系需要多方面地考慮許多因素,并且不同的因素的權重不同。現在,我們再來看一下如何去判斷文檔之間的關系。
首先,一個文檔有許多詞組成,如search,lucene,full-text,this,a,what等。
其次對于文檔之間的關系,不同的Term重要性不同,比如對于本篇文檔,search,lucene,full-text相對重要些,this,a,what相對不是那么重要,那么如果這兩篇文檔都包含search,lucene,full-text,那么這兩篇文檔之間的關系一定很緊密,這樣的話,即便有一篇文檔不包含this,a,what,也不會影響兩個文檔之間的緊密度。
因而判斷文檔之間的關系,首先要找出哪些詞對文檔之間的關系最重要,然后再去判斷文檔之間的關系。
這個就產生了另一個問題,我們要如何去判斷一個詞對文檔的重要性呢?全文索引中有這樣的一個計算過程,叫做計算詞的權重。
計算詞的權重有兩個參數,第一個是詞,第二個是文檔。
詞的權重表示這個詞對所在文檔的重要性,越重要的詞它的權重越大,因而在計算文檔之間的相關性上會發揮更大作用。
判斷詞之間的關系從而得到文檔相關性需要使用向量空間模型算法。
下面我們來詳細地介紹一下這兩個過程:
First:計算權重的過程
影響一個詞在一篇文檔中的重要性主要有兩個因素:
Term Frequency:即此Term在此文檔中出現了多少次。tf越大說明越重要;
Document Frequecy:即有多少文檔包含此Term,df越大說明越不重要;
很直觀吧?詞在文檔中出現次數越多,說明該詞對文檔越重要;然而,一篇英文文檔中“this”出現的次數最多,那么就說明“this”最重要么?這就需要通過第二個因素進行調節,第二個因素說明,一個詞出現在越多的文檔,則該詞越不重要,也就是這個詞太普通了,不足以區分這些文檔之間的不同,那么它的權重就會很低。
好比程序員所學的技術,對于程序員而言,這項技術掌握的越深越好,找工作時越有競爭力。然而對于所有程序員而言,這項技術掌握的人越少越好,這樣才能體現自己的價值,找工作時才會越有競爭力,畢竟人的價值在于不可替代性。
道理講述明了了,下面來看一下詞的權重的簡單典型計算公式:
詞的權重計算公式
當然全文搜索系統都會有自己的一套實現方案,Lucene就和此稍有不同。
Second:判斷詞之間的關系c從而得到文檔相關性的過程,也就是向量空間模型算法
我們把文檔看作一系列的詞,每個詞都有自己的權重,不同的詞根據自己在文檔中的權重來影響文檔相關性的打分計算。
于是,我們把所有此文檔中的詞的權重看做一個向量。
Document={term1,term 2,......,term N}
Document Vector={weight 1,weight 2,......,weight N}
同樣,我們把查詢語句看做一個簡單文檔,同樣使用向量來表示:
Query={term1,term 2,......,term N}
Query Vector={weight 1,weight 2,......,weight N}
我們把所有搜索的文檔向量及查詢向量放到一個N維空間中,每個詞都是一個維度,如下圖所示:
向量空間模型
我們認為兩個向量之間的夾角越小,相關性越大。
所以我們計算夾角的余弦值作為相關性的打分,夾角越小,余弦值越小,打分越高,相關性越大。
有人會說,查詢語句一般都很短,包含的詞是很少的,因而查詢向量的向量空間的維度很小,但是文檔都會很長,包含的詞很多,文檔的向量空間的維度很大,為什么上圖的兩個維度相同,都是N呢?
在這里,既然是要放到相同的向量空間之中,那么維度一定是相等的,不同的是,我們在此取的是兩者的并集,如果不包含某詞,則權重為0。
相關性的打分公式如下:
相關性打分計算公式
舉個例子,查詢語句一共有十一個詞,共計有三篇文檔被搜索出來,其中各自的權重如下表所示:
三個文檔和查詢語句之間的權重
于是通過上面的相關性計算公式可以得到:
三篇文檔的相關性計算結果
于是我們可以得到,第二篇文檔的相關性最高,排在最前面返回,然后依次為文檔一和文檔三。
說了這么多,其實我們還是沒有真正地走進Lucene,我們僅僅是對信息檢索技術的基礎理論進行了一個基本的介紹與了解。然而當我們看過Lucene之后,我們會發現,Lucene是對這種基本理論的一種基礎性的實踐。所以在以后分析Lucene的文章中,會常常看到上面的理論在Lucene中的具體應用。
在真正的進入Lucene之前,最后對上面的理論介紹進行一個最終總結,如下圖所示:
全文信息檢索的基本原理
下一篇文章,我們將真正地走進Lucene。
新聞熱點
疑難解答