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

举个简单的例子:莎士比亚的哪部剧本包含Brutus及Caesar 但是不包含Calpurnia?布尔表达式为:Brutus AND Caesar AND NOTCalpurnia。最笨的方法是线性扫描的方式:从头到尾扫描所有剧本,对每部剧本判断它是否包含Brutus和Caesar ,同时又不包含Calpurnia。这个方法缺点如下:速度超慢(特别是大型文档集)、处理NOT Calpurnia 并不容易(一旦包含即可停止判断)、不太容易支持其他操作(例如find the word Romans nearcountrymen)、不支持检索结果的排序(即只返回较好的结果)。

一种非线性扫描的方式是事先给文档建立索引(index),假定我们对每篇文档(这里是剧本)都事先记录它是否包含词表中的某个词,结果就会得到一个由布尔值构成的词项—文档关联矩阵,如下图:

为响应查询Brutus AND Caesar AND NOTCalpurnia,我们分别取出Brutus、Caesar及Calpumia 对应的行向量,并对 Calpumia对应的向量求反,然后进行基于位的与操作,得到:

110100 AND110111 AND 101111 = 100100

结果向量中的第1和第4个元素为1,这表明该查询对应的剧本是Antonyand Cleopatra和Hamlet。

检索效果的评价标准一般为 正确率和 召回率。正确率(Precision)表示返回结果文档中正确的比例,如返回80篇文档,其中20 篇相关,正确率1/4;召回率(Recall)表示全部相关文档中被返回的比例,如返回80篇文档,其中20 篇相关,但是总的应该相关的文档是100篇,召回率1/5。正确率和召回率反映检索效果的两个方面,缺一不可。全部返回,正确率低,召回率100%,只返回一个非常可靠的结果,正确率100%,召回率低。因此引入了 F度量,如下:

回到刚才的例子,我们显然不能再采用原来的方式来建立和存储一个词项—文档矩阵,假定N = 1百万篇文档(1M), 每篇有1000个词(1K),每个词平均有6 个字节( 包括空格和标点符号),那么所有文档将约占6GB 空间,假定词汇表的大小( 即词项个数)为50万,即500K,则词项—文档矩阵=500K x 1M=500G。我们可以对上述例子做个粗略计算,由于每篇文档的平均长度是1000个单词,所以100万篇文档在词项—文档矩阵中最多对应10亿(1 000×1 000 000 )个1,也就是在词项—文档矩阵中至少有99.8%(1 - 10亿/5000亿)的元素为0。很显然,只记录原始矩阵中1 的位置的表示方法比词项—文档矩阵更好。

上述思路就引出了倒排索引。对每个词项t,记录所有包含t的文档列表,每篇文档用一个唯一的docID来表示,通常是正整数,如1,2,3...通常采用变长表方式来存储docID列表。倒排索引如下图:

注意,词典部分往往放在内存中,而指针指向的每个倒排记录表则往往存放在磁盘上。词典按照字母顺序进行排序,而倒排记录表则按照文档ID号进行排序。倒排索引的构建过程如下图:

索引构建过程如下:文档生成词项——词项排序——合并,如下三幅图:

考虑如下查询:Brutus AND Calpurnia,步骤如下:

(1)在词典中定位Brutus ;

(2)返回其倒排记录表;

(3)在词典中定位Calpurnia ;

(4)返回其倒排记录表;

(5)对两个倒排记录表求交集,如下图所示:

上述合并算法的伪代码描述如下:

下面考虑查询优化的问题,查询优化(query optimization )指的是如何通过组织查询的处理过程来使处理工作量最小。对布尔查询进行优化要考虑的一个主要因素是倒排记录表的访问顺序。一个启发式的想法是,按照词项的文档频率(也就是倒排记录表的长度)从小到大依次进行处理,如果我们先合并两个最短的倒排记录表,那么所有中间结果的大小都不会超过最短的倒排记录表,这样处理所需要的工作量很可能最少。如下图,就是先计算两个短的倒排记录表的and运算。

对于任意的布尔查询,我们必须计算并临时保存中间表达式的结果。但是,在很多情况下,不论是由于查询语言本身的性质所决定,还是仅仅由于这是用户所提交的最普遍的查询类型,查询往往是由纯“与” 操作构成的。在这种情况下,不是将倒排记录表合并看成两个输入加一个不同输出的函数,而是将每个返回的倒排记录表和当前内存中的中间结果进行合并,这样做的效率更高而最初的中间结果中可以调入最小文档频率的词项所对应的倒排记录表。该合并算法是不对称的:中间结果表在内存中而需要与之合并的倒排记录表往往要从磁盘中读取。此外,中间结果表的长度至多和倒排记录表一样长,在很多情况下,它可能会短一个甚至多个数量级。在倒排记录表的长度相差很大的情况下,就可以使用一些策略来加速合并过程。对于中间结果表,合并算法可以就地对失效元素进行破坏性修改或者只添加标记。或者,通过在长倒排记录表中对中间结果表中的每个元素进行二分查找也可以实现合并。另外一种可能是将长倒排记录表用哈希方式存储,这样对中间结果表的每个元素,就可以通过常数时间而不是线性或者对数时间来实现查找。

参考:

信息检索导论——ChristopherD. Manning等著

中科院-现代信息检索ppt——王斌

布尔检索及其查询优化相关推荐

  1. 《introduction to information retrieval》信息检索学习笔记1 布尔检索

    第1章 布尔检索 信息检索的定义:信息检索(IR)是从大型集合(通常存储在计算机上)中寻找满足信息需求的非结构化性质(通常是文本)的材料(通常是文档). 1.1一个信息检索的例子 问题描述:确定莎士比 ...

  2. Information Retrieval(信息检索)笔记01:Boolean Retrieval(布尔检索)

    Information Retrieval(信息检索)笔记01:Boolean Retrieval(布尔检索) 什么是信息检索(Information Retrieval) 布尔检索(Boolean ...

  3. 1信息检索-布尔检索-倒排索引

    提示: 信息检索 布尔检索 倒排索引 布尔查询 文章目录 信息检索 举个例子(词项-文档关联矩阵一个题目) 相关术语及概念 倒排索引 倒排索引示例 倒排索引构建 布尔查询处理(案例) 两个倒排记录表的 ...

  4. 信息检索技术——布尔检索

    前一阵子和大家分享了一系列排序算法,希望对大家能够有一些帮助.从今天开始,本人打算开展一个新的领域,介绍一下信息检索相关的技术.信息检索技术可以说现如今发展非常迅速,使用也极其广泛,甚至可以说是随处可 ...

  5. 信息检索格式 布尔检索式

    信息检索格式 布尔检索式 名称 符号 表达式 功能 逻辑与 * 或and AB 同时含 有提问词A和B的文献,为命中文献 逻辑或 + 或or A+B 凡是含有提问词A或B的文献,为命中文献 逻辑非 - ...

  6. 布尔检索——短语检索,含位置索引与双词索引

    目录 前言 一.对文本进行分词 二.获取文本文件 三.词法分析 四.布尔检索类 五.调用 总结 前言 此专栏记录信息检索课程的学习. 部分代码框架来自温柔的助教小哥哥. Talk is cheap. ...

  7. 信息检索格式 布尔检索式

    信息检索格式 布尔检索式 名称 符号 表达式 功能 逻辑与 * 或and AB 同时含 有提问词A和B的文献,为命中文献 逻辑或 + 或or A+B 凡是含有提问词A或B的文献,为命中文献 逻辑非 - ...

  8. 布尔文献检索模型简介

    在没有网络的时候,手头能访问的信息量太少是个问题.现在有了网络,怎么在海量的数据中找到自己需要的信息是另一个头疼的问题.现在全世界有超过 5 亿个网站,存在大量的文献数据库,即使一个比较生僻的关键字, ...

  9. 微信搜一搜在线检索技术演进复盘

    作者:kaelhua,腾讯 WXG 后台开发工程师 背景 2020 年下半年我们(搜一搜工程团队)开发了一个新的内存检索引擎 ZeroSearch,并开始对搜一搜背后的大量垂直搜索系统进行升级,随着升 ...

最新文章

  1. Vue——全局element-resize-detector监听DOM元素
  2. Java14-day05【集合(Collection常用方法-遍历、List特有方法、List集合子类特点、LinkedList集合的特有功能、ListIterator)】
  3. zookeeper笔记+源码刨析
  4. django建表报错
  5. 机房收费系统学生下机结账小结
  6. MyEclipse的Debug功能最基本的操作
  7. java并发编程面试
  8. JavaScript玩转机器学习:Node 中的 TensorFlow.js
  9. 【SICP练习】53 练习2.21
  10. 【转】嵌入式软件:C语言编码规范
  11. 计算机毕业设计Java安路友汽车租赁(源码+系统+mysql数据库+lw文档
  12. 京东自动化签到脚本-京东休闲游戏自动化签到助手
  13. 国内外著名PT网站大全
  14. 数据中心网络图怎么画?几步教会你
  15. win2008服务器c盘在线扩容,win7 win10 win2008系统给主分区C盘增加空间 不破坏原硬盘内容扩充C盘 MiniTool Partition Wizard...
  16. Java锁与线程的那些“不可描述”的事儿
  17. 2021-07-18 三种视图的dicom文件的生成
  18. 8行代码实现发微信撩妹(汉语哦)
  19. 百度地图逆地址解析,经纬度解析
  20. 遗传算法求解香蕉函数的极大值

热门文章

  1. scala illegal cyclic inheritance involving trait iterable
  2. Linux切换omm用户命令,Linux OMM配置
  3. 亿级高并发电商项目-- 实战篇 --万达商城项目 十二(编写用户服务、发送短信功能、发送注册验证码功能、手机号验证码登录功能、单点登录等模块)
  4. SAT词汇记忆方法【zhasite】
  5. WAIC2023记录
  6. 喻东林:互联网经济的流量在线下
  7. jQuery定时器简单使用
  8. 20181009_Python练习题-二:自动贩卖机:只接受1元、5元、10元的纸币或硬币,可以1元、5元、10元。最多不超过10块钱。饮料只有橙汁、椰汁、矿泉水、早餐奶,售价分别是3.5、4、2、4
  9. Java中日期处理--LocalDate类
  10. SpringBoot八种bean的加载方式