用Golang寫一個搜索引擎(0x05)--- 文本相關性排序

上面咱們已經說過了一些倒排索引的東西,而且也知道了如何來實現一個倒排索引完成檢索功能,那麼檢索完了之後如何排序呢,這一篇簡單的說一下倒排索引的文本相關性排序,由於排序實在是太複雜了,咱們這裏就說說文本的相關性排序,並且是最簡單的TD-IDF排序,以後有機會能夠再說說整個搜索的排序算法有些什麼。golang

文本相關性排序

首先明白幾個概念:算法

  • Term,分詞之後最小的單位,好比用Golang寫一個搜索引擎,分詞之後就是golang一個搜索引擎,那麼每個詞就是一個Term。微信

  • TF(Term Frequency),Term在文章中出現的頻率,就是當前term在文章中出現的頻率,就是term次數/總term數,好比上文中的搜索引擎這個term的TF就是1/5,TF越高那麼這篇文章中的這個詞就越重要。機器學習

  • DF(Document Frequency),文檔頻率,就是某個Term在總文檔中出現的頻率,好比總共有100個文檔,其中搜索引擎這個term在10個文檔中出現了,那麼他的IDF就是5/100=0.5。學習

  • IDF(Inverse Document Frequency),逆文檔頻率,聽名字就知道是和上面的DF是反的,用總文檔數除以包含term的文檔數,再求對數便可,上面的搜索引擎的IDF是log(100/5)搜索引擎

如何在一堆文章中找到包含關鍵詞的文章,倒排索引技術已經幫咱們解決了,只要分詞分得準確,那麼找文章沒什麼問題了。問題是找到一堆文章之後怎麼進行排序,讓最重要的文章排在最前面,這裏介紹一下相關性排序。spa

TF-IDF相關性排序

上面咱們看到TF和IDF的概念,TF明顯做用就是表示一個term在文章中的重要程度,TF越高那麼這個詞在文章中的重要程度越明顯,IDF呢,IDF主要用來描述term在總體文章中的重要程度(也就是區分程度),IDF越高,那麼這個term的總體重要性越高,也就是區分度越大,越能體現這個term的重要性。code

爲何用log呢?其實我我的以爲啊,用不用log其實區別沒那麼大,TF-IDF只是一種計算文本相關度的思想,並非一個有嚴格證實的公式,因此用不用log區別不大,不過從信息論的角度看的話,妖人香農提出的信息量的公式就是logX的樣子,值越大信息量就越大,正好能夠套在咱們這,IDF越大,信息量也越大。排序

信息量是什麼你們能夠本身去百度,簡單描述起來就是某一件事情發生的機率的,若是某件事情發生的機率是P,那麼他的信息量就是 -logP,注意有個負號,好比中國隊男子足球隊和巴西隊男子足球隊打比賽,假設中國隊贏的機率是 0.01(可能高估了),但若是巴西隊贏了,根據公式算出來信息量幾乎沒有,由於誰都知道巴西會贏,但若是(我是說若是)最後中國隊贏了,那麼信息量算出來就是巨大的,確定上各個頭版了,這也和咱們的直覺比較一致,在IDF中,就是用的這個公式,不過吧負號放裏面去了,變成了log(1/P),而P就是DF,term在總文檔中出現的頻率。索引

TF和IDF合起來表示這個term的相關性,就是把這兩個值乘起來。

爲何要把這兩個概念合起來呢,第一個TF已經能夠描述term的重要性了,爲何還要用IDF呢,主要能夠解決兩個問題。

  • 去掉高頻詞的噪音,既然IDF能夠簡單理解爲term的信息量,那麼它主要就是爲了去掉噪聲,也就是去掉那些個信息量很小的term的影響。好比這個詞,它的TF很是高,但實際上沒什麼含義,可是你一算他的IDF,基本是0,因此若是用TF*IDF的話,結果仍是0,能夠比較有效的去掉這類通用詞的干擾。

  • 同時IDF還能夠更好的區分重要的詞,若是一個term的IDF越高,證實帶這個term的文章的更加能用這個term來表示,這個很好理解,若是一個term只在某一篇文章中出現,那麼這個詞更能表明這篇文章的內容。

最後,多個term聯合檢索的時候,他們的相關性就是每個term的TF-IDF加起來,

OK,TF-IDF就是這些了,實現的時候,若是是最初作全量索引的話,因爲總體文檔數是已知的,那每一個term的TF-IDF通常是創建索引的時候就把它算好了,檢索的時候按這個一排序就好了,我實現的時候因爲沒有全量索引的概念,因此只是在每添加一個文檔的時候算好這個文檔的TF存起來,檢索的時候經過term倒排召回的文檔數來肯定IDF的值,實時算出TF-IDF的,若是是很是巨大的文檔數量,那麼實時算仍是很吃虧的,因此說全量索引仍是很是必要的,只是我這沒有完整實現全量索引創建而已,但後面接下來我會說說全量索引如何創建。

詞距

除了TF-IDF來進行相關性排序之外,還有一些其餘的文本因素也能夠用在排序上,一是term的距離,也就是詞距,若是檢索關鍵詞是小米手機,那麼明顯的,若是一篇文章中這兩個term(小米,手機)挨在一塊兒,好比小米手機是一款很熱門的手機手機應用中有不少關於健康的文章,好比吃小米有什麼好處這兩篇文檔,明顯第一篇的相關度比第二篇要高。

因此,爲了保持詞距的信息,咱們在存儲倒排的時候還須要將每一個term的位置信息保存下來,檢索的時候用過這些個位置信息計算各個詞直接的詞距,從而和TF-IDF合在一塊兒來表述文本相關性。

位置信息

同時,除了詞距之外,還有一個因素也影響相關度的排序,那就是term的位置,這個也很好理解,若是在標題摘要命中的話明顯應該比在正文中命中term的權重高,通常這種狀況是把標題摘要命中的TD-IDF乘以一個係數來擴大影響,從而影響最後的相關度計算結果。

其餘模型

除了直接使用TF-IDF之外,如今還有不少其餘的文本相關性的排序模型,好比BM25這種以機率爲基礎的排序模型,這裏就不展開了,若是你們有興趣,寫完這些篇之後能夠專門寫幾篇怎麼排序的,包括文本排序,以及文本以後的重要性排序啊,怎麼離線利用機器學習計算文檔重要性來排序之類的,在說排序的時候咱們會說一下如何將這些個全部的東西【文本相關性,詞距,位置,重要性,銷量,點擊等】合起來進行打分

下面一篇文章會再講講倒排索引存儲的一些我沒有實現的東西,好比索引壓縮之類的,而後會講講如何創建倒排,若是進行增量添加文檔,如何進行索引合併。

最後,歡迎你們掃描一下下面的微信公衆號訂閱,首先會在這裏發出來:)
圖片描述

相關文章
相關標籤/搜索