索引压缩
信息检索中有两个主要数据结构:词典和倒排记录表,索引压缩主要是压缩这两个数据结构。索引压缩的优点:
- 节省磁盘空间
- 增加高速缓存技术的利用率
- 加快数据从磁盘到内存的传输速度
对解压缩算法的要求:必须快
30定律
出现频率最高的30个词在书面文本中占了30%的出现比例。
无损压缩与有损压缩
无损压缩是指压缩之后所有的信息都被保留。有损压缩则会丢掉一些信息,但会得到更高的压缩率。
Heaps定律
一个对词项数据进行估计的方法是采用Heaps 定律:
其中T是文档集合的词条个数,30 <= k <= 100, b 约等于 0.5。Heaps定律认为:文档集合大小和词汇量之间可能存在的最简单的关系是他们在对数空间中存在现象关系,并且这种线性关系往往和实际情况相吻合。
Heaps定律提出了两个假设:
- 随着文档数目的增加,词汇量会持续增长而不会稳定到一个最大值
- 大规模文档集的词汇量会非常大
Zipf定律
一个常用的估计词项在文档中分布的模型是Zipf定律:在给定的语料中,对于任意一个term,其频度(freq)的排名(rank)和freq的乘积大致是一个常数。如果t1 是文档集合中出现最多的词项,t2是文档集合中出现第二多的词项,以此类推,排名第i多的词项的文档集合频率cfi 与 1/ i成正比
词典压缩
词典压缩的主要目的是将词典放入内存,或者说至少要把大部分词典放入内存,这样才能获得很高的查询吞吐率。主要有两种压缩方式
- 将词典看成单一字符串的压缩方法:整个词典采用定长数组来存储且所有词项按照字典顺序排序
- 按块存储:将长字符串中的词项进行分组变成大小为k的块(即k个词项一组),然后每个块只保留第一个词项的指针,同时用一个额外字节将每个词项的长度存储在每个词项的首部。
倒排记录表的压缩
主要思想是对文档ID的间距而不是文档ID进行编码。主要有以下方式:
- 可变字节码(VB):每个字节的低7位是二进制数,高位是一个决定位。编码的最后一个字节高位位置为1,位置为0。处理器一般是以字节为处理单位,所以Variable ByteCode速度快,但是处理大数据压缩比不高
- γ编码:一个和最优编码长度差距在常数倍之内的方法是γ 编码。γ 编码将间距G表示成长度(length)和偏移(offset)两个部分进行变长编码。G的偏移实际上是G的二进制编码,但是前端的1 被去掉①。比如,对13(二进制为1101)进行编码,其偏移为101。G的长度指的是偏移的长度,并采用一元编码。对于刚才的例子,偏移的长度是3 位,因此其长度部分的编码是1110。因此,13 的整个γ 编码是1110101,即长度部分1110 和偏移部分101 的连接。表5-5 中的右列中给出了一些其他数的γ 编码的例子。
对γ 编码解码时,首先读入一元编码直至遇到0 结束,比如在对1110101 解码时,会一开始读入前4 位1110。然后便知道后面的偏移部分的长度是3,因此,再正确读入后续的3 位编码101,补上原来去掉的前端的1,最后可以得到 101→1101 = 13。