索引压缩
目录
索引压缩:对词典和倒排记录表这两个数据结构进行压缩。
为什么需要压缩?
- 使用更少的磁盘空间
节省资金
- 在内存中存放更多信息
提高速度
- 提高数据从磁盘传输到内存的速度
读取压缩数据|解压缩 比 读取未压缩数据 快得多
前提:解压缩算法是高效的
词典尽可能全部放在内存中,如果放不下,
倒排表没有办法全部放在内存中,把查询最多的词项的倒排表放在内存。
词典:
- 使其足以存放在内存中
- 使内存可以多容纳一些倒排记录表
倒排记录表:
- 减少所需的磁盘空间
- 减少从磁盘中读取倒排记录表所需的时间
- 大型搜索引擎将一部分倒排记录表保存在内存中(压缩使内存能保存更多的倒排记录表)
两种压缩方式:
无损压缩:所有原始信息都保留(大多数IR系统的做法)
有损压缩:大小写转换,词干还原,停用词...
会造成一定的信息丢失,但是有时候对检索没影响
信息检索中词项的统计特性
- 词项的个数:Heaps定律
- 词项在文档出现的次数,有的词项出现的多,有的词项出现的次数少:Zipf定律
文档集频率:一个词项在文档集中总共出现次数
文档频率:一个词项在几个文档中出现,倒排索引一部分。
区别:词A中文档1中出现了3次,文档频率只算1个,但文档集频率算3
Heaps定律
词项数目的估计
- Heaps’ 定律: M = kTb
- M 是词汇表大小, T 是文档集中的词条个数
- 参数k和b的典型取值为: 30 ≤ k ≤ 100 , b ≈ 0.5
- Heaps定律认为,在对数空间中词汇量 M 和 T,存在线性关系
Zipf定律
对词项分布的建模
自然语言中存在一些高频词项,也存在一些极低频词项
- Zipf’s 定律: 排名第i多的词项的文档集频率与1/i 成正比.
- cfi 是 文档集频率: 文档集中排名第i多的词项的文档集频率.
- cfi ∝ 1/i = K/i ,K 是一个常量
- 如果出现最多的词项的出现次数是cf1的话
- 出现第二多的词项的出现次数就是 cf1的一半
- 出现第三多的词项出现次数是cf1的1/3 …
- 等价变换: cfi = K/i ,其中k=1, 因此
- log cfi = log K - log i
- log cfi 和 log i 是线性关系
词典压缩
定长数组(浪费空间)——长字符串(完全不浪费空间)——按块存储(继续减少词项指针占的空间)—— 前端编码
定长数组(浪费空间,11.2MB)——长字符串(完全不浪费空间,7.6MB)——按块存储(继续减少词项指针占的空间,7.1MB)——前端编码(5.9MB)
用定长数组来存储词典中的词项。
——浪费空间。词项没那么长,为了存储很长的单词为每个词项使用同样大的小存储空间。
terms:词项,每个词项采用20个字节来存储。
Freq:文档频率(查询优化使用,也要存储),4个字节
postings ptr:倒排表指针,4个字节
词典需要存储词项、文档频率、倒排表三部分,压缩重点在词项上。
每个词项用20个字节浪费。
about:占6个 computer:占9个 20个:有些词项太长
初始时直接设20个,为了容纳很 长的单词,为每个词项都 安排了20个字节
缺点:浪费空间,一般单词都没20个那么长
例子:
定长数组这种方法花多少空间来存储400K个词项
每个词项需要存三部分(词项本身20,文档频率4,倒排表指针4)
400K
0.4M*(20+4+4)=11.2MB
做实验:先用小数据集来做实验,再应用到大型的数据集。
单词的平均长度为8字节。