0 引言
今天介紹一下倒排索引,倒排索引又叫反向索引(inverted index),既然有反向索引那就有正向索引(forward index)了。一些相關概念可以看前文資訊檢索(information retrieval)相關概念
1 正向索引和反向索引
為了增加效率,搜尋引擎會把正向索引變為反向索引(倒排索引)即把「文件→單詞」的形式變為「單詞→文件」的形式。倒排索引具體機構如下:
單詞1→文件1的id;文件2的id;文件3的id…
單詞2→文件1的id;文件4的id;文件7的id…
2 單詞-文件矩陣
單詞-文件矩陣是表達兩者之間所具有的一種包含關係的概念模型。
現有以下幾個文件:
此時使用者查詢為「蘋果 and (賈伯斯 or ipad2)」,表示包含單詞「蘋果」,同時還包含「賈伯斯」或「ipad2」的其中乙個。
則「單詞-文件」矩陣為:
該矩陣可以從兩個方向進行解讀:
搜尋引擎的索引其實就是實現「單詞-文件」矩陣的具體資料結構。可以有不同的方式來實現上述概念模型,比如「倒排索引」、「簽名檔案」、「字尾樹」等方式,但是「倒排索引」是實現單詞到文件對映關係的最佳實現方式。
3 倒排索引
倒排索引(inverted index):倒排索引是實現「單詞-文件矩陣」的一種具體儲存形式,通過倒排索引,可以根據單詞快速獲取包含這個單詞的文件列表。倒排索引主要由兩個部分組成:「單詞詞典」和「倒排檔案」。
4 倒排索引簡單例項
還是用上面提到的例子:
這五個文件中的數字代表文件的id,比如"doc1"中的「1」。
通過這5個文件建立簡單的倒排索引:
單詞id(wordid)
單詞(word)
倒排列表(docid)
1賈伯斯
1,3,4,52蘋果
2,3,5
3ipad2
3,44宣布3
5了1,4,5……
… 首先要用分詞系統將文件自動切分成單詞序列,這樣就讓文件轉換為由單詞序列構成的資料流,並對每個不同的單詞賦予唯一的單詞編號(wordid),並且每個單詞都有對應的含有該單詞的文件列表即倒排列表。如上表所示,第一列為單詞id,第二列為單詞id對應的單詞,第三列為單詞對應的倒排列表。如第乙個單詞id「1」對應的單詞為「賈伯斯」,單詞「賈伯斯」的倒排列表為,即文件1、文件3、文件4、文件5都包含有單詞「賈伯斯」。
這上面的列表是最簡單的倒排索引,下面介紹一種更加複雜,包含資訊更多的倒排索引。
單詞id(wordid)
單詞(word)
倒排列表(docid;tf;)
1賈伯斯
(1;1;<1>),(3;1;<6>),(4;1;<1>),(5;1;<1>)2蘋果
(2;1;<1>),(3;1;<1>),(5;1;<5>)
3ipad2
(3;1;<8>),(4;1;<7>)4宣布
(3;1;<7>)5了
(1;1;<3>),(4;1;<3>)(5;1;<3>)……
…tf(term frequency): 單詞在文件**現的次數。
pos: 單詞在文件**現的位置。
這個**展示了更加複雜的倒排索引,前兩列不變,第三列倒排索引包含的資訊為(文件id,單詞頻次,《單詞位置》),比如單詞「賈伯斯」對應的倒排索引裡的第一項(1;1;<1>)意思是,文件1包含了「賈伯斯」,並且在這個文件中只出現了1次,位置在第乙個。
5 結語
全文檢索和倒排索引原理講解
正排表是以文件的id為關鍵字,表中記錄文件中每個字的位置資訊,查詢時掃瞄表中每個文件中字的資訊直到找出所有包含查詢關鍵字的文件。正排表結構如圖1所示,這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙個新的索引塊,掛接在...
ES倒排索引原理與實現過程 建立倒排索引的步驟
提取詞項 首先對文件進行分詞,英文文件使用空格分隔。去掉沒有實際意義的詞,如is a in as等 大小寫轉換,使用關鍵字elasticsearch 能把elasticsearch 和elasticsearch都查詢出來,因此所有的單詞統一大小寫。單 複數,過去式 進行時等進行轉換,如希望使用ind...
python 實現倒排索引,建立簡單的搜尋引擎
本文將用python實現倒排索引 如下,乙個資料表docu set中有三篇文章的,d1,d2,d3,如下 docu set 下面用這張表做乙個簡單的搜尋引擎,採用倒排索引 首先對所有文件做分詞,得到文章的詞向量集合 all words for i in docu set.values cut jie...