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