信息检索与数据挖掘 | (二)布尔检索与倒排索引

2023-09-20 23:07:28

  • 线性扫描是一种最简单的计算机文档检索方式,这个过程通常称为grepping。在使用现代计算机的条件下,对一个规模不大的文档集进行线性扫描非常简单,根本不需要做额外的处理。
  • 但在(1)大规模文档集(2)更灵活的匹配方式(3)需要对结果进行排序的情况下,就不能再用上边的线性扫描。一种非线性扫描的方式是事先给文档建立索引(index)。

📚词项-文档关联矩阵

🐇相关名词

  • 词项(Term):索引的单位,通常用词来表示。
  • 文档(Document):检索系统的检索对象,可以是单独的一条记录或者是一本书的各章。
  • 文档集/语料库(collection/corpus):所有文档的集合。
  • 词项-文档关联矩阵(Term-document incidence matrices)
    在这里插入图片描述
  • 从行看,可以得到每个词项对应的文档向量,表示词项在哪些文档出现或不出现。
  • 从列看,可以得到每个文档对应的词项向量,表示文档中哪些词项出现或不出现。

🐇词项-文档关联矩阵的布尔查询处理

  • 对于采用ANDORNOT等逻辑操作符连接起来的布尔表达式查询,通过对文档向量间接逻辑操作来得到查询结果。
  • 例:响应查询Brutus AND Caesar AND NOT Calpurnia:结果向量中的第1和第4个元素为1,这表明该查询对应的剧本是Antony and Cleo patraHamlet
    在这里插入图片描述
  • 假设有50万个词项和100万篇文档,所以其对应的词项-文档矩阵大概有5000亿个取布尔值的元素,这远远大于一台计算机内存的容量。此外,这个庞大的矩阵实际上具有高度的稀疏性,即大部分元素都是0,而只有极少部分元素为1。
    在这里插入图片描述
  • 也就是说对于词项个数和文档规模很大的情况,构造出的关联矩阵是高度稀疏的。这时,只记录原始矩阵中1的位置的表示方法比词项-文档关联矩阵更好。因此,引出了倒排索引

📚倒排索引

🐇关于索引

  • 索引(Index)由词项词典(Dictionary)和一个全体倒排记录表(Postings)组成。图 1-3 中的词典按照字母顺序进行排序,而倒排记录表则按照文档ID号进行排序。
    在这里插入图片描述

🐇建立索引

在这里插入图片描述在这里插入图片描述

  • 预处理词语切分词项归一化词干还原与词形合并去除停用词
    在这里插入图片描述

  • 构建倒排索引

    • 给每篇文章的所有词项加上文档ID
      在这里插入图片描述

    • 按照字母顺序排序
      在这里插入图片描述

    • 将同一词项合并,并将词项和文档ID分开存储。
      在这里插入图片描述

  • 在字典的每个词项中还可以存储其他信息,如文档频率

  • 每个倒排记录表存储了词项出现的文档列表,还可以存储词项频率、词项在文档中出现的位置

🐇基于倒排索引的布尔查询处理

在这里插入图片描述

求两个倒排记录表交集的合并算法

  • 我们对每个有序列表都维护一个位置指针,并让两个指针同时在两个列表中后移。
  • 该算法对于倒排记录表集(即待合并的两个倒排记录表)的大小而言是线性的。每一步我们都比较两个位置指针所指向的文档 ID,如果两者一样,则将该 ID 输出到结果表中,然后同时将两个指针后移一位。
  • 如果两个文档 ID不同,则将较小的 ID 所对应的指针后移。
  • 假设两个倒排记录表的大小分别是 x 和 y,那么上述求交集的过程需要 O ( x + y ) O(x+y) O(x+y)次操作,也即查询的时间复杂度为 Θ ( N ) Θ(N) Θ(N),其中 N 是文档集合中文档的数目。
    在这里插入图片描述
  • 和线性扫描相比,这种索引方法并没有带来Θ意义上时间复杂度的提高,而最多只是一个常数级别的变化。
  • 但是,实际当中这个常数很大

🐇查询优化

  • 对每个词项,我们必须取出其对应的倒排记录表,然后将它们合并。
  • 一个启发式的想法是,按照词项的文档频率(也就是倒排记录表的长度)从小到大依次进行处理,如果我们先合并两个最短的倒排记录表,那么所有中间结果的大小都不会超过最短的倒排记录表(这是因为多个集合的交集元素个数肯定不大于其中任何一个集合的元素个数) ,这样处理所需要的工作量很可能最少。

  • 布尔查询适合精确查询

📚字典数据结构

Two main choices——Hashtables、Trees

🐇哈希表

数据结构 | 第十章:散列表 | 字典 | 线性探查 | 链式散列 | LZW编码
在这里插入图片描述

🐇各种树

数据结构可视化网站
在这里插入图片描述

数据结构 | 第十一章:二叉树和其他树 | 【前序遍历】【中序遍历】【后序遍历】【层次遍历】 | 并查集
数据结构 | 第十二章:优先级队列 | 堆 | 左高树 | 堆排序 | 霍夫曼编码
数据结构 | 第十四章:搜索树 | 二叉搜索树的查找、插入、删除
数据结构 | 第十五章:平衡搜索树——AVL树 | AVL树的搜索、插入、删除
数据结构 | 第十五章:平衡搜索树——B-树 | B-树的搜索、插入、删除


🐇B树 vs B+树

  • B树
    在这里插入图片描述
    在这里插入图片描述

  • B+树
    在这里插入图片描述

在这里插入图片描述

  • B+树和B树相比的主要区别:
    • B+树所有关键码都在叶子节点
    • B+树的叶子节点是带有指针的,且叶节点本身按关键码从小到大顺序连接
    • 在搜索过程中,如果查询和内部节点的关键字一致,那么搜索过程不停止,而是继续向下搜索这个分支。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径

  • B+树在文件系统、数据库系统当中,更有优势,更高效。
    • B+树更有利于对数据库的扫描 ,因为所有元素都在叶子节点上。
    • B+树的查询效率更加稳定 ,B树最后就是要找到叶子节点,每次查找都是走了一条从根到叶子结点的路径。
    • B+树没有像B树一样,把一些关键码每层都放一部分,之间存在互相之间的关系。在考虑指针指向内容上,B+树没有这些要存,反而数据量大的情况的,占的空间要比B树小。
      在这里插入图片描述

📚短语查询及含位置信息的倒排记录

🐇二元词索引(Biword indexes)

  • 对文档中每个接续词对(Biword)看成词项,这样马上就能处理两个词构成的短语查询。
  • 更长的查询可以分成多个短查询来处理。
  • 比如,按照上面的方法可以将查询 stanford university palo alto分成如下的布尔查询:“stanford university” AND “university palo” AND “palo alto”。
  • 可以期望该查询在实际中效果会不错,但是偶尔也会有错误的返回例子。对于该布尔查询返回的文档,我们并不知道其是否真正包含最原始的四词短语。
    在这里插入图片描述

🐇位置信息索引

  • 在位置信息索引(positional index)中,对于每个词项,以如下方式存储倒排记录:
    在这里插入图片描述
    在这里插入图片描述
  • 短语查询处理
    在这里插入图片描述
    在这里插入图片描述
  • 同样,类似的方法可以用于 k 词近邻搜索当中:employment /3 place ,这里,/k 意味着“ 从左边或右边相距在 k 个词之内” 。很显然,位置索引能够用于邻近搜索,而二元词索引则不能。

在这里插入图片描述

🐇混合索引机制

  • 二元词索引和位置索引这两种策略可以进行有效的合并。
  • 假如用户通常只查询特定的短语,如Michael Jackson,那么基于位置索引的倒排记录表合并方式效率很低。
  • 一个混合策略是:对某些查询使用短语索引或只使用二元词索引,而对其他短语查询则采用位置索引
  • 短语索引所收录的那些较好的查询可以根据用户最近的访问行为日志统计得到,也就是说,它们往往是那些高频常见的查询。

📚基于跳表的倒排记录表快速合并算法

  • 跳表(skip list):在构建索引的同时在倒排记录表上建立跳表。跳表指针能够提供捷径来跳过那些不可能出现在检索结果中的记录项。
    在这里插入图片描述
  • 在什么位置上放置跳表指针?
    • 跳表指针越多意味着跳跃的步长越短,那么在合并过程中跳跃的可能性也更大,但同时这也意味着需要更多的指针比较次数和更多的存储空间。跳表指针越少意味着更少的指针比较次数,但同时也意味着更长的跳跃步长,也就是说意味着更少的跳跃机会。
      在这里插入图片描述
    • 放置跳表指针位置的一个简单的启发式策略:在每个 P \sqrt{P} P 处均匀放置跳表指针,其中 P P P 是倒排记录表的长度。
    • 这个策略在实际中效果不错,但是仍然有提高的余地,因为它并没有考虑查询词项的任何分布细节。
    • 如果索引相对固定的话,建立有效的跳表指针则比较容易。但是如果倒排记录表由于经常更新而发生变化,那么跳表指针的建立就比较困难。恶意的删除策略可能会使跳表完全失效。

参考博客

更多推荐

【数据结构】图的遍历:广度优先(BFS),深度优先(DFS)

目录1、广度优先(BFS)算法思想广度优先生成树知识树代码实现2、深度优先(DFS)算法思想深度优先生成树知识树代码实现1、广度优先(BFS)算法思想图的广度优先遍历(BFS)是一种遍历图的算法,其思想是从起始顶点开始遍历图,先访问起始顶点的所有直接邻居,然后遍历这些邻居的直接邻居,以此类推,直到遍历完整个图。BFS算

竞赛选题 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录0简介1二维码检测2算法实现流程3特征提取4特征分类5后处理6代码实现5最后0简介🔥优质竞赛项目系列,今天要分享的是基于机器学习的二维码识别检测-opencv二维码识别检测机器视觉该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https://gitee.com/dancheng-

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.数据预处理2.数据增强3.模型构建4.模型训练及保存5.模型评估6.模型测试1)权限注册2)模型导入3)总体模型构建4)处理视频中的预览帧数据5)处理图片数据6)多页面设置7)布局文件代码相关其它博客工程源代码下载其它资料下载前言本项目依赖于Keras深度学习

【操作系统笔记】任务调度&信号处理&CPU上下文

任务调度何时需要调度执行一个任务?第一:当任务创建的时候,需要决定是继续执行父进程,还是调度执行子进程第二:在一个任务退出时,需要做出调度决策,需要从TASK_RUNNING状态的所有任务中选择一个任务来执行第三:当一个任务阻塞在I/O上,或者因为其他原因阻塞,必须调度另一个任务执行第四:在一个I/O中断发生时,必须做

Docker网络学习

文章目录Docker容器网络1.Docker为什么需要网络管理2.Docker网络简介3.常见的网络类型4.docker网络管理命令5.两种网络加入差异6.网络讲解dockerBridge网络dockerHost网络dockerContainer网络dockernone网络Docker容器网络1.Docker为什么需要

Redis 面霸篇:从高频问题透视核心原理

Redis为什么这么快?很多人只知道是K/VNoSQl内存数据库,单线程……这都是没有全面理解Redis导致无法继续深问下去。这个问题是基础摸底,我们可以从Redis不同数据类型底层的数据结构实现、完全基于内存、IO多路复用网络模型、线程模型、渐进式rehash…...到底有多快?我们可以先说到底有多快,根据官方数据,

设计模式解析之模板方法模式:设计灵活可扩展的算法框架

目录1.引言2.概要2.1概念2.2结构2.3类图2.4工作流程3.应用场景3.1适用情况:3.2常见例子:4.代码衍化过程初版:甲乙学生都抄试卷第二版:提炼代码第三版:抽象出算法骨架第四版:模板方法变化过程总结及未来展望5.总结1.引言在软件开发中,设计和实现算法是一项常见的任务。然而,随着需求的变化和代码的增长,算

十二、MySql的事务(下)

文章目录一、事务隔离级别(一)如何理解隔离性(二)隔离级别1.读未提交【ReadUncommitted】:2.读提交【ReadCommitted】:3.可重复读【RepeatableRead】:4.串行化【Serializable】:(三)查看与设置隔离性1.查看全局隔离级别2.查看会话(当前)全局隔离级别3.设置全局

C++ - AVL 树 介绍 和 实现 (上篇)

前言之前我介绍了二叉搜索树,可看一下博客:C++-搜索二叉树_chihiro1122的博客-CSDN博客二叉搜索树的效率可以达到O(logn)。这个复杂度的算法的效率是非常恐怖的,2的30次方大概是10亿左右。也就是说如果用暴力查找需要找10亿次,而最好的效率的二叉搜索树只用搜索30次。是非常恐怖的。为什么说是最好效率

如何连接到远程桌面

远程桌面连接是一个非常有用的工具,尤其是当越来越多的人在家工作或使用自己的设备工作时。使用远程桌面连接软件,管理员即使不在您的设备附近,也可以解决问题,他们可以远程访问它并快速解决可能出现的任何问题。什么是远程桌面连接远程桌面连接是一种远程操作电脑的模式,它可以用于可视化访问远程计算机的桌面环境,用于管理员在客户机上对

找不到msvcp140.dll的解决方法,以及msvcp140.dll丢失的原因

在计算机使用过程中,我们可能会遇到无法启动程序的问题,提示找不到msvcp140.dll。这使得许多用户感到困扰,因为msvcp140.dll是MicrosoftVisualC++Redistributable的一个组件,它包含了C++运行时库。这个库对于许多应用程序和游戏来说都是必需的。那么,为什么会出现找不到msv

热文推荐