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

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

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系统的一种最简单方式;

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

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


缺点:


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

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

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


相关文章
|
2月前
|
自然语言处理 关系型数据库 MySQL
如何在mysql数据库里进行文本的相似度排序?
【8月更文挑战第28天】如何在mysql数据库里进行文本的相似度排序?
217 62
|
4月前
|
存储 NoSQL Redis
深入解析RedisSearch:全文搜索的新维度
深入解析RedisSearch:全文搜索的新维度
|
5月前
|
人工智能 自然语言处理 Cloud Native
向量检索服务在语义检索、知识库搭建、AI多模态搜索等场景中有着广泛的应用
向量检索服务在语义检索、知识库搭建、AI多模态搜索等场景中有着广泛的应用
189 0
|
5月前
|
存储 机器学习/深度学习 搜索推荐
Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?
Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?
119 3
|
5月前
|
传感器 大数据 物联网
大数据类型与特征
【4月更文挑战第9天】大数据包含交易、人为、移动及机器传感器数据,特征表现为大量、高速、多样、可变、真实、复杂和有价值。它影响商业决策、市场分析和科学研究,展现巨大潜力。
110 3
|
存储 缓存 人工智能
如何让聊天机器人更懂你?Tair向量检索给你答案
Tair是阿里云企业级内存数据库,广泛应用于电商、游戏等各领域,兼容Redis生态(可平替开源Redis),并且同时具备向量检索能力,实现了缓存+向量二合一。
如何让聊天机器人更懂你?Tair向量检索给你答案
|
机器学习/深度学习 搜索推荐 数据管理
语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引
语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引
语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引
|
数据采集 机器学习/深度学习 自然语言处理
文本处理技能与文本数据清洗、提取、分词与统计
文本处理技能与文本数据清洗、提取、分词与统计
|
自然语言处理 算法 数据库
现代信息检索——索引构建
现代信息检索——索引构建
现代信息检索——索引构建
|
5月前
|
算法 关系型数据库 分布式数据库
0 PolarDB 开源版通过pg_similarity实现17种文本相似搜索 - token归一切分, 根据文本相似度检索相似文本
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过pg_similarity实现17种文本相似搜索...
92 0