信息检索导论读书笔记(五):索引压缩

在先前的章节中介绍了信息检索系统中两个主要数据结构:词典、倒排记录表。接下来将介绍对这两个数据结构的各种压缩技术。这些技术对于构建高效的IR系统非常关键。压缩的优点有:

  1. 节省磁盘空间,压缩比可以非常容易达到1:4以上
  2. 增加高速缓存技术的利用率,压缩后高速缓存中可以存放更多的信息
  3. 加快数据从磁盘到内存的传输速度,将压缩的数据块传输到内存并解压缩需要的总时间往往比将未压缩的数据块传输到内存快

索引压缩技术有下面两个特点:

  1. 压缩速度无须特别考虑,但要有高压缩率
  2. 解压缩速度必须快,以提高高速缓存利用率和磁盘到内存的传输率

信息检索中词项的统计特性:

为更好地实现索引压缩,首先我们掌握对待压缩对象的统计特性。比如30定律:出现频率最高的30个词在书面文本占了30%的出现比例。

Heaps定律:词项数目的估计

一种对词项数目M进行估计的方法是采用Heaps定律:  M=kT^b  。其中T是文档集合中的词条个数,k 和 b 的典型取值为30\leqslant k \leqslant 100, b\approx 0.5

Zipf定律:对词项的分布建模

排名第 i 多的词项的文档集频率 cf_i 与 1/i 成正比,即 cf_i \propto \frac{1}{i}

词典压缩

和倒排记录表相比,词典只占非常小的空间,但是依然要进行压缩。这是因为我们想将词典放入内存,或者说至少要把大部分词典放入内存,这样可以获得很高的查询吞吐量。

最简单的词典使用定长数组来存储词典,以下压缩方法压缩比均与该种形式的简单词典比较。定长数组的缺点是对于短词项浪费空间,并且无法存储超出长度的词项。

将词典看成单一字符串的压缩方法:

将所有词项存成一个长字符串,并给每个词项增加一个定为指针,它在指向下一个词项的同时也标识当前词项的结束。在这种新机制下可以压缩1/3的空间。

按块存储:

对单一字符串压缩之后的词典进一步按块压缩,将长字符串中的词项每 k 个分为一块,每块只保留第一个词项的指针,同时在每个词项首部用额外的一个字节记录词项长度。如此一来,对于每个块,减少了 k-1 个指针(4B)的空间,增加了 k 个记录长度字节(1B),显然 k 越大节省的空间越多,但是块内的查询只能是线性查询,查询速度下降,必须在两者之间权衡折中。

直到现在,此项之间的冗余性信息还没有利用。连续词项之间往往有共同前缀,因此可以使用前端编码,使用特殊符号代表共同的前缀进行压缩。(PS.看到这里又要哔哔两句,学计算机网络的时候DNS查询中的域名压缩也是用的这种方式!)。

一些其他具有更高压缩率的方法依赖于最小完美哈希,不发生冲突。但是对于动态环境下无法使用,因为内容一变就需要重新寻找完美哈希函数。

有些情况下词典无法完全载入内存,也需要划分成不同页存入磁盘,可以采用B树对每页第一个词项进行索引。

倒排索引表压缩

当文档集数量非常大时,倒排记录表中的文档ID需要用位数很多的整数来表示。为设计出一个更高效的倒排文件表示方式,可以对高频词的倒排记录进行处理,采用两个记录之间的间距(gap)来表示,而不使用真实文档ID,可以减小倒排记录占用空间。因此可以使用一种变长编码方法,对短间距采用更短的位数来表示。接下来对两种变长编码方式进行介绍:按字节压缩按位压缩

可变字节码

可变字节编码利用整数个字节对间距编码。字节的后7位是间距的有效编码区,而第1位是标志位(延续位)。如果该位为1,则表明本子节是某个间距编码的最后一个字节,否则不是。使用可变字节码压缩率可以超过50%。

根据上述思想,实际可以选择比字节更大或更小的位数作为编码单位。更多的位数需要操作的次数越少,但压缩率不高,更短的位数反之。对于大多数信息检索系统来说,可变字节码压缩方法能够在时间和空间之间达到一个非常好的平衡点,实现也相对简单。

\gamma 编码

基于位的编码能够在更细的位粒度上进行编码长度的自适用调整。最简单的是一元编码,数n的一元编码为n位1后面跟1位0,显然效率不高。

假定有 2^n 个间距,每个间距 G 满足 1\leqslant G\leqslant 2^n,且 G 取其中每个值得可能性相等,那么对每个 G 的最优编码长度是 n。一个和最优编码长度差距在常数倍之内的方法是 \gamma 编码。\gamma 编码将间距 G 表示成长度偏移两部分进行变长编码。其中偏移是将 G 的二进制编码去掉最高位的 1 之后的位,比如13(二进制1101),偏移为101,长度是偏移的长度的一元编码,比如13的便宜长度为3,因此长度是1110。在这种情况下,偏移部分编码长度为 \left \lfloor log_2G \right \rfloor,长度部分编码长度为 \left \lfloor log_2G \right \rfloor+1,全部编码长度为 2\times \left \lfloor log_2G \right \rfloor+1。编码长度永远为奇数位,与最优编码长度相差因子2。

\gamma 编码还具有两种适合索引压缩的性质:

  1. 前缀无关。即一个 \gamma 编码不会是另一个 \gamma 编码的前缀,这意味着 \gamma 编码只有唯一的解码结果,无需对编码切分,切分会导致解码效率下降
  2. 参数无关。对其他很多高效编码方式,需要对模型的参数进行拟合使之适应索引中间距的分布情况,而这样做会加大压缩和解压缩的实现复杂性,并且动态变化的文档集会导致分布变化,原有的参数可能不再合适。

像 \gamma 编码这种编码长度在最优编码长度的某个倍数之内的编码方式被称为通用性编码

 

下图是针对Reuters-RCV1文档集进行上述各项压缩之后的实际效果。可以看到采用 \gamma 编码压缩率比可变字节码高15%,但是相应的解码效率会低于可变字节码,主要原因在于,采用位编码时两个编码之间的分界点可能存在某个机器字中,因此对 \gamma 编码解码时需要很多诸如移位或者掩码之类的位操作。在具体应用时应当根据对查询速度及存储空间的实际情况选用。

信息检索导论读书笔记(五):索引压缩_第1张图片

 

 

你可能感兴趣的:(信息检索导论读书笔记)