第3章 词典和容错式检索
3.1 用于词典的搜索结构
给定一个反向索引和一个查询,我们的第一个任务是确定每个查询词是否存在于词汇表中,如果是,则返回指向相应倒排记录表的指针。涉及在数据结构中定位词项。
数据结构:字典(dictionary )
两个解决方案:哈希表和搜索树(hashing and search trees.)
1.哈希表:在查询时,我们分别对每个查询词进行哈希操作,并返回一个指向相应倒排记录表的指针,并考虑解决哈希冲突。
√ 每个词项(键)被映射到一个整数上,在一个足够大的目标空间中,哈希结果的冲突可能性会减小;冲突可以通过辅助结构来解决,而辅助结构可以要求维护。
√ 优点:定位速度优于树的定位速度,时间复杂度为常数
√ 缺点:
(1)不能查询词项的变形(比如像resume这样的单词的重音和无重音的版本),因为它们可以被哈希映射成不同的整数。
(2)不能寻找带前缀的词项。
(3)随词汇量不断增长,为当前需求而设计的散列函数在几年内可能还不够。
2.搜索树:与哈希不同,搜索树要求文档集合中使用的字符有规定的顺序
(1)二叉树(binary tree):每个内部节点都有两个子节点。有效的搜索取决于树是否平衡:任何节点的两个子树下的词项的数量相等或是相差1。主要问题是再平衡,当从二叉搜索树中插入或删除词项时,需要重新平衡,以便保持平衡属性。为了减少再平衡,一种方法是允许内部节点下的子树的数量在一个固定的时间间隔内变化。
(2)B树(B-tree):B树被看作是将二叉树的多个层次折叠成一个,当某些字典是磁盘常驻时尤其有利。
√ 优点:支持前缀查询
√ 缺点:搜索速度低于哈希表,平衡树时间复杂度为O(log M),M为词汇表大小。
解决方案(哈希表或搜索树)的选择需要考虑如下:
(1)可能拥有多少个词项?
(2)词项数目会保持不变还是改变?在变化的情况下,只插入新的词项还是在字典中删除一些词项?
(3)各种词项的相对频率是多少?
3.2通配符查询(Wildcard queries)
在下列任何情况下使用通配符查询:
(1)不确定查询词的拼写(e.g., Sydney vs. Sidney, which leads to the wildcard query S*dney);
(2)拼写一个词项的多种变形,并寻找包含任何变形的文档(e.g., color vs. colour);
(3)用户寻找包含有可能被阻止的词项的变形的文档,但不确定搜索引擎是否执行了阻止 (e.g., judicial vs. judiciary, leading to the wildcard query judicia*);
(4)用户不确定正确的外来词或短语的翻译 (e.g., the query Universit* Stuttgart)。
·后通配符查询(trai