现代信息检索——布尔检索

简介: 现代信息检索——布尔检索

1. 布尔检索概述


针对布尔查询的检索,布尔查询是指利用 AND, OR 或者 NOT操作符将词项连接起来的查询。


例如检索需求:哪些文档包含了Brutus及Caesar二词但不包含Calpurnia一词?

布尔表达式:Brutus AND Caesar AND NOT Calpurnia


2. 布尔索引方法


2.1. 关联矩阵索引


对于规模较小的的文档集(每一个文档中的词项少,文档数量少)。可以对文档集构建词项-文档(term-doc)的关联矩阵,如下图:

0a2653c851af460fa595bd959398a8f1.png

在上图中,每一列都是一个关联向量,该向量内的0、1分别表示在文档(蓝色)中是否出现某词项(褐色)。同样的,每一行中的0、1也可以表示该词项(褐色)在文档(蓝色)中出现。


2d65d23f6d4748949b924e4057485923.png


有了这样一个关联矩阵后,就可以进行布尔查询了,回到一开始提到的布尔表达式:Brutus AND Caesar AND NOT Calpurnia,很容易就找出:


6de278e6d6694ce5bb08e7e842b7e74b.png


同时满足既有Brutus,又有Caesar,同时没有Calpurnia的文档是Antony and Cleopatra和Hamlet。


2.2. 倒排索引


2.2.1. 倒排索引概述


但是我们很容易发现,一旦文档集变大,关联矩阵的实用性将大大降低。假定现在有一百万篇文档(1M),每篇有1000个词(1K),每个词平均有6个字节,那么所有文档将约占6GB 空间。同时由于庞大的词项数,导致关联矩阵高度稀疏,使关联矩阵的搜索效率不高。


基于此,提出了倒排索引来解决关联矩阵的问题。所谓倒排,是对于关联矩阵而言的,在关联矩阵中,我们统计的是一个文档内出现的词项,这种方法稀疏度高(0很多)。所以我们转换思路,统计一个词项在哪些文档中出现过。


首先,将文档名用文档ID代替,然后按某词出现文档ID序号从小到大排列,例如:

8ec4f2997fb246878c34ecd6d122b7c6.png

这样建立的索引不再稀疏,同时也无需使用连续空间存储。


2.2.2. 倒排索引建立


(1) 文本预处理


词条化(Tokenization)

将字符序列切分为词条,例如将“You are welcome.” 切分为 you、are、welcome三个词条。也需要解决诸如 “John’s”('s怎样处理?),“state-of-the-art” 算一个还是四个词条?的问题;

规范化(Normalization)

将文档和查询中的词项映射到相同的形式,例如U.S.A. 和 USA应当看做同一个词;

词干还原(Stemming)

将同一词汇的不同形式还原到词根,例如authorize, authorization是同一词根,在检索时应当都列出,避免用户在检索时可能出现的描述不准确现象;

停用词去除(Stopwords removal)

去除高频但意义不大词项,例如the、a、to、of。

(2) 建立词条序列

简单来说就是将预处理后的词条和它们所属的文档一起建立<词条, 文档ID>二元组:


12c3b7f3f8814309a195c64f051d4445.png


(3) 词条排序

首先将词条按某种方法进行排序,例如英文可以根据字母表进行排序;然后对排序后的列表再按文档ID进行排序,确保同一词条对应的ID较小的文档可以排在前面。

34e8d716411043c08c7ffba9fbba23de.png

(4) 建立词典和倒排记录表

将出现多次的词项合并,并记录其出现的频数(在几个文档中出现过),之后按文档ID从小到大的顺序建立倒排记录表,并与词典进行链接:

92ba0822ed0b46e1ae72df8a17d3a45b.png

至此,倒排索引已经建立完毕。


3. 布尔查询的处理


3.1. 布尔查询在倒排表上的操作


AND (Brutus AND Caesar)

两个倒排表的交集

OR (Brutus OR Caesar)

两个倒排表的并集

NOT (Brutus AND NOT Caesar)

两个倒排表的减集


3.2. AND查询的处理


考虑实现布尔查询表达式:Brutus AND Caesar


首先应该在词典中定位 Brutus和Caesar,并返回两个词项的倒排表。


然后为每个倒排表定义一个定位指针,两个指针同时从前往后扫描,每次比较当前指针对应的倒排记录,然后再向后移动指向文档ID较小的那个指针或在文档ID相等时同时两个指针,直到某一个倒排表被检索完毕。


这样就能轻易找出符合Brutus AND Caesar的文档,有:文档1、文档2和文档4。


OR和NOT的同理类似,只是对倒排表的操作不同。注意NOT操作不能简单理解为某一词项的补集,因为补集可能会很大,必须是两个倒排表的减集。


3.3. 布尔查询在倒排表上的优化


有两个简单的优化方法:


倒排表的文档ID升序排列

正如在AND操作中演示的那样,文档ID升序排列可以尽量地提前结束对倒排表的操作,而不需要对两个倒排表从头到尾进行检索。

优先处理词频小的词项

在复杂布尔表达式中,例如(tangerine OR trees) AND (marmalade OR skies) AND (kaleidoscope OR eyes),优先合并词频小的词项,生成文档数量少的词项,有利于结合上面的优化方法尽量地提前结束对倒排表的操作。


4. 布尔检索的优缺点


优点:


构建简单,或许是构建IR系统的一种最简单方式;

易被接收,仍是目前最主流的检索方式之一;

操作专业化,对于非常清楚想要查什么、能得到什么的用户而言,布尔检索是个强有力的检索工具。


缺点:


布尔查询构建复杂,不适合普通用户。如果构建不当, 检索结果就会过多或者过少;

没有充分利用词项的频率信息;

不能对检索结果进行排序。


相关文章
|
存储 并行计算 算法
C++进程间通信之共享内存
C++进程间通信之共享内存
1261 0
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
1022 0
|
网络协议 算法 数据库
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
|
机器学习/深度学习 人工智能 自然语言处理
一分钟认识:claude中文版_claude官网中文版
Claude AI 是由 Anthropic 开发的一款先进的对话式人工智能模型,它的名字来源于信息论之父——克劳德·香农 🧙‍♂️。
|
存储 Linux BI
Linux 三剑客 grep、sed、awk
Linux三剑客`grep`、`sed`和`awk`是强大的文本处理工具。`grep`用正则表达式搜索匹配行;`sed`是流式编辑器,处理文本流而不直接修改原文件;`awk`则用于灵活的文本分析和报告生成。例如,`grep`可查找匹配模式,`sed`可以删除文件内容,而`awk`能提取特定字段。通过组合使用,它们能高效解决复杂文本任务。
338 1
|
Kubernetes API 数据中心
在K8S中,pause容器作用是什么?
在K8S中,pause容器作用是什么?
|
传感器 Web App开发 机器学习/深度学习
计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
1357 0
计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
|
开发框架 前端开发 Swift
SwiftUI的优缺点
SwiftUI的优缺点
603 0
|
监控 关系型数据库 MySQL
C#程序发布时,一定要好好地保护,不然你会后悔的
C#程序发布时,一定要好好地保护,不然你会后悔的
280 0
|
芯片
触发器基础知识(中)
JK触发器是在同步RS触发器的基础上引入两条反馈线构成的。
1438 0
触发器基础知识(中)