信息檢索導論學習筆記(6)-索引壓縮


索引壓縮

為什么要壓縮?

  • 增加內存存儲內容, 增加高速緩存(caching)技術的利用率(加快速度)
  • 加快從磁盤到內存的數據傳輸速度 (同樣加快速度)。(讀壓縮數據到內存+在內存中解壓)比直接讀入未壓縮數據要快很多。(前提: 解壓速度要很快)
  • 減少磁盤空間 (節省開銷)

詞典壓縮:

詞典壓縮的主要動機: 使之能夠盡量放入內存中

倒排記錄表壓縮:
倒排記錄表壓縮的主要動機: 減少磁盤存儲空間,減少從磁盤讀入內存的時間
注意: 大型搜索引擎將相當比例的倒排記錄表都放入內存

 

有損(Lossy) vs 無損(Lossless)壓縮
有損壓縮: 丟棄一些信息。前面講到的很多常用的預處理步驟可以看成是有損壓縮:統一小寫,去除停用詞, Porter詞干還原, 去掉數字
無損壓縮: 所有信息都保留。索引壓縮中通常都使用無損壓縮

 

信息檢索中詞項的統計特性

詞項數目(即詞匯表(詞典) 大小)的估計:Heaps定律    M = kTb

M 是詞匯表大小, T 是文檔集的大小(文檔集合中所有詞條的個數,即所有文檔大小之和)
參數k 和b 的一個經典取值是: 30 ≤ k ≤ 100 及 b ≈ 0.5.

 

Heaps定律通過文檔集合中的詞條數來估計詞匯表大小,詞匯表大小會隨着文檔集的大小增長而增長!

Heaps定律結論:

  1. 隨着文檔數目的增加,詞匯量會持續增長而不會穩定到一個最大值。
  2. 大規模文檔集的詞匯量也會非常大。

詞項分布的估計:Zipf定律   cfi ∝ (1/i)

如果出現最多的詞項的出現次數是 cf1的話,出現第二多的詞項的出現次數就是 cf1的一半,出現第三多的詞項出現次數會是 cf1的 1/3,其余均可依此類推。

注:cfi 是文檔頻率(collection frequency): 詞項ti在所有文檔中出現的次數(不是出現該詞項的文檔數目df)

 

詞典壓縮

根據Heaps定律,詞典會隨着文檔集的增加而持續增長,因此為了能夠把詞典全部都放在內存中,我們必須要對其進行壓縮。

 

回顧: 定長數組方式下的詞典存儲

需要空間:詞項+文檔頻率+倒排記錄表指針(20+4+4)*M

大量存儲空間被浪費(英語中每個詞項的平均長度為8個字符),即使是長度為1的詞項,我們也分配20個字節。
不能處理長度大於20字節的詞項。

 

定長數組方式進行優化:將所有的詞項存成一個長字符串並給每個詞項增加一個定位指針,它在指向下一詞項的指針同時也標識着當前詞項的結束。

需要空間:詞項+文檔頻率+倒排記錄表指針+指向字符串的指針(8+4+4+3)*M

Image(18)

 

進一步壓縮:將長字符串中的詞項進行分組變成大小為k 的塊(即 k 個詞項一組) ,然后對每個塊只保留第一個詞項的指針。同時,我們用一個額外字節將每個詞項的長度存儲在每個詞項的首部。

Image(19)

 

再進一步壓縮:回顧詞典是按字母排序的,詞項之間的冗余性信息還沒有利用,實際上,按照詞典順序排序的連續詞項之間往往具有公共前綴。

前端編碼(Front coding):當某個詞和前一個詞有共同的前綴的時候,后面的詞僅僅保存前綴在詞中的偏移(offset),以及除前綴以外的字符串(稱為后綴)。

8automata8automate9automatic10automation可以采用前端編碼方式繼續壓縮為8automat*a1◇e2◇ic3◇ion
多個連續詞項具有公共前綴 automat,那么在前綴的末尾用“ *” 號標識,在后續的詞項中用“◇” 表示該前綴。和前面一樣,每個詞項的前面第一個字節存儲了該詞項的長度

 

倒排記錄表壓縮

對間隔編碼: 存儲docID間隔而不是docID本身 

Image(20)

 

可變字節(VB)碼

  • 變長的整數類型,它可能包含多個Byte,對於每個Byte的8位,其中后7位表示數值,最高1位表示是否還有另一個Byte,0表示沒有,1表示有。 
  • 越前面的Byte表示數值的低位,越后面的Byte表示數值的高位。 
  • 例如130化為二進制為 1000, 0010,總共需要8位,一個Byte表示不了,因而需要兩個Byte來表示,第一個Byte表示后7位,並且在最高位置1來表示后面還有一個Byte,所以為(1) 0000010,第二個Byte表示第8位,並且最高位置0來表示后面沒有其他的Byte了,所以為(0) 0000001。

一元編碼

如果為數n,則n個1后面添一個0。例如3→ 1110

 

Elias gamma編碼

Wiki地址:http://en.wikipedia.org/wiki/Elias_gamma_coding

  1. 將G 表示成長度(length)和偏移(offset)兩部分
  2. 偏移對應G的二進制編碼,只不過將首部的1去掉。例如 13 → 1101 → 101 = 偏移
  3. 長度部分給出的是偏移的位數。比如G=13 (偏移為 101), 長度部分為 3。長度部分采用一元編碼: 1110.
  4. 於是G的Elias gamma編碼就是將長度部分和偏移部分兩者聯接起來得到的結果。13→1110,101

Elias delta編碼

Wki地址:http://en.wikipedia.org/wiki/Elias_delta_coding

對於大數字來說,γ 編碼的效率相對較低,這是因為在對偏移部分長度進行編碼的時候采用了效率並不高的一元編碼,在這點上,δ 編碼和 γ編碼不一樣,即偏移長度部分進行編碼並不采用一元編碼,而是采用 γ 編碼。

例如13的長度部分采用γ 編碼為101,13→101,101

注:δ 編碼和 γ編碼有等價編碼方法,估最后編碼結果可能會有所不同


免責聲明!

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



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