1、Introduction to Information Retrieval,现代信息检索,中国科学院大学2017年秋季课程现代信息检索 更新时间:,Modern Information Retrieval,*改编自”An introduction to Information retrieval”网上公开的课件,地址 http:/nlp.stanford.edu/IR-book/,第5讲 索引压缩 Index compression,1,2017/9/19,提纲,2,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,提纲,3,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,4,基
2、于块的排序索引构建算法BSBI,4,5,5,内存式单遍扫描索引构建算法SPIMI,关键思想 1: 对每个块都产生一个独立的词典 不需要在块之间进行term-termID的映射 关键思想2: 对倒排记录表不排序,按照他们出现的先后顺序排列 基础上述思想可以对每个块生成一个完整的倒排索引 这些独立的索引最后合并一个大索引,5,现代信息检索,现代信息检索,6,SPIMI-Invert算法,6,7,7,基于MapReduce的索引构建,7,8,8,动态索引构建:最简单的方法,在磁盘上维护一个大的主索引(Main index)新文档放入内存中较小的辅助索引(Auxiliary index)中同时搜索两个
3、索引,然后合并结果定期将辅助索引合并到主索引中一种更好的方法:对数索引,保证合并的两个索引合并具有同等大小,8,9,9,本讲内容,信息检索中进行压缩的动机 倒排索引中词典部分如何压缩? 倒排索引中倒排记录表部分如何压缩? 词项统计量: 词项在整个文档集中如何分布?,9,提纲,10,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,现代信息检索,现代信息检索,什么是压缩?,将长编码串用短编码串来代替 111111111111111111 18个1,11,12,为什么要压缩? (一般意义上而言),减少磁盘空间 (节省开销) 增加内存存储内容 (加快速度) 加快从磁盘到内存的数据传输速度 (同
4、样加快速度) 读压缩数据到内存+在内存中解压比直接读入未压缩数据要快很多 前提: 解压速度很快 本讲我们介绍的解压算法的速度都很快,12,13,13,为什么在IR中需要压缩?,首先,需要考虑词典的存储空间 词典压缩的主要动机: 使之能够尽量放入内存中 其次,对于倒排记录表而言 动机: 减少磁盘存储空间,减少从磁盘读入内存的时间 注意: 大型搜索引擎将相当比例的倒排记录表都放入内存 IR中压缩的两个基本要求 (通常是)无损压缩 随机访问 ( Random Access) 接下来,将介绍词典压缩和倒排记录表压缩的多种机制 压缩的一个基本问题:对齐。即不同压缩单元之间的分界标识,13,14,14,有
5、损(Lossy) vs. 无损(Lossless)压缩,有损压缩: 丢弃一些信息 前面讲到的很多常用的预处理步骤可以看成是有损压缩: 统一小写,去除停用词, Porter词干还原, 去掉数字无损压缩: 所有信息都保留 索引压缩中通常都使用无损压缩,14,提纲,15,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,现代信息检索,现代信息检索,词典压缩和倒排记录表压缩,词典压缩中词典的大小即词汇表的大小是关键 能否预测词典的大小?倒排记录表压缩中词项的分布情况是关键 能否对词项的分布进行估计?引入词项统计量对上述进行估计,引出两个经验法则,16,17,对文档集建模: Reuters RCV
6、1,17,18,18,预处理的效果,%:与上一步相比的变化百分比 T%:与未过滤相比的变化百分比,18,19,19,第一个问题:词汇表有多大(即词项数目)?,即有多少不同的单词数目? 首先,能否假设这个数目存在一个上界? 不能:对于长度为20的单词,有大约7020 1037 种可能的单词 实际上,词汇表大小会随着文档集的大小增长而增长! Heaps定律: M = kTb M 是词汇表大小, T 是文档集的大小(所有词条的个数,即所有文档大小之和) 参数k 和b 的一个经典取值是: 30 k 100 及 b 0.5. Heaps定律在对数空间下是线性的 这也是在对数空间下两者之间最简单的关系 经
7、验规律,19,现代信息检索,现代信息检索,Reuters RCV1上的Heaps定律,实线:真实分布;虚线:拟合分布 词汇表大小M 是文档集规模T的一个函数 图中通过最小二乘法拟合出的直线方程为:log10M =0.49 log10T + 1.64于是有:M = 101.64T 0.49k = 101.64 44b = 0.49,20,21,拟合 vs. 真实,例子: 对于前1,000,020个词条, 根据Heaps定律预计将有38,323个词项:44 1,000,0200.49 38,323 实际的词项数目为38,365,和预测值非常接近 经验上的观察结果表明,一般情况下拟合度还是非常高的,
8、21,22,22,课堂练习,在容许拼写错误或者对拼写错误自动纠错的情况下,Heaps定律的效果如何? 计算词汇表大小 M 观察一个网页集合,你会发现在前10000个词条中有3000个不同的词项,在前1000000个词条中有30000个不同的词项 假定某搜索引擎索引了总共20,000,000,000 (2 1010)个网页, 平均每个网页包含200个词条 那么按照Heaps定律,被索引的文档集的词汇表大小是多少?,22,23,23,第二个问题:词项的分布如何?Zipf定律,Heaps定律告诉我们随着文档集规模的增长词项的增长情况 但是我们还需要知道在文档集中有多少高频词项 vs. 低频词项。 在
9、自然语言中,有一些极高频词项,有大量极低频的罕见词项 Zipf定律: 第i常见的词项的频率cfi 和1/i 成正比cfi 是文档频率(collection frequency): 词项ti在所有文档中出现的次数(不是出现该词项的文档数目df),23,24,24,Zipf定律,Zipf定律: 第i常见的词项的频率cfi 和1/i 成正比cfi 是文档频率(collection frequency): 词项ti在所有文档中出现的次数(不是出现该词项的文档数目df). 于是,如果最常见的词项(the)出现cf1 次,那么第二常见的词项 (of)出现次数为 . . . 第三常见的词项 (and) 出现
10、次数为 另一种表示方式: cfi = cik 或 log cfi = log c +k log i (k = 1) 幂定律(power law)的一个实例,24,25,25,Reuters RCV1上Zipf定律的体现,拟合度不是非常高,但是最重要的是如下关键性发现:高频词项很少,低频罕见词项很多,25,提纲,26,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,27,词典压缩,一般而言,相对于倒排记录表,词典所占空间较小但是我们想将词典放入内存另外,满足一些特定领域特定应用的需要,如手机、机载计算机上的应用或要求快速启动等需求因此,压缩词典相当重要,27,28,28,回顾: 定长数组
11、方式下的词典存储,空间需求: 20 字节 4 字节 4 字节 对Reuters RCV1语料: (20+4+4)*400,000 = 11.2 MB,28,29,29,定长方式的不足,大量存储空间被浪费 即使是长度为1的词项,我们也分配20个字节不能处理长度大于20字节的词项,如 HYDROCHLOROFLUOROCARBONS 和SUPERCALIFRAGILISTICEXPIALIDOCIOUS而英语中每个词项的平均长度为8个字符能否对每个词项平均只使用8个字节来存储?,29,30,30,将整部词典看成单一字符串(Dictionary as a string),30,31,31,单一字符串
12、方式下的空间消耗,每个词项的词项频率需要4个字节 每个词项指向倒排记录表的指针需要4个字节 每个词项平均需要8个字节 指向字符串的指针需要3个字节 (8*400000个位置需要log2(8 * 400000) 24 位来表示) 空间消耗: 400,000 (4 +4 +3 + 8) = 7.6MB (而定长数组方式需要11.2MB),31,32,32,单一字符串方式下按块存储,32,现代信息检索,现代信息检索,按块存储下的空间消耗,如果不按块存储,则每4个词项指针将占据空间4 3=12B现在按块存储,假设块大小k=4,此时每4个词项只需要保留1个词项指针,但是同时需要增加4个字节来表示每个词项
13、的长度,此时每4个词项需要3+4=7B因此,每4个词项将节省12-7=5B于是,整个词典空间将节省400,000/4*5B=0.5MB最终的词典空间将从7.6MB压缩至7.1MB,33,34,不采用块存储方式下的词项查找,34,35,35,采用块存储方式下的词项查找: 稍慢,35,现代信息检索,现代信息检索,前端编码(Front coding),每个块当中 (k = 4),会有公共前缀 . . .8 a u t o m a t a 8 a u t o m a t e 9 a u t o m a t i c 10 a u t o m a t i o n. . . 可以采用前端编码方式继续压缩8
14、a u t o m a t a 1 e 2 i c 3 i o n,36,37,Reuters RCV1词典压缩情况总表,37,38,38,课堂练习,哪些前缀应该用于前端编码?需要在哪些方面有所权衡?输入: 词项列表,即词汇表输出: 用于前端编码的前缀列表,38,提纲,39,上一讲回顾 压缩 词项统计量 词典压缩 倒排记录表压缩,40,倒排记录表压缩,倒排记录表空间远大于词典,至少10倍以上 压缩关键:对每条倒排记录进行压缩 目前每条倒排记录表中存放的是docID. 对于Reuters RCV1(800,000篇文档), 当每个docID可以采用4字节(即32位)整数来表示 当然,我们也可以采
15、用log2 800,000 19.6 20 位来表示每个docID. 我们的压缩目标是: 压缩后每个docID用到的位数远小于20比特,40,41,41,关键思想: 存储docID间隔而不是docID本身,每个倒排记录表中的docID是从低到高排序 例子: COMPUTER: 283154, 283159, 283202, . . . 存储间隔能够降低开销:283159-283154=5, 283202-283154=43 于是可以顺序存储间隔(第一个不是间隔) : COMPUTER: 283154, 5, 43, . . . 高频词项的间隔较小 因此,可以对这些间隔采用小于20比特的存储方式
16、,41,42,42,对间隔编码,42,43,43,变长编码,目标: 对于 ARACHNOCENTRIC 及其他罕见词项, 对每个间隔仍然使用20比特 (bit位) 对于THE及其他高频词项,每个间隔仅仅使用很少的比特位来编码为了实现上述目标,需要设计一个变长编码(variable length encoding) 可变长编码对于小间隔采用短编码而对于长间隔采用长编码,43,44,44,可变字节(VB)码,被很多商用/研究系统所采用 变长编码及对齐敏感性(指匹配时按字节对齐还是按照位对齐)的简单且不错的混合产物 设定一个专用位 (高位) c作为延续位(continuation bit) 如果间隔
17、表示少于7比特,那么c 置 1,将间隔编入一个字节的后7位中 否则:将高7位放入当前字节中,并将c 置 0,剩下的位数采用同样的方法进行处理,最后一个字节的c置1(表示结束) 从高到低编码,44,45,45,VB 编码的例子,45,46,46,VB 编码算法,46,130 mod 128 = 2 bytes 数组 130 div 128 = 1, prepend 到 bytes数组 于是循环结束有 bytes=2,1 算法最后一步,是在byteslength(bytes)上加128,即延续位置1,47,47,VB编码的解码算法,47,当延续位为1,bytestreami128,因此 if by
18、testreami128 判断的是数字之间界线,48,48,其它编码,除字节外,还可以采用不同的对齐单位:比如32位(word)、16位及4位(nibble)等等如果有很多很小的间隔,那么采用可变字节码会浪费很多空间,而此时采用4位为单位将会节省空间最近一些工作采用了32位的方式 参考讲义末尾的参考材料,48,49,49,编码,另外一种变长编码是基于位的编码 编码是其中最出名的一种 首先,在介绍编码之前先介绍一元码(unary code) 一元码: 将 n 表示成 n 个1和最后一个0 比如: 3的一元码是 1110 40的一元码是 111111111111111111111111111111
19、11111111110 70的一元码是: 11111111111111111111111111111111111111111111111111111111111111111111110,49,50,50,编码,将G (Gap, 间隔) 表示成长度(length)和偏移(offset)两部分 偏移对应G的二进制编码,只不过将首部的1去掉 例如 13 1101 101 = 偏移 长度部分给出的是偏移的位数 比如G=13 (偏移为 101), 长度部分为 3 长度部分采用一元编码: 1110. 于是G的编码就是将长度部分和偏移部分两者联接起来得到的结果。,50,51,51,编码的例子,51,52,5
20、2,课堂练习,计算130的可变字节码 计算130的编码,52,现代信息检索,现代信息检索,编码的长度,偏移部分是 log2 G 比特位 长度部分需要 log2 G + 1 比特位 因此,全部编码需要2log2 G + 1比特位 编码的长度均是奇数 编码在最优编码长度的2倍左右 假定间隔G的出现频率正比于log2 G实际中并非如此) (assuming the frequency of a gap G is proportional to log2 G not really true),53,54, 编码的性质, 编码是前缀无关的,也就是说一个合法的 编码不会是任何一个其他的合法 编码的前缀,也
21、保证了解码的唯一性。 编码在最优编码的2或3倍之内 上述结果并不依赖于间隔的分布! 因此, 编码适用于任何分布,也就说 编码是通用性(universal)编码 编码是无参数编码,不需要通过拟合得到参数,54,55,55, 编码的对齐问题,机器通常有字边界 8, 16, 32 位按照位进行压缩或其他处理可能会较慢可变字节码通常按字边界对齐,因此可能效率更高除去效率高之外,可变字节码虽然额外增加了一点点开销,但是在概念上也要简单很多,55,56,56,Reuters RCV1索引压缩总表,56,57,57,总结,现在我们可以构建一个空间上非常节省的支持高效布尔检索的索引 大小仅为文档集中文本量的1
22、0-15% 然而,这里我们没有考虑词项的出现位置和频率信息 因此,实际当中并不能达到如此高的压缩比,57,58,58,本讲小结,信息检索中进行压缩的动机 倒排索引中词典部分如何压缩?长字符串方法及改进 倒排索引中倒排记录表部分如何压缩?可变字节码、 编码 词项统计量: 词项在整个文档集中如何分布? 两个定律,58,59,59,参考资料,信息检索导论第5章 http:/ifnlp.org/ir 有关字对齐二元编码的原文Anh and Moffat (2005); 及 Anh and Moffat (2006a) 有关可变字节码的原文Scholer, Williams, Yiannis and Zobel (2002) 更多的有关压缩 (包括位置和频率信息的压缩)的细节参考Zobel and Moffat (2006),59,现代信息检索,现代信息检索,课后练习,有待补充,60,