索引壓縮

索引壓縮

信息檢索中有兩個(gè)主要數(shù)據(jù)結(jié)構(gòu):詞典和倒排記錄表,索引壓縮主要是壓縮這兩個(gè)數(shù)據(jù)結(jié)構(gòu)。索引壓縮的優(yōu)點(diǎn):

  • 節(jié)省磁盤空間
  • 增加高速緩存技術(shù)的利用率
  • 加快數(shù)據(jù)從磁盤到內(nèi)存的傳輸速度

對(duì)解壓縮算法的要求:必須快

30定律

出現(xiàn)頻率最高的30個(gè)詞在書(shū)面文本中占了30%的出現(xiàn)比例。

無(wú)損壓縮與有損壓縮

無(wú)損壓縮是指壓縮之后所有的信息都被保留。有損壓縮則會(huì)丟掉一些信息,但會(huì)得到更高的壓縮率。

Heaps定律

一個(gè)對(duì)詞項(xiàng)數(shù)據(jù)進(jìn)行估計(jì)的方法是采用Heaps 定律:

M = k T^b

? 其中T是文檔集合的詞條個(gè)數(shù),30 <= k <= 100, b 約等于 0.5。Heaps定律認(rèn)為:文檔集合大小和詞匯量之間可能存在的最簡(jiǎn)單的關(guān)系是他們?cè)趯?duì)數(shù)空間中存在現(xiàn)象關(guān)系,并且這種線性關(guān)系往往和實(shí)際情況相吻合。

Heaps定律提出了兩個(gè)假設(shè):

  • 隨著文檔數(shù)目的增加,詞匯量會(huì)持續(xù)增長(zhǎng)而不會(huì)穩(wěn)定到一個(gè)最大值
  • 大規(guī)模文檔集的詞匯量會(huì)非常大

Zipf定律

一個(gè)常用的估計(jì)詞項(xiàng)在文檔中分布的模型是Zipf定律:在給定的語(yǔ)料中,對(duì)于任意一個(gè)term,其頻度(freq)的排名(rank)和freq的乘積大致是一個(gè)常數(shù)。如果t1 是文檔集合中出現(xiàn)最多的詞項(xiàng),t2是文檔集合中出現(xiàn)第二多的詞項(xiàng),以此類推,排名第i多的詞項(xiàng)的文檔集合頻率cfi 與 1/ i成正比

cf~i \propto \frac 1 i

詞典壓縮

詞典壓縮的主要目的是將詞典放入內(nèi)存,或者說(shuō)至少要把大部分詞典放入內(nèi)存,這樣才能獲得很高的查詢吞吐率。主要有兩種壓縮方式

  • 將詞典看成單一字符串的壓縮方法:整個(gè)詞典采用定長(zhǎng)數(shù)組來(lái)存儲(chǔ)且所有詞項(xiàng)按照字典順序排序
  • 按塊存儲(chǔ):將長(zhǎng)字符串中的詞項(xiàng)進(jìn)行分組變成大小為k的塊(即k個(gè)詞項(xiàng)一組),然后每個(gè)塊只保留第一個(gè)詞項(xiàng)的指針,同時(shí)用一個(gè)額外字節(jié)將每個(gè)詞項(xiàng)的長(zhǎng)度存儲(chǔ)在每個(gè)詞項(xiàng)的首部。

倒排記錄表的壓縮

主要思想是對(duì)文檔ID的間距而不是文檔ID進(jìn)行編碼。主要有以下方式:

  • 可變字節(jié)碼(VB):每個(gè)字節(jié)的低7位是二進(jìn)制數(shù),高位是一個(gè)決定位。編碼的最后一個(gè)字節(jié)高位位置為1,位置為0。處理器一般是以字節(jié)為處理單位,所以Variable ByteCode速度快,但是處理大數(shù)據(jù)壓縮比不高
  • γ編碼:一個(gè)和最優(yōu)編碼長(zhǎng)度差距在常數(shù)倍之內(nèi)的方法是γ 編碼。γ 編碼將間距G表示成長(zhǎng)度(length)和偏移(offset)兩個(gè)部分進(jìn)行變長(zhǎng)編碼。G的偏移實(shí)際上是G的二進(jìn)制編碼,但是前端的1 被去掉①。比如,對(duì)13(二進(jìn)制為1101)進(jìn)行編碼,其偏移為101。G的長(zhǎng)度指的是偏移的長(zhǎng)度,并采用一元編碼。對(duì)于剛才的例子,偏移的長(zhǎng)度是3 位,因此其長(zhǎng)度部分的編碼是1110。因此,13 的整個(gè)γ 編碼是1110101,即長(zhǎng)度部分1110 和偏移部分101 的連接。表5-5 中的右列中給出了一些其他數(shù)的γ 編碼的例子。
    對(duì)γ 編碼解碼時(shí),首先讀入一元編碼直至遇到0 結(jié)束,比如在對(duì)1110101 解碼時(shí),會(huì)一開(kāi)始讀入前4 位1110。然后便知道后面的偏移部分的長(zhǎng)度是3,因此,再正確讀入后續(xù)的3 位編碼101,補(bǔ)上原來(lái)去掉的前端的1,最后可以得到 101→1101 = 13。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容