上面我們已經(jīng)說過了一些倒排索引的東西脑题,并且也知道了如何來實現(xiàn)一個倒排索引完成檢索功能仇味,那么檢索完了以后如何排序呢学赛,這一篇簡單的說一下倒排索引的文本相關(guān)性排序,因為排序?qū)嵲谑翘珡?fù)雜了避诽,我們這里就說說文本的相關(guān)性排序,而且是最簡單的TD-IDF排序璃谨,之后有機會可以再說說整個搜索的排序算法有些什么沙庐。
文本相關(guān)性排序
首先明白幾個概念:
-
Term
鲤妥,分詞以后最小的單位,比如用Golang寫一個搜索引擎
拱雏,分詞以后就是用
棉安,golang
,寫
铸抑,一個
贡耽,搜索引擎
,那么每一個詞就是一個Term鹊汛。
- TF(Term Frequency)蒲赂,Term在文章中出現(xiàn)的頻率,就是當前term在文章中出現(xiàn)的頻率刁憋,就是term次數(shù)/總term數(shù)滥嘴,比如上文中的
搜索引擎
這個term的TF就是1/5,TF越高那么這篇文章中的這個詞就越重要至耻。 - DF(Document Frequency)若皱,文檔頻率,就是某個Term在總文檔中出現(xiàn)的頻率有梆,比如總共有100個文檔是尖,其中
搜索引擎
這個term在10個文檔中出現(xiàn)了,那么他的IDF就是5/100=0.5泥耀。 - IDF(Inverse Document Frequency)饺汹,逆文檔頻率,聽名字就知道是和上面的DF是反的痰催,用總文檔數(shù)除以包含term的文檔數(shù)兜辞,再求對數(shù)即可,上面的
搜索引擎
的IDF是log(100/5)
如何在一堆文章中找到包含關(guān)鍵詞的文章夸溶,倒排索引技術(shù)已經(jīng)幫我們解決了逸吵,只要分詞分得準確,那么找文章沒什么問題了缝裁。問題是找到一堆文章以后怎么進行排序扫皱,讓最重要的文章排在最前面,這里介紹一下相關(guān)性排序捷绑。
TF-IDF相關(guān)性排序
上面我們看到TF和IDF的概念韩脑,TF明顯作用就是表示一個term在文章中的重要程度,TF越高那么這個詞在文章中的重要程度越明顯粹污,IDF呢段多,IDF主要用來描述term在整體文章中的重要程度(也就是區(qū)分程度),IDF越高壮吩,那么這個term的整體重要性越高进苍,也就是區(qū)分度越大加缘,越能體現(xiàn)這個term的重要性。
為什么用log呢觉啊?其實我個人覺得啊拣宏,用不用log其實區(qū)別沒那么大,TF-IDF只是一種計算文本相關(guān)度的思想柄延,并不是一個有嚴格證明的公式蚀浆,所以用不用log區(qū)別不大,不過從信息論的角度看的話搜吧,妖人香農(nóng)提出的信息量的公式就是logX的樣子市俊,值越大信息量就越大,正好可以套在我們這滤奈,IDF越大摆昧,信息量也越大。
信息量是什么大家可以自己去百度蜒程,簡單描述起來就是某一件事情發(fā)生的概率的绅你,如果某件事情發(fā)生的概率是P,那么他的信息量就是 -logP昭躺,注意有個負號忌锯,比如中國隊男子足球隊和巴西隊男子足球隊打比賽,假設(shè)中國隊贏的概率是 0.01(可能高估了)领炫,但如果巴西隊贏了偶垮,根據(jù)公式算出來信息量幾乎沒有,因為誰都知道巴西會贏帝洪,但如果(我是說如果)最后中國隊贏了似舵,那么信息量算出來就是巨大的,肯定上各個頭版了葱峡,這也和我們的直覺比較一致砚哗,在IDF中,就是用的這個公式砰奕,不過吧負號放里面去了蛛芥,變成了log(1/P),而P就是DF军援,term在總文檔中出現(xiàn)的頻率常空。
TF和IDF合起來表示這個term的相關(guān)性,就是把這兩個值乘起來盖溺。
為什么要把這兩個概念合起來呢,第一個TF已經(jīng)可以描述term的重要性了铣缠,為什么還要用IDF呢烘嘱,主要可以解決兩個問題昆禽。
- 去掉高頻詞的噪音,既然IDF可以簡單理解為term的信息量蝇庭,那么它主要就是為了去掉噪聲醉鳖,也就是去掉那些個信息量很小的term的影響。比如
的
這個詞哮内,它的TF非常高盗棵,但實際上沒什么含義,但是你一算他的IDF北发,基本是0纹因,所以如果用TF*IDF的話,結(jié)果還是0琳拨,可以比較有效的去掉這類通用詞的干擾瞭恰。 - 同時IDF還可以更好的區(qū)分重要的詞,如果一個term的IDF越高狱庇,證明帶這個term的文章的更加能用這個term來表示惊畏,這個很好理解,如果一個term只在某一篇文章中出現(xiàn)密任,那么這個詞更能代表這篇文章的內(nèi)容颜启。
最后,多個term聯(lián)合檢索的時候浪讳,他們的相關(guān)性就是每一個term的TF-IDF加起來缰盏,
OK,TF-IDF就是這些了驻债,實現(xiàn)的時候乳规,如果是最初做全量索引的話,由于整體文檔數(shù)是已知的合呐,那每個term的TF-IDF一般是建立索引的時候就把它算好了暮的,檢索的時候按這個一排序就行了,我實現(xiàn)的時候由于沒有全量索引的概念淌实,所以只是在每添加一個文檔的時候算好這個文檔的TF存起來冻辩,檢索的時候通過term倒排召回的文檔數(shù)來確定IDF的值,實時算出TF-IDF的拆祈,如果是非常巨大的文檔數(shù)量恨闪,那么實時算還是很吃虧的,所以說全量索引還是非常必要的放坏,只是我這沒有完整實現(xiàn)全量索引建立而已咙咽,但后面接下來我會說說全量索引如何建立。
詞距
除了TF-IDF來進行相關(guān)性排序以外淤年,還有一些其他的文本因素也可以用在排序上钧敞,一是term的距離蜡豹,也就是詞距,如果檢索關(guān)鍵詞是小米手機
溉苛,那么明顯的镜廉,如果一篇文章中這兩個term(小米,手機)挨在一起愚战,比如小米手機是一款很熱門的手機
和手機應(yīng)用中有很多關(guān)于健康的文章娇唯,比如吃小米有什么好處
這兩篇文檔,明顯第一篇的相關(guān)度比第二篇要高寂玲。
所以塔插,為了保持詞距的信息,我們在存儲倒排的時候還需要將每個term的位置信息保存下來敢茁,檢索的時候用過這些個位置信息計算各個詞直接的詞距佑淀,從而和TF-IDF合在一起來表述文本相關(guān)性。
位置信息
同時彰檬,除了詞距以外伸刃,還有一個因素也影響相關(guān)度的排序,那就是term的位置逢倍,這個也很好理解捧颅,如果在標題
,摘要
命中的話明顯應(yīng)該比在正文中命中term的權(quán)重高较雕,一般這種情況是把標題
碉哑,摘要
命中的TD-IDF乘以一個系數(shù)來擴大影響,從而影響最后的相關(guān)度計算結(jié)果亮蒋。
其他模型
除了直接使用TF-IDF以外扣典,現(xiàn)在還有很多其他的文本相關(guān)性的排序模型,比如BM25這種以概率為基礎(chǔ)的排序模型慎玖,這里就不展開了贮尖,如果大家有興趣,寫完這些篇以后可以專門寫幾篇怎么排序的趁怔,包括文本排序湿硝,以及文本之后的重要性排序啊,怎么離線利用機器學習計算文檔重要性來排序之類的润努。
下面一篇文章會再講講倒排索引存儲的一些我沒有實現(xiàn)的東西关斜,比如索引壓縮之類的,然后會講講如何建立倒排铺浇,如果進行增量添加文檔痢畜,如何進行索引合并。