信息檢索技術——布爾檢索


前一陣子和大家分享了一系列排序算法,希望對大家能夠有一些幫助。從今天開始,本人打算開展一個新的領域,介紹一下信息檢索相關的技術。信息檢索技術可以說現如今發展非常迅速,使用也極其廣泛,甚至可以說是隨處可見。特別是做一些跟搜索引擎,機器學習相關工作時,信息檢索的知識無處不在。為了讓大家更好的理解信息檢索技術,我將分多次對信息檢索技術做一個盡可能細致的闡述,難度由淺及深,歡迎大家多多拍磚。

今天先介紹最簡單的信息檢索技術,布爾檢索。

 

信息檢索(IR),通俗的講,就是要在一個很大的文本(有時可能是其他數據,如圖像等)集合中,找到與用戶需求相關的可以滿足用戶需求的非結構化信息。聽起來有點拗口,其實就是一種查詢,只不過查詢的對象是非結構化信息,和查詢數據庫中的表並不相同。希望這么說能好理解一些。

既然要從文檔中找到符合用戶需求的信息,那么首先就要解決一個問題,就是如何來表示文檔呢?在信息檢索中,我們通常使用1代表一個word出現在文檔中,0代表沒有出現在文檔中,很簡單。

比如 文檔1: I often go to school by bus. 文檔2: I am wating for the bus for 20 minutes.

我們如何來用1和0來表示上面的文檔呢?很容易想到的方法是將所有的文檔和word組成一個矩陣,X方向為文檔,Y方向為所有的單詞。

    文檔1  文檔2  文檔3  文檔4  ...

I     1    1    0    0

often  1    0    0

go    1    0    0

to     1      0     0

school     1     0    0

by          1    0    0

bus         1    1    0

am          0    1    0

...

這樣很容易的就表示了所有的word和文檔的對應關系,當用戶要查詢檢索bus時,只需要找到bus對應的行,將是1的文檔都取出來,展現給用戶不就行了?

確實,這樣做可以完成檢索的需求,但是仔細想想不難發現,我們假設一篇文檔有1000個word,一個文檔集有1億篇文檔(這對於搜索引擎來說還遠遠不夠),那么我們需要用1*1011的矩陣來保存這種關系,這對計算機來說顯然是無法承受的。

 

那我們有什么辦法來進行優化呢?仔細想想可以看出,雖然數據量很大,但是這個矩陣是極其稀疏的,也就是說1的個數是很少的,絕大多數位置都是0.那么我們為什么要保存那么多的0來占用空間呢?這完全沒有必要。於是,著名大倒排索引誕生了。

在介紹倒排索引前,先說正排索引,正排索引就是給定一個文檔,可以知道文檔中出現的所有word。對比着看,倒排索引就是反過來,給定一個word,看看這個word出現在哪些文檔中。下面的圖形象的描述了倒排索引的數據結構

I -> 1 2 3 4 5 7 9 22

school -> 1 3

bus -> 1 2 8 9

其中前面的是word,后面的是文檔的標號,並且這些標號是按順序存放的,這更利於后面檢索環節的處理。當然上面提到的是最基本的原型,實際的系統中,倒排索引還保存了詞頻,網頁的元數據等各種信息。

 

有了倒排索引,我們就可以省去大量的空間,大大提高了查詢檢索的效率。下面我們看看如何進行檢索。比如我們有了如下的倒排索引

A -> 2 4 8 16 32 64

B -> 1 2 4 9 16 33

先在用戶查詢A,那么則返回2 4 8 16 32 64

如果查詢A and B 則需要把A和B的倒排索引拿出來,進行一次求交集的運算。其實很簡單,只需要O(x+y)的時間操作,就可以得到2 4 16了。

如果用戶查詢A or B呢?不用我多說了吧,相信大家已經很明白該如何處理了。

 

以上是本人對布爾檢索的一個簡單的說明,歡迎大家指正。謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM