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

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) < docID(p2)

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|<<N,A不必包含前K篇得分最高的文档,但是应该包含很多和前K篇文档得分相近的文档;

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的学习,理论与实践相辅相成,对一个搜索引擎的完整结构有了更深入的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值