文章目錄
- 3.biword inverted index
- 折中策略:
建立倒排記錄表之前一、檔案的編碼
一般一個檔案都是以位元組的方式儲存的,如果想要讓其可讀,就必須要通過正確的編碼方式轉換成字元;就像Java IO一樣,如果沒有通過正確的編碼方式開啟一個檔案,會出現亂碼。因此在一系列處理步驟之前,知道文檔的編碼是重要的。一般在文檔的meta data部分都會儲存編碼方式。
二、索引粒度
索引粒度的選取也是很重要的。因為如果把索引粒度選的太大,比如你想找Information Retrieval,如果索引粒度為整本書,則只要出現Information和Retrieval的書都會被選中,這非常不精確。
三、Tokenization
詞條化:這個方法就像Java中StringTokenizer的用法,將一個文檔(長的字串)切分成一個個小單詞。
Token:詞條化後的一個個單詞;
Type:將詞條化的單詞放入集合後的結果。
Term:將Type進行歸一化後的結果,即dictionary中能找到的詞。
比如 a apple and a banana ;有5個token,4個type(a合并),2個Term(去除停用詞);
四、Stop words
停用詞就是一些很常用的詞,比如the , a 等;這些詞因為出現的次數很多,每篇文檔都會出現,所以如果要讓他也在倒排索引中,則會引起posting過大的情況。
注意:
(1)有時去除停用詞的方法也會有問題,比如:to be or not to be,to be 都是停用詞,那麼查詢變成了 or not,則意義完全不一致。
(2)去除停用詞是應用於文檔和查詢的,在文檔中,不對停用詞構建倒排索引,而在查詢中,也去除停用詞,只將其他詞做索引。
去除停用詞缺點:會使表達的語義不一致,比如from Shanghai to BeiJing;變成Shanghai Beijing 則語義會不一致;
五、等價類別
如果有一個等價類別:{A,B,C,D};如果需要查詢A,則等同於查詢A,B,C,D;
而Normalization就是利用等價類別,常用的方法是:大小寫轉換(case folding);
注意:
(1)大小寫轉換也會有缺點:比如C.A.T,會轉換成cat ,偏離了原本意義。
(2)等價類別也是同時應用於查詢和文檔的。
六、stemming和lemmatization
Stemming:簡單的通過截取的方式去除首碼和尾碼。比如solution,變成 solu;
詞幹還原能夠提高查全率,降低查准率;因為比如respective和respectability都轉換成respect,但是意義卻不一樣,因此在查詢respectability時,會通過stemming轉換成respect,並且查詢到respective。
stemming能夠降低dictionary的大小;
Porter演算法:一種針對英文,有效詞幹分析的演算法。
Porter預先會給出一些mapping:
tion--->空
IES---->I
等等;
規則1:去除尾碼後長度大於1;
規則2:當多條匹配時,則取最長的。
Lemmatization:通過詞典的分析來進行合理地去除詞綴,比如men,變成man;
lemma:詞形分析後得到的單詞;
注意:詞幹還原和詞形分析是對文檔和查詢詞使用的,因此在建立索引是就會把respective和respectability解析成一個respect,即dictionary中是respect,posting是這兩個詞的docID的並集。而在查詢時如果查詢的詞是respective,則會進行詞幹還原,並變成respect後在倒排索引中尋找。
倒排記錄表的結構1.含有Skip pointer的inverted index
原本的倒排記錄表合并演算法需要O(m+n),但是如果使用了跳錶,則可以達到次線性時間。
在posting中包含skip pointer,可以跳過那些肯定不在結果中的docID,並且只適用於AND操作。
通常:每(根號p)處放一個倒排指標,p為倒排記錄表的長度;
比如:有16個docID,如下:
則每四個放置一個跳錶,即1-->5,5-->9,9-->13,13-->17;
注意:這種方法適用於倒排索引穩定的前提;
2.positional inverted index
在posting的每個docID後面跟上單詞出現的位置,比如:apple -----> 1(2,3,4) ;2(4,5,6);
注意:positional index可以進行鄰近搜尋,而二元詞不能。
缺點:倒排記錄表的posting太大。
應用:處理鄰近查詢。
採用positional index進行合并需要的複雜度是O(T); T是文檔集中詞條數目;
3.biword inverted index
將兩個詞看成一個item,即在dictionary中都是兩個詞為一組。
比如invert and revert,則會變成invert and和and revert;但是這種做法使得倒排記錄表迅速變大。
這種方法的缺點很多:
(1)不適用於單詞查詢。
(2)倒排記錄表太大。
(3)查詢有時還不正確。需要進行後過濾(即在查詢片語中過濾一遍)
折中策略:
(1)對於單個單詞出現次數非常多,而組成一個片語後出現次數大大減少的片語,用biword index;
(2)對於那些經常被使用者查詢的片語,使用biword index;
(3)其餘使用positional index;