1. 布尔检索概述

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

例如检索需求:哪些文档包含了Brutus及Caesar二词但不包含Calpurnia一词?
布尔表达式:Brutus AND Caesar AND NOT Calpurnia

2. 布尔索引方法

2.1. 关联矩阵索引

对于规模较小的的文档集(每一个文档中的词项少,文档数量少)。可以对文档集构建词项-文档(term-doc)的关联矩阵,如下图:
在这里插入图片描述
在上图中,每一列都是一个关联向量,该向量内的0、1分别表示在文档(蓝色)中是否出现某词项(褐色)。同样的,每一行中的0、1也可以表示该词项(褐色)在文档(蓝色)中出现。
在这里插入图片描述

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

同时满足既有Brutus,又有Caesar,同时没有Calpurnia的文档是Antony and CleopatraHamlet

2.2. 倒排索引
2.2.1. 倒排索引概述

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

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

首先,将文档名用文档ID代替,然后按某词出现文档ID序号从小到大排列,例如:
在这里插入图片描述
这样建立的索引不再稀疏,同时也无需使用连续空间存储。

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>二元组:
在这里插入图片描述

(3) 词条排序
首先将词条按某种方法进行排序,例如英文可以根据字母表进行排序;然后对排序后的列表再按文档ID进行排序,确保同一词条对应的ID较小的文档可以排在前面。
在这里插入图片描述
(4) 建立词典和倒排记录表
将出现多次的词项合并,并记录其出现的频数(在几个文档中出现过),之后按文档ID从小到大的顺序建立倒排记录表,并与词典进行链接:
在这里插入图片描述
至此,倒排索引已经建立完毕。

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. 布尔查询在倒排表上的优化

有两个简单的优化方法:

  1. 倒排表的文档ID升序排列
    正如在AND操作中演示的那样,文档ID升序排列可以尽量地提前结束对倒排表的操作,而不需要对两个倒排表从头到尾进行检索。
  2. 优先处理词频小的词项
    在复杂布尔表达式中,例如(tangerine OR trees) AND (marmalade OR skies) AND (kaleidoscope OR eyes),优先合并词频小的词项,生成文档数量少的词项,有利于结合上面的优化方法尽量地提前结束对倒排表的操作。

4. 布尔检索的优缺点

优点

  • 构建简单,或许是构建IR系统的一种最简单方式;
  • 易被接收,仍是目前最主流的检索方式之一;
  • 操作专业化,对于非常清楚想要查什么、能得到什么的用户而言,布尔检索是个强有力的检索工具。

缺点

  • 布尔查询构建复杂,不适合普通用户。如果构建不当, 检索结果就会过多或者过少;
  • 没有充分利用词项的频率信息;
  • 不能对检索结果进行排序。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐