索引压缩
定义:将长编码串用短编码串来代替 111111111111111111 18个1
-
优点
节省磁盘空间(节省开销)
增加高速缓存(caching)技术的利用率(加快速度)
-
压缩能够加快数据从磁盘到内存的传输速度(同样加快速度)
- [读压缩数据到内存+在内存中解压]比直接读入未压缩数据要快很多
有损(Lossy) vs. 无损(Lossless)压缩
-
有损压缩:丢弃信息
预处理步骤可以看成是有损压缩
-
回顾:CH2 词项词典与倒排记录表
构建倒排记录表步骤:
收集文档--(词条化、停用词)词条 -- (相同合并)词条类--(归一化处理、词干还原)词项—根据词项简历索引
停用词:a an the to
词条归一化:轿车、卡车—车;扩展词表:windows -Windows操作系统、windows、window
词干还原:am is are -- be
-
无损压缩: 所有信息都保留
- 索引压缩中通常都使用无损压缩
词项统计特性
-
对文档RCV1建模、
Conclusion:预处理对词典大小和无位置信息倒排记录的数目影响很大
三十定律(rule of 30)是指,出现频率 最高的 30%个词在书面文本占了 30%的出现比例(表中的精确数字是 31%)。如果剔除出现频 率最高的 150 个词(将它们当成停用词),则无位置信息的倒排记录数目会减少 25%~30%。然而,尽管通过去除频率最高的 150 个停用词能够将倒排记录的个数减少 1/4 或更 多,但是索引的压缩比例并不能达到这种减少量
-
Heaps定律:
-
M:词汇表大小
T :文档集合中的词条个数
参数 k 和 b 的典型取值为:30≤ k ≤ 100,b≈0.5。
对词项数目 M 进行估计为文档集大小的函数,文档集大小和词汇量之间可能存在的最简单的关系是它们在对数空间(log-log space) 中存在线性关系
-
RCV1上的Heaps定律
当 T > = 100 000 时, 曲线和真实情况非常吻合,此时的参数值为 b = 0.49,k = 44
-
-
对于前 1 000 020 个词条, Heaps 定律会估计得到大约 38 323 个词项,即
,实际的数目是 38365
-
-
Zipf 定律:(除了知道随着文档集的增长词项如何增长,还需要知道在文档集中有多少高频词项 vs. 低频词项。)
-
:词项在所有文档中出现的次数
第i常见的词项的频率cfi 和1/i 成正比
如果出现最多的词项的出现次数是 cf1,出现第二多的词项的出现次数就是 cf1 的一半,出现第三多的词项出现次数会是 cf1的 1/3,其余均可依此类推。随着词项出现次数排名的下降,其出现频率也迅速下降
-
其它表示方法:
-
c
c为常数,k=-1
k=−1 情况下的幂定律
-
RCV1上Zipf表现 定律所对应的直线 logcfi =logc−logi。(数据和直线并不十分吻合
-
文学作品中的实际分布
-
图1-a是中国古文字材料的字频和排序间的关系, 可以看出它们大致满足Zipf分布;
图1-b是秦朝之后的文字材料中的字频和排序间的关系, 它们明显不符合Zipf分布;
图1-c是现代中国文字材料中的字频,他们也不具有Zipf规律
图1-d是《毛泽东选集》中的字频和《莎士比亚选集》中的词频分布比较, 2条曲线具有显著差异
摘自:汉语言文学作品中词频的Zipf分布 知网查看:https://kns.cnki.net/KXReader/Detail?TIMESTAMP=637454595659256093&DBCODE=CJFD&TABLEName=CJFD2009&FileName=BSDZ200904025&RESULT=1&SIGN=V8Dp7KiC7ZxusYFCjQ4rOyV%2fRsY%3d
-
-
-
-
词典压缩
-
为什么对词典压缩
相对于倒排记录表,词项较小
搜索从词典开始
将词典放入内存
手机或者嵌入式设备通常只有很小的内存 。即使词典不存入内存中,我们也希望它能比较小, 以便搜索能快速启动
-
词典存储 -- 定长数组
-
-
缺陷
大部分的字节都被浪费
上述定长机制也无法存储长度超过 20 字符的词项
英语中每个词项的平均长度为8个字符
-
-
解决2方式——将所有词项视为长字符串
-
将所有的词项存成一个长字符 串并给每个词项增加一个定位指针,它在指向下一词项的指 针同时也标识着当前词项的结束
-
存储结构与大小
(1byte=8bits
-
-
按块存储
-
思路:将长字符串中的词项进行分组变成大小为k 的块(即k 个词项一组),然后对每个块只保留第一个词项的指针。同时,我们用一个额外字节将每个词项的长度存储在每个词项的首部。对每个块只保留第一个词项的指针
对每个块而言,可以减少k−1 个 词项指针,但是需要额外的k个字节B 来保存k 个词项的长度。
-
例子
k=4,每个词项的首部存储向每个词项的长度
一组中有4个词项,原来需要4个指针,现在需要1个指针;节省3个指针9B的开销,多出4B的长度存储,每 k=4 个词项就会节省出 5B,与不分块相比能节省0.5MB
最终的词典空间将从7.6MB压缩至7.1MB
-
压缩的极限
- 当400000个词项为一组时,400 000 × (4 + 4 + 1 + 8) = 6.8 MB
- k个词项为一组,可节省B空间,额外开销B空间,当k最大时,压缩空间的极限为B空间,当k=400000时,能节省约B,为0.8MB,B
-
-
词典搜索
k 越大,压缩率也越高。但是,在压缩和词项查找速度之间必须要保持某种平衡。
搜索词项方式-未压缩VS按块存储
-
未压缩
假定图 5-6(a)中每个后续词项的出现概率都相等
在未压缩的词典中查找 的平均时间为步(0 + 12 + 24 + 3 ) / 8≈ 1.6 步
-
k=4压缩
平均查找时间为(0 + 12 + 22 + 3*2 + 4 ) / 8 = 2 步
通过增加 k,可以把词典压缩到无限趋近于最小值 400 000 × (4 + 4 + 1 + 8) = 6.8 MB,但此时词典的查找会因为 k 很大而慢得不可忍受。
-
-
前端编码
上述压缩均没有利用词项之间的冗余性,词典排序时相邻词项往往有公共前缀
定义:公共前缀被识别出来之后,后续的词项中便可以使用一个特殊的字符来表示这段前缀
-
压缩效果比较
倒排记录表压缩
-
倒排记录表特征
§倒排记录表空间远大于词典,至少10倍以上
RCV1文档集中无位置信息索引中的倒排记录数目为100000000
目前每条倒排记录表中存放的是docID. 不考虑位置与词频
-
表示
当每个docID可以采用4字节(即32位)整数来表示
也可以采用log2 800,000 ≈ 19.6 < 20 位来表示每个docID.
-
目标
- 压缩目标是: 压缩后每个docID用到的位数远小于20比特
-
存储文档ID间隔
例子: COMPUTER: 283154, 283159, 283202, . . .
可以顺序存储间隔(第一个不是间隔) : COMPUTER: 283154, 5, 43, . . .
绝大多数间距存储空间都远小于20bit
-
编码
-
VB(Variable byte, 可变字节)
目标:对于arachnocentric等罕见词汇, 我们使用20bit/间距项 ; 对于the等常见词汇,我们使用1bit/间距项
定义:利用整数个字节来对间距编码。字节的后 7 位是间距的有效编码区,而第 1 位是延续位(continuation bit)。如果该位为 1,则表明本字节是某个间距编 码的最后一个字节,否则不是。要对一个可变字节编码进行解码,可以读入一段字节序列,其 中前面的字节的延续位都为 0,而最后一个字节的延续位为 1
-
图解
-
基于位的编码
-
一元码
- 表示:§将 n 表示成 n 个1和最后一个0
-
ϒ编码
表示:长度(length)和偏移(offset)
13 → 1101 → 101 = 偏移 §G=13 (偏移为 101), 长度部分为 3
-
-
特点
偏移部分是 ⌊log2 G⌋ 比特位,长度部分需要 ⌊log2 G⌋ + 1 比特位,全部编码需要2⌊log2 G⌋ + 1比特位
§ϒ 编码的长度均是奇数
§ϒ 编码在最优编码长度的2倍左右(有些间距(这里是G = 2n )的编码不可能少于log2G位的压缩目标就是尽可能 地接近这个下界
-
-