热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《信息检索导论》读书笔记

1引言随着互联网信息的不断膨胀,如何快速从大量数据中获取需要的信息也成为当前一个重要的问题。谷歌、百度、雅虎等公司建立了强大的互联网搜索引擎用于快速检索用户需要的网页,一些电商、专业网站往往也建立了内

1引言

随着互联网信息的不断膨胀,如何快速从大量数据中获取需要的信息也成为当前一个重要的问题。谷歌、百度、雅虎等公司建立了强大的互联网搜索引擎用于快速检索用户需要的网页,一些电商、专业网站往往也建立了内部的检索系统,这一系列背后的技术都离不开信息检索这一门学科的知识。本文将围绕这一方面进行详细地解说。


2 信息检索概述

信息检索是从大规模非结构化数据(通常是文本)的集合(通常保存在计算机上)中找出满足用户信息需求的资料(通常是文档)的过程。信息检索也能涵盖上述基本定义之外的数据类型和信息处理问题。

信息检索也可以按照它们所处理数据的规模进行区分,比如可以将信息检索按照数据的规 模分成 3 个主要级别。第一个级别是以 Web 搜索(web search)为代表的大规模级别,此时需 要处理存储在数百万台计算机上的数十亿篇文档;二个级别是小规模,可以看成是与第一种规模相对的另一极端情况,这种规模 的一个代表性例子为个人信息检索;介于第一种大规模和第二种小规模之间的信息检索主要面对的是中等规模的数据,包括面向企业、机构和特定领域的搜索

3 布尔检索模型

布尔检索模型接受布尔表达式查询,即通过AND、OR及NOT等逻辑操作符将词项连接起来的查询。建立布尔检索模型的一般过程是:文本分词处理、建立倒排索引、处理查询。

1)     倒排索引

一个倒排索引由一个词项词典和每个词项对应的倒排记录组成。词项词典中记录了文档中出现的所有单词,而词项对应的倒排记录则记录了该词项在什么文档或者什么位置出现。


假如对一本100页的书建立倒排索引如下图所示,那么第一排表示“信息”这个词在第1、6、9、50、89页出现。


建立一个倒排索引往往包括以下几步:

1.  收集需要建立索引的文档

2.  将每篇文档转换成一个个词条的列表,即词条化。

3.  进行语言学处理,产生归一化词条来作为词项

4.  对所有文档按照其中出现的词项来建立倒排索引。

2)     布尔查询处理

建立好倒排索引后,接下来就可以处理查询了。例如,我们要查询“信息检索”在书中哪一个位置出现了,那么首先需要解析这个查询。根据布尔检索的要求,查询被转译成了“信息”and“检索”,计算机会在倒排索引中分别查找“信息”和“检索”两个词项的倒排记录,如果有一个位置两个词项都出现了,就作为一个结果返回。于是,返回了第1页和第86页的结果。

可以发现,其实对and类型的检索是对词项取了交集,这一过程可以通过对倒排记录的合并算法来快速完成。

Intersect (p1, p2)

answer

while p1 != NIL and p2 !=NIL

do if docID(p1) = docID(p2)

then Add( answer, docID(p1) )

p1 .next(p1)

p2 .next(p2)

else if docID(p1)

then p1 .next(p1)

else p2 .next(p2)

return answer

如果查询中有非逻辑,那么需要对算法进行一些扩展。

3)     采用跳表优化

合并算法在处理倒排记录上的查询效率可以通过一些改进来进一步提高,采用跳表就是其中一种。

跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。

基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表,因此得名。所有操作都以对数随机化的时间进行。


考虑上图的倒排记录,当查找Brutus和Caesar时,查找到8这个记录后,Caesar到了41,Brutus需要连续比较4次才会来到43这个记录,如果在Brutus的14记录上增加一个指针指向28,那么可以跳过19、23的比较,从而加快查询效率。

4)     词项集合的确定

以上我们介绍了如何用词项建立倒排索引,以及如何用倒排索引处理查询,然而跳过了一个重要的问题——如何确定词项集合。确定词项集合主要分为几个部分:词条化、去除停用词、词项归一化、词干还原和词形归并。

i.           词条化

词条化类似于自然语言处理中的分词概念,然而在信息检索中往往忽略标点符号,而分词是需要保留标点以方便词性标注的。这里有几个重要的概念需要区分:

词条:文档中出现的字符序列的一个实例;

词条类:相同词条构成的集合;

词项:信息检索词典中所包含的某个可能经过归一化处理的词条类。

     词条化的主要任务是确定哪些才是真正的词条,针对不同的语言,词条化的复杂程度是不一样的。英文的词条化常见的问题是,一个单词词条化后是否表达正确的意思,比如“奥尼尔”的拼写是O’Neill,它的词条化可以是oneill,o’neill, o’  neill, o  neill。对于汉语、阿拉伯语、日语等语言还会有更复杂的问题。另外,一个新词的产生也会带来如何去词条化的问题。

ii.           去除停用词

对于这么一个句子“但是,由于经济发展的不平衡,很多地区的矛盾开始进一步升级。”里面的“但是”、“由于”等连词往往不需要重视,它们的存在反而会影响查询的效果,这是就需要将它们去除。常见的方法是建立一张停用词表。

在信息检索系统不断发展的历程中,停用词表有从大到小,最后到不使用的趋势,特别是Web搜索引擎通常都不用停用词表,否则就会出现像中国移动推出的“和手机”无法检索的案例。

iii.           词项归一化

将文档和查询转换成一个个的词条之后,最简单的情况就是查询中的词条正好和文档中的词条相一致,然而很多情况下,即使此条之间并不完全一致,我们仍希望它们能够进行匹配,这时就需要进行词条归一化。

词条归一化就是将看起来不完全一致的多个词条归纳成一个等价类,最常规的做法就是建立等价类,每一个等价类用其中的某个元素进行命名。建立等价类有两种方式,一种叫做建立显示等价类,另一种是建立隐式等价类。

常见的建立隐式等价类的方法是去除字符,比如连词符,这种方法不需要事先计算出等价类的全部元素。

建立显示等价类的方法则是维护多个非归一化词条之间的关联关系,比如“喜欢”和“喜爱”这种近义词或者同义词。实现这种等价类的常用方法有两种,一种是采用非归一化的词条进行索引,并为查询词项维护一张由多个词组成的查询扩展表,然后将它们的查询结果进行合并;另一种方式是在构建索引时就对词进行扩展,“喜欢”出现的记录在“喜爱”这个词项中也进行记录。第一种方式需要更多的查询时间,而第二种方式则需要更大的存储开销。

iv.           词干还原和词形归并

出于语法上的要求,文档中的同一个词往往会以不同的形态出现,如英文的一般现在时、现在进行时、一般过去时、过去分词、三人称单数等等。对它们进行归一化就是词干还原和词形归并的工作了。

词干还原是指很粗略地去除单词两端词缀地启发式过程,并且希望大部分时间它都能达到这个正确目的,包括去除派生词缀。

词形归并则是利用词汇表和词形分析来去除词缀,从而返回词地原形或词典中的词地过程。

4 向量空间模型

用布尔模型进行检索可以得到查询关键词在哪些文档中出现,但是无法对这些查询结果进行相关度评分。因此引入了向量空间模型(VSM),它将一系列文档表示为在同一向量空间中的向量形式。向量空间模型是信息检索领域一系列相关处理的基础,如文档评分、分类、聚类等。那么首先需要介绍如何将文档进行向量化。

1)     文档向量化和Tf-Idf权重

将一篇文档看成是一个向量,其中每个分量都对应词典中的一个词项,采用权重计算公式计算出词项的权重值作为该分量的大小,如果一个词项在一篇文档中没有出现,那么这篇文档中该词项对应分量值为0 。通过这种思路,就可以对文档进行向量化,向量化后的文档表示如下:


其中d表示文档向量,而ti表示每个token 代表的分量。这是一种词袋模型的思想,词袋模型忽略了词与词之间的顺序和关联关系,只保留出现的次数。

一个词项在文档中出现频率越高,那么它所占文档的权重也应该更高,对应的分量的值也应该更高,这是基于词频决定向量值的思想。然而,实际问题中,一篇文档包含多个“和”“不”“因为”“如果”这种并不重要的词,并且它们出现的频率很高,从而降低查询的准确率。采用停用词表是一个解决该问题的方法,但是会因此带来其他的问题,有一种更好的方法可以有效解决这个矛盾,就是Tf-Idf(词项频率-逆文档频率)加权。

同一个单词如果在越多的文档中出现,我们认为它是越不重要的,基于这种思想,我们引入了逆文档频率(Idf)的概念。


其中N代表文档中的文档数目,dft代表文档频率,即一个词项在多少文档中出现的数目。df越大,idft越小。

对于每篇文档的每个词项,将tf和idf组合在一起形成tf-idf权重,计算公式如下:


对文档d中的词项t,当t只在少数几篇文档中多次出现时,权重取值最大。

2)     向量空间模型

所有需要建立索引的文档的所有词项组成了一个向量空间,每篇文档都由空间中的一个向量来表示,这样的模型就是向量空间模型。

在向量空间模型中,我们可以对文档进行相似度的计算,采用类似的方法也可以计算查询与文档之间的匹配得分,从而对检索结果进行排序。

计算余弦相似度是最常用的比较文档之间相似程度的方法,因为它可以有效避免因为文档长度不一致带来的误差。计算公式如下:


式中分子是两个向量的内积,分母是两个向量的欧式距离,除以分母的作用相当于将向量进行归一化。公式计算出的结果是两个向量的夹角余弦。

3)     查询向量

文档可以表示成向量,那么一个查询语句也可以。对于查询q,它与一篇文档d之间的相似度是:



这样一来,检索过程就是:计算查询向量和文档集中每个向量的余弦相似度,结果按照得分排序,并选择得分最高的K篇文档。然而只采用这种查询方法,如果向量空间的维度很大,那么每次查询都会做很多次内积计算,效率很慢。

至此,一个典型的检索系统由以下几部分组成:向量化后的文档集、查询向量、正整数K。检索目标为:给定查询,从文档集合中返回得分最高的K篇文档。以下是返回查询q的前K篇相似文档的算法描述,该算法使用了查询向量的非0分量对每篇文档计算得分,然后排序返回。


4)     快速评分和排序

为了提高检索效率,需要对倒排索引进行一些改进,第一是将N/df存储在t对应的倒排记录表的头部,从而避免使用浮点数,减少存储开销;第二是在倒排记录中存储词项频率tf t,d


在检索过程中由这样一个事实,对于查询q来说,它的非0分量只是少数关键词对应的分量,不考虑查询词项的权重时而给定查询时实现文档排序的目标,实际上只需要得到文档之间的相对得分。因此只需要计算文档的单位向量和查询的布尔向量(0-1向量)而不是单位向量。改进后的快速评分算法如下:


该算法的一大改进在于将浮点数的先乘后加改成了整形的累加,提升了算法的效率。

5)     非精确返回前K篇文档的方法

以上的介绍都是精确返回前K篇文档的方法,然而在实际检索过程中存在很多非精确的方法,可以大幅降低计算的复杂度,同时并不会让用户感觉到相关度的降低。这些方法主要分为两个步骤:

a)       找到文档集合A,它包含参与最后竞争的候选文档,其中K<|A|<

b)       返回A中得分最高的K篇文档。

以下是一些经常使用的非精确返回前K篇文档的方法:

i.     索引去处技术

索引去除技术的含义就是通过减少查询的索引数目来加快查找效率,常用的方法两种,一种是只考虑idf值超过一定阀值的词项所在的文档,因为idf较低的词项倒排索引较长,并且它们对评分结果没有什么贡献;另一种是只考虑包含多个查询词项的文档,但是这种方法存在的风险是可能返回的文档数目不足K。

ii.     胜者表

胜者表的基本思路是对于词典中的每个词项t,预先计算出r个最高权重的文档;给定查询q,对q中所有词项的胜者表求并集。r值的确定是这一技术的难点。

iii.     簇剪枝方法

簇剪枝方法中没首先对文档进行聚类,然后在查询处理时,只考虑利用少数几个簇中的文档进行余弦相似度计算。这里面涉及到先导者和追随者问题,其实也就是聚类算法中所说的聚类中心和范围类中的点。方法如下:


查询过程处理如下:


5 信息检索系统的评价

至此,介绍完了一个完整的搜索引擎所有的部分,其总体架构可以用下图来表示:


接下来需要关心的是,如果评价一个搜索引擎检索结果的好坏。

通常情况下,会给定一个测试集,根据返回结果度量两个指标:正确率(查准率)召回率(查全率)。准确率反映搜索引擎返回的正确结果与总结果间的关系,召回率反映正确结果与本应该返回的结果数之间的关系。



为了更好的理解上述概念,可以对照下表:


那么,正确率P和召回率R的计算公式为:


还有一种融合了P和R的指标是F值,它是这两个指标的调和平均值,计算公式如下:


当值为1时,公式可以简化为:


6 小结

   近期阅读《信息检索导论》一书,对这一领域有了更深刻的认识。信息检索涉及范围广,包括自然语言处理、机器学习等相关领域,并在实际场景中对它们进行了运用,对交叉学习很有帮助。运用该书所讲知识,结合Apache Lucene的学习,理论与实践相辅相成,对一个搜索引擎的完整结构有了更深入的了解。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
mobiledu2502879767
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有