在上一篇文章中,我們大概了解了如何使用搜索語(yǔ)句對(duì)索引進(jìn)行搜索,但是在搜索完成之后如何對(duì)找到的文章進(jìn)行排序并返回的問題產(chǎn)生了疑惑,那么我們是如何去判斷搜索出的文檔和搜索語(yǔ)句的相關(guān)性的呢?現(xiàn)在,我們來(lái)解決如何對(duì)文檔之間的相關(guān)性進(jìn)行打分的問題。
要對(duì)文檔之間的關(guān)系進(jìn)行打分可不是一個(gè)容易的事情,我們先看一個(gè)例子:如何去判斷人之間的關(guān)系。
首先,看一個(gè)人,往往會(huì)綜合許多的要素,比如性格、信仰、興趣愛好、衣著打扮、高矮胖瘦等。
其次,對(duì)于人與人之間的關(guān)系,不同的要素重要性不同,性格、信仰、愛好可能會(huì)重要一些,而個(gè)人的衣著打扮和高矮胖瘦等可能重要性要相對(duì)小一個(gè)層次,故而擁有相同或者相似的性格、信仰和興趣愛好的人會(huì)更容易成為好朋友,不過(guò)衣著打扮和高矮胖瘦不同的人,也能夠成為好朋友。
因此判斷人與人之間的關(guān)系,首先要知道哪些因素對(duì)人與人之間的關(guān)系更重要,比如性格、信仰和興趣愛好等。其次,是判斷兩個(gè)人的這些要素之間的關(guān)系。例如A性格開朗,B性格外向,A信仰佛教,B信仰上帝,A喜歡打籃球,B喜歡踢足球。我們可以看到,A和B兩個(gè)人的性格都很積極,都喜歡運(yùn)動(dòng),而且兩個(gè)人的信仰也都是善良積極的,因此我們判斷兩個(gè)人之間的關(guān)系應(yīng)該會(huì)很好。
可能大家會(huì)說(shuō)上面這個(gè)例子中的關(guān)聯(lián)要素可能有點(diǎn)抽象,那我們?cè)倏匆粋€(gè)更加直觀的例子:公司之間的關(guān)系。
首先,一個(gè)公司由很多人構(gòu)成,比如總經(jīng)理,經(jīng)理,首席技術(shù)官,普通員工,保安,門衛(wèi)等,這些人的重要性不同,總經(jīng)理、經(jīng)理和首席技術(shù)官可能更重要點(diǎn),而普通員工、保安、門衛(wèi)等可能不是那么重要。所以說(shuō)如果兩個(gè)公司的總經(jīng)理以前是同學(xué),經(jīng)理是老鄉(xiāng),首席技術(shù)官曾是一起創(chuàng)業(yè)的伙伴,那么,我們會(huì)判斷這兩家公司的關(guān)系一定很好。
通過(guò)上面的兩個(gè)例子,我們知道判斷兩者之間的關(guān)系需要多方面地考慮許多因素,并且不同的因素的權(quán)重不同。現(xiàn)在,我們?cè)賮?lái)看一下如何去判斷文檔之間的關(guān)系。
首先,一個(gè)文檔有許多詞組成,如search,lucene,full-text,this,a,what等。
其次對(duì)于文檔之間的關(guān)系,不同的Term重要性不同,比如對(duì)于本篇文檔,search,lucene,full-text相對(duì)重要些,this,a,what相對(duì)不是那么重要,那么如果這兩篇文檔都包含search,lucene,full-text,那么這兩篇文檔之間的關(guān)系一定很緊密,這樣的話,即便有一篇文檔不包含this,a,what,也不會(huì)影響兩個(gè)文檔之間的緊密度。
因而判斷文檔之間的關(guān)系,首先要找出哪些詞對(duì)文檔之間的關(guān)系最重要,然后再去判斷文檔之間的關(guān)系。
這個(gè)就產(chǎn)生了另一個(gè)問題,我們要如何去判斷一個(gè)詞對(duì)文檔的重要性呢?全文索引中有這樣的一個(gè)計(jì)算過(guò)程,叫做計(jì)算詞的權(quán)重。
計(jì)算詞的權(quán)重有兩個(gè)參數(shù),第一個(gè)是詞,第二個(gè)是文檔。
詞的權(quán)重表示這個(gè)詞對(duì)所在文檔的重要性,越重要的詞它的權(quán)重越大,因而在計(jì)算文檔之間的相關(guān)性上會(huì)發(fā)揮更大作用。
判斷詞之間的關(guān)系從而得到文檔相關(guān)性需要使用向量空間模型算法。
下面我們來(lái)詳細(xì)地介紹一下這兩個(gè)過(guò)程:
First:計(jì)算權(quán)重的過(guò)程
影響一個(gè)詞在一篇文檔中的重要性主要有兩個(gè)因素:
Term Frequency:即此Term在此文檔中出現(xiàn)了多少次。tf越大說(shuō)明越重要;
Document Frequecy:即有多少文檔包含此Term,df越大說(shuō)明越不重要;
很直觀吧?詞在文檔中出現(xiàn)次數(shù)越多,說(shuō)明該詞對(duì)文檔越重要;然而,一篇英文文檔中“this”出現(xiàn)的次數(shù)最多,那么就說(shuō)明“this”最重要么?這就需要通過(guò)第二個(gè)因素進(jìn)行調(diào)節(jié),第二個(gè)因素說(shuō)明,一個(gè)詞出現(xiàn)在越多的文檔,則該詞越不重要,也就是這個(gè)詞太普通了,不足以區(qū)分這些文檔之間的不同,那么它的權(quán)重就會(huì)很低。
好比程序員所學(xué)的技術(shù),對(duì)于程序員而言,這項(xiàng)技術(shù)掌握的越深越好,找工作時(shí)越有競(jìng)爭(zhēng)力。然而對(duì)于所有程序員而言,這項(xiàng)技術(shù)掌握的人越少越好,這樣才能體現(xiàn)自己的價(jià)值,找工作時(shí)才會(huì)越有競(jìng)爭(zhēng)力,畢竟人的價(jià)值在于不可替代性。
道理講述明了了,下面來(lái)看一下詞的權(quán)重的簡(jiǎn)單典型計(jì)算公式:

詞的權(quán)重計(jì)算公式
當(dāng)然全文搜索系統(tǒng)都會(huì)有自己的一套實(shí)現(xiàn)方案,Lucene就和此稍有不同。
Second:判斷詞之間的關(guān)系c從而得到文檔相關(guān)性的過(guò)程,也就是向量空間模型算法
我們把文檔看作一系列的詞,每個(gè)詞都有自己的權(quán)重,不同的詞根據(jù)自己在文檔中的權(quán)重來(lái)影響文檔相關(guān)性的打分計(jì)算。
于是,我們把所有此文檔中的詞的權(quán)重看做一個(gè)向量。
Document={term1,term 2,......,term N}
Document Vector={weight 1,weight 2,......,weight N}
同樣,我們把查詢語(yǔ)句看做一個(gè)簡(jiǎn)單文檔,同樣使用向量來(lái)表示:
Query={term1,term 2,......,term N}
Query Vector={weight 1,weight 2,......,weight N}
我們把所有搜索的文檔向量及查詢向量放到一個(gè)N維空間中,每個(gè)詞都是一個(gè)維度,如下圖所示:

向量空間模型
我們認(rèn)為兩個(gè)向量之間的夾角越小,相關(guān)性越大。
所以我們計(jì)算夾角的余弦值作為相關(guān)性的打分,夾角越小,余弦值越小,打分越高,相關(guān)性越大。
有人會(huì)說(shuō),查詢語(yǔ)句一般都很短,包含的詞是很少的,因而查詢向量的向量空間的維度很小,但是文檔都會(huì)很長(zhǎng),包含的詞很多,文檔的向量空間的維度很大,為什么上圖的兩個(gè)維度相同,都是N呢?
在這里,既然是要放到相同的向量空間之中,那么維度一定是相等的,不同的是,我們?cè)诖巳〉氖莾烧叩牟⒓绻话吃~,則權(quán)重為0。
相關(guān)性的打分公式如下:

相關(guān)性打分計(jì)算公式
舉個(gè)例子,查詢語(yǔ)句一共有十一個(gè)詞,共計(jì)有三篇文檔被搜索出來(lái),其中各自的權(quán)重如下表所示:

三個(gè)文檔和查詢語(yǔ)句之間的權(quán)重
于是通過(guò)上面的相關(guān)性計(jì)算公式可以得到:

三篇文檔的相關(guān)性計(jì)算結(jié)果
于是我們可以得到,第二篇文檔的相關(guān)性最高,排在最前面返回,然后依次為文檔一和文檔三。
說(shuō)了這么多,其實(shí)我們還是沒有真正地走進(jìn)Lucene,我們僅僅是對(duì)信息檢索技術(shù)的基礎(chǔ)理論進(jìn)行了一個(gè)基本的介紹與了解。然而當(dāng)我們看過(guò)Lucene之后,我們會(huì)發(fā)現(xiàn),Lucene是對(duì)這種基本理論的一種基礎(chǔ)性的實(shí)踐。所以在以后分析Lucene的文章中,會(huì)常常看到上面的理論在Lucene中的具體應(yīng)用。
在真正的進(jìn)入Lucene之前,最后對(duì)上面的理論介紹進(jìn)行一個(gè)最終總結(jié),如下圖所示:

全文信息檢索的基本原理
下一篇文章,我們將真正地走進(jìn)Lucene。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注