260 likes | 380 Views
索引和查找. 胡晓光 信息检索实验室. 提纲. 顺序查找 索引查找 签名文件 倒排文件 PAT 树( Patricia tree ) 关于压缩. 说明. 索引和查找的关系 索引和查找其实是密不可分的 建索引时必须不断的执行查找操作 查找和查询的区别 查找( search ) 如何在索引中定位关键词信息 查询( query ) Query 处理:如何根据用户输入确定关键词 检索模型:如何利用查找返回的信息计算相似度等 文本压缩和索引压缩的区别 注意文本压缩不能有效地减少索引文件的大小. 顺序查找. 精确匹配算法 Brute Force
E N D
索引和查找 胡晓光 信息检索实验室
提纲 • 顺序查找 • 索引查找 • 签名文件 • 倒排文件 • PAT树(Patricia tree) • 关于压缩
说明 • 索引和查找的关系 • 索引和查找其实是密不可分的 • 建索引时必须不断的执行查找操作 • 查找和查询的区别 • 查找(search) • 如何在索引中定位关键词信息 • 查询(query) • Query处理:如何根据用户输入确定关键词 • 检索模型:如何利用查找返回的信息计算相似度等 • 文本压缩和索引压缩的区别 • 注意文本压缩不能有效地减少索引文件的大小
顺序查找 • 精确匹配算法 • Brute Force • Knuth-Morris-Pratt • Boyer-Moore • Shift-Or • Suffix Automaton • 容错匹配算法 • Dynamic Programming • Non-deterministic Finite Automaton • Bit-Parallelism • 正则表达式和扩展模式
索引 • 索引文件 • 为方便查找,描述原文件信息组织的文件 • 签名文件,倒排文档,后缀树都是索引文件
签名文件 • Karp-Rabin匹配思想 • 假设我们现在要判断字符串A和字符串B是否匹配 • 把A和B分别散列成数字hash (A)和hash (B) • 如果hash (A) != hash (B) 则A != B • 然而hash (A) = hash (B) 不能说明 A =B • Karp-Rabin匹配例子 关键词 x[0..5 ]: A A C T C T Hash( x[0..5] ) = 17579 文本y[0..9 ]: G C A A C T C T C A Hash( y[0..5] ) = 17819 文本y[0..9 ]: G C A A C T C T C A Hash( y[1..6] ) = 17533 文本y[0..9 ]: G C A A C T C T C A Hash( y[2..7] ) = 17579
签名文件 • 文档的签名 • 把文档中的关键词散列成F位的位串Signature • 顺序访问原文档的关键词,把散列所得的位串依次存入文件 • 重叠编码(superimposed coding) • 我们不需要为每个关键词都保存一个Signature • 多个关键词共用一个Signature可以减少文件的长度 • 错误匹配(False drop) • 由于重叠编码和哈希冲突的原因,关键词和Signature不是一一对应的关系 • Signature匹配并不能保证关键词一定出现,还需要检查
签名文件 Block 1 Block2 Block3 Block4 This is a text. A text has manywords. Words are made from letters. 文本 000101 110101 100100 101101 签名文件 h(text) =000101 h(many) =110000 h(words) =100100 h(made) =001100 h(letters) =100001
签名文件 • 优点 • 文件组织简单,基本和原文档顺序一致 • 维护容易,生成,插入,删除都很方便 • 所需空间小,特别是采用重叠编码之后 • 缺点 • 检索速度慢,需要顺序扫描 • 并且,当False Drop发生的时候需要比较原文档 • 总之 • 签名文件是倒排文档和全文扫描之间的折中
倒排文件 • 倒排索引思想 • 每个文档都可以用一系列关键词来表示 • 如果按关键词建立到文档的索引便可以根据关键词快速地检索到相关文档 • 倒排文件组成 • 词汇表(Vocabulary) • 根据Heap’s定律,通常比较小O(n), : 0.4~0.6 • 通常我们称存放词汇表的文件为索引文件(index file) • 出现位置(Occurrence) • 较大,O(n),通常在原文本的30%~40% • 通常我们称存放出现位置的文件为置入文件(posting file)
倒排文件 1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has many words. Words are made from letters. Text Vocabulary Occurrences • addressing granularity: • inverted list – • word positions • character positions • inverted file – • document letters 60 … made 50 … many 28 … text 11, 19 … words 30, 40 …
倒排文件 • 块地址索引 • 有时候为了节省索引空间,可按块地址建索引 • 把原文划分为多个块,只记录关键词的块地址 Block1Block2Block3Block 4 This is a text. A text has many words. Words are made from letters. Vocabulary Occurrences Text letters 4 … made 4 … many 2 … text 1, 2 … words 3 … Inverted index
倒排文件 • 倒排文件的性能 • 时间代价主要取决于词汇表的组织方式 • 词表文件通常较小且比较固定 • 对于未登录词和数词可以按字建索引 • 空间代价主要取决于对置入文件的压缩能力 • 置入文件的压缩能减少IO操作,也能提高部分时间性能 • 词汇表文件的组织方式 • 采用Hash散列表 • 按字母表顺序有序排列 • 采用Trie树,B树等查找树 • 置入文件的压缩 • 通常采用差值压缩(delta compression)
倒排文件 • 词汇表的哈希存储 • 根据给定的关键字,散列成一个整数 • 用该整数作为词汇的访问地址 • 例如:如果我们按字索引,那么可以直接用字的编码 作为访问地址,对于2字节编码只需64K地址 • 优点 • 实现简单 • 速度极快 • 缺点 • 关键在于找到一个好的散列函数 • 随着现在散列空间的增大,问题相对简单 • 当冲突过多时效率会下降
倒排文件 • 词汇表的顺序排列 • 把词汇按照字典顺序排列 • 词汇的查找采用二分查找 • 优点 • 实现简单 词汇表体积小(通常只有几兆) • 缺点 • 索引构建的效率一般 • 对于插入的文档需要反复地调用排序和查找算法 • 排序的时间复杂度为N*log N (分配排序例外) • 索引合并时还需要堆排序等方法合并多个有序的词汇表 • 如果合并最主要的时间开销在于IO操作的话,这点还是次要的 • 检索的效率一般 • 二分查找logN的复杂度已经具有较好的效率 • 能不能变成和词汇数量无关的常数复杂度
倒排文件 • Lucene的词汇表即采用这种方式 • 假设现在词表中有16,000个词 • indexInterval=16 • 则在词表中需要查找次数为16+log(1000) = 26次
倒排文件 • 词汇表的查找树 • 把词汇表中的关键词以树的形式组织 • 二叉树,B树,Trie等 • 二叉查找树 • 考虑到平衡性,性能低于二分查找 • B树 • 是多路查找树,效率高于二叉树,实现更麻烦 • Trie 树 • 查找时间只跟词的长度有关 • 而于词表中词的个数无关 • 词表较大时才能体现出速度优势 • Log (词表长度) > E(词长) E表示期望
Trie树 • 什么是trie树 • trie树是一种用于快速检索的多叉树结构 • trie树把要查找的关键词看作一个字符序列。 • 根据这一序列构造用于检索的树结构。 • 在trie树上进行检索类似于查阅英语词典。 • 例如,电子英文词典,为了方便用户快速检索英语单词,可以建立一棵trie树。
词典单词:a、b、c、aa、ab、ac、ba、ca、 aba、abc、baa、bab、bac、cab、abba、baba、caba、abaca、caaba
Trie树 • 优点 • 查找效率高,与词表长度无关 • Trie树的查找效率只与关键词长度有关 • 目前我们分词词表最长的词为13个字 • “大不列颠及北爱尔兰联合王国” • 事实上索引词表中词过长会降低检索召回率 • 用户如果只输入“北爱尔兰”则无法返回该结果 • 索引的插入,合并速度快 • 注意,直接遍历Trie树需要搜索大量的无效节点 • 可以把数据存在一个数组中,Trie只保存指针 • 这样合并时,只需要对数组进行遍历即可 • 缺点 • 所需空间较大 • 如果是完全m叉树,节点数指数级增长 • 好在Trie不是,但所需空间仍然很大 • 不可达上限: 词数 ×字符序列长度 ×字符集大小 ×指针长度 • 例如:20000 × 6 × 256 ×4 =120M • 实现较复杂
差值压缩(Delta Compression) • 置入文件 • 置入文件必须包含如下信息 • 当前词出现的文档号ID,以及在文档中的位置Pos • 差值压缩 • 记录当前ID和前一ID的差值 • 记录当前Pos和前一Pos的差值 • 这样做能有效减少表示ID,Pos所需的字长 • 例如:关键词A在文档13,124,346中出现 如果不压缩,由于346>256,需要要两个字节 而346-124=222<256,只需一个字节 • 应用实例 • Lucene对词汇表和置入文件都采用了这种压缩
PAT树(Patricia tree) • 什么是Patricia树 • Patricia树是Trie树的压缩表示 • 所有只有一个子节点的节点都和父节点合并 • 后缀树(Suffix tree) • 以文本所有后缀为关键词的Patricia树 • 后缀树的引入主要是针对字符串的高效查找 • 子串查找 • 最长重复子串 • 最长公共子串 • 回文子串 • 后缀数组(Suffix array) • 按后缀树的先根遍历顺序,存储后缀
1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has manywords. Words are made from letters. Text Suffix Trie 60 ‘l’ 50 ‘d’ ‘m’ ‘a’ 28 space overhead: 120%~240% over the text size ‘n’ 19 ‘t’ ‘e’ ‘x’ ‘t’ ‘w’ 11 40 ‘o’ ‘r ‘d’ ‘s’ 33 60 Suffix Tree ‘l’ 50 ‘d’ ‘m’ 3 1 28 ‘n’ 19 ‘t’ 5 11 ‘w’ 40 6 33
difference between suffix array and inverted list • suffix array: the occurrences of each word are sorted lexicographically by the text following the word • inverted list: the occurrences of each word are sorted by text position 1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has manywords. Words are made from letters. Vocabulary Supra-Index Suffix Array Inverted list
关于压缩 • 文本压缩 • 只对文本预处理时所采用的编码压缩技术 • 顺序查找 • 文本压缩能有效减少文本的存储空间 • 由于查找空间减少,能有效提高查找速度 • 索引查找 • 文本压缩能减少词汇表的存储空间 • 文本压缩对置入文件的存储空间没有影响 • 查找效率(不考虑文本预处理时间) • 一方面增加了对查找关键词进行编码转换的时间 • 另一方面可以减少查找词表的时间 • 对于顺序词表,可以减少关键词比较时的时间 • 对于Trie 词表,可以使常用词用较短编码,减少E(词长)