文章目录
- 什么是信息检索
- 词项-文档矩阵
- 倒排索引
- 构建过程
- 前三步
- 最后一步
- 布尔检索模型
- 布尔查询的处理
- 查询优化
- 如何存储词典
- 哈希表
- 树
- 有序检索模型
- 对基本布尔操作的扩展
- 短语查询和位置索引
- 短语查询
- 第一个解决方案
- 第二个解决方案
- 更快的索引表合并
什么是信息检索
信息检索是从大规模非结构化数据的集合中找出满足用户信息需求的资料的过程
按照处理数据的规模进行区分
- 以Web搜索为代表的大规模级别
- 面向企业和特定领域搜索等的中等规模
- 个人信息检索等小规模
一些基本概念
- 文档:指的是信息检索系统的检索对象
- 文档集 / 语料库:由所有文档组成
- 信息需求:指的是用户想查找的信息主题,和查询不同
词项-文档矩阵
线性扫描是一种最简单的计算机文档检索方式,但有些情况下线性扫描不适用
- 大规模文档集条件下的快速查找
- 需要更灵活的匹配方式 :Romans NEAR countrymen
- 需要对结果进行排序
解决:构建词项-文档关联矩阵,词项是索引的单位
问题:数据量大的时候,不适用
- 数据量大的时候,关联矩阵的内存巨大
- 稀疏矩阵
显然,只记录原始矩阵中1的位置的表示放大比词项-文档矩阵更好。由此引出倒排索引。
倒排索引
- 每个词项都有一个记录出现该词项的所有文档的列表
- 表中的每个元素被称为倒排记录(posting)
- 每个词项对应的整个表称为倒排记录表 / 倒排表(posting list)(按文档id从小到大排序)
- 所有词项的倒排表一起构成全体倒排记录表(postings)
构建过程
- 收集文档
- 词条化:将每篇文档转换成一个个词条(token)的列表
- 归一化:进行语言学预处理,产生归一化的词条来作为词项
- 建立倒排索引(一部词典和一个全体倒排记录表)
- 词典放在内存中
- 全体倒排记录表太大,放在磁盘中
前三步
最后一步
- 得到了归一化的词条表
- 将列表按照词项的字母顺序排序(建立索引中最核心的步骤)
- 最后结果:词典 + 倒排记录表
- 词典中存储词项,文档频率,指向倒排索引表的指针
- 存储:倒排记录表可以用单链表或变长数组,或混合
布尔检索模型
布尔检索模型接受布尔表达式,即通过 and or not等逻辑操作符将词项连接起来的查询。每篇文档只被看成是一系列词的集合
布尔检索的问题:
- 一个普遍问题就是,用 A N D AND AND 操作符产生的结果正确率高但是召回率低。用 O R OR OR操作符召回率高但是正确率低
布尔查询的处理
通过具有精准语义的逻辑表达式再来构建查询,得到的是无序的结果集
-
考虑简单的 “与” 查询
- 首先在词典中定位一次词,然后返回其倒排索引表
-
合并操作使用双指针,需要 O(x + y) 次操作,时间复杂度为 O(N) , N 是文档集合中文档的数目
查询优化
- 概念:指的是如何通过组织查询的处理过程来使处理工作量最小
-
按照词项的文档频率(倒排索引表的长度)从小到大依次处理:因为中间结果的长度不会超过最短的倒排记录表
- 添加文档频率可以决定访问次序
如何存储词典
我们在进行查询的时候,首要任务是确定每个查询词项是否在词汇表中,如果在,则返回该词项对应的倒排记录表的指针
词汇表的查找操作采用称为字典的数据结构,有两大类解决方案:哈希表方式 和 搜索树方式
哈希表
-
每个词项通过哈希函数(自己设计的)映射成一个整数
-
优点:查询速度很快
-
缺点:
- 无法处理轻微变形和前缀式查询
- 失效快
树
-
B树
-
类似于平衡二叉树(任何节点两棵子树下的词项数目要么相等要么差1)
-
root区分词的开头,分为 a – m 和 a – z
-
子孩子节点区分词的开头,将以 a – hu 开头和以 ht – m 开头的词分开 ⋯ ⋯ \cdots \cdots ⋯⋯
-
每个内部节点的子节点数目在区间[a , b]内取值(放宽平衡的条件)
-
-
优点:解决了前缀问题(查询以 xxx 为开头的词)
-
缺点:
- 查询速度不如哈希快
- 需要平衡数,平衡很费力
- 但是B树减轻了这个问题
有序检索模型
- 和布尔检索模型相对
- 不通过具有精准语义的逻辑表达式再来构建查询
- 采用一个或多个词来构成自由文本查询
- 要能够确定哪篇文档最能满足用户需求
对基本布尔操作的扩展
短语查询和位置索引
短语查询
第一个解决方案
-
双词索引:将连续的两个词都作为短语
-
长短语索引:拆分成双词索引
- 可能出现的问题:出现false positive的情况,即有些文档不含有这个短语,我们也返回了
- 确实含有这三个biword,但是不是拼在一起的,可能是不同位置的
- 可能出现的问题:出现false positive的情况,即有些文档不含有这个短语,我们也返回了
-
双词索引的问题
第二个解决方案
-
位置信息索引:在索引表中记录每个 term 出现的位置
-
缺点:位置信息索引极大地增加了索引表的存储空间。
- 即使如此,由于其强大的短语索引和邻近查询功能,该方法被广泛应用
-
应用:短语索引和邻近查询
-
邻近查询
- 这里可以用位置信息索引的方法,但是双词索引的方法就不适用了
-
-
更快的索引表合并
-
Skip pointers
- 对于一个长度为 L L L 的索引表,可以选择设置 L \sqrt{L} L 个skip pointers