2021-01-12

信息检索导论11-12章读书笔记

概述

11章,概率检索模型。以一个简单的贝叶斯定理出发,经过疯狂的公式变换+假设,最终得到了一个模型,然后说模型的检索性能不好。模型的扩展是BM25。BM25很棒。

12章,基于语言建模的信息检索模型。每个文档对应一个模型,使用每个文档对应的模型去生成查询,看谁生成查询的概率大,概率大的排在前面。不过没有足够的证据来证明这个方法的效果能够大大超过一个经过精心调节参数后的传统向量空间模型。

讲完了,全剧终。

 

十分想躲避公式来讲,但是发现这两章真的躲不开,哪哪都是公式,那就让我们愉快地开始公式之夜吧!感谢李想老师的数学指导!

11 概率检索模型

干啥用的?

基于概率论:估计【文档】和【需求】的相关程度。

所以要先介绍概率论相关知识:

11.1 概率论基础知识

一切的一切都要从一个贝叶斯定理讲起

 

主要就是可以把先验和后验的事件概率换个位置然后可以开始骚操作

11.3 二值独立模型(BIMBinary Independence model

二值是啥?

bool值:把文档和查询都表示为词项出现与否的bool向量

 

比如词库里只有 (apple, boy, cat),文档1:apple boy:表示为(1,1,0)

特点:不考虑词项出现的次数以及顺序,不同的文档可能有相同的表示,比如apply boy 和boy apple apple的表示都是(1,1,0)

q也用一样的方法表示。

 

独立性

词项在文档中的出现是相互独立的,咱们这个BIM模型不识别词项之间的关联。

 

任务:估计文档中的词项如何影响相关性

具体地:想看下【词项频率】、【文档频率】、【文档长度】和【其他能够计算出的统计特性】,这些我们熟悉的指标,是怎样影响文档相关性的判断。看下能不能通过一些假设、公式推导,将相关性,表示为上面这些指标的函数。

 

利用贝叶斯定理,开始第一个公式:

 

 

首先直接是套用贝叶斯定理把先验跟后验换个位置。

 

然后,利用这个公式做下变换 https://blog.csdn.net/FY_2018/article/details/108433904:

 

再套用贝叶斯定理做替换

 

把相同项消掉,得到书上的这第一个公式。

 

 

11.3.1 排序函数的推导

给定q,怎么对文档进行排序?基于上面的BIM模型,如果能直接计算出相关性概率

 

然后按照这个排序就最好了。可是这个太难了。于是变换了一下,用相关的概率除以不相关的概率,得到文本相关性的优势率:

 

这样就可以消掉公共分母

然后对于给定查询

 

这一项是个常数(给定q相关的概率和不相关的概率,只跟q有关,比如短q=美女,相关的概率可能更高,长q=奇奇怪怪乱七八糟的查询,相关的概率就低了)于是又可以忽略这项。那就只剩下一项需要估计了:

 

这个奇怪的东西是啥意思呢?

返回一篇相关/不相关文档时,文档表示为x的概率,

按照公式,这个需要估计整个词项出现向量的概率,不好搞,只好又引入假设【朴素贝叶斯条件独立性假设】,在给定查询的情况下,认为一个词的出现与否与任意一个其他词的出现与否是相互独立的,那么就可以拆开来做连乘来计算了:

 

再乘上刚才说的可以忽略的常数

 

每个xi要么是0要么是1(对应的词要么出现要么不出现)继续拆成出现的乘积*不出现的乘积

 

太长了看的难受,简写一把:

 

pt:【词项出现在一篇相关文档的概率】、ut:【词项出现在一篇不相关文档中的概率】

1-pt:【词项不出现在一篇相关文档的概率】、1-ut:【词项不出现在一篇不相关文档中的概率】

这是:已知文档和q相关/不相关,词项出现/不出现的概率。所有词项的这个概率值之和不为1,两个词项的概率值都可以是1(已知文档和q相关,某个两个词项必然出现,那这俩概率就都是1)

 

再代入到上面那一大坨

再加上假设:没有在查询中出现的词项在相关和不相关文档中的概率相等

 

到这一步,第二个因子计算的是出现在文档中的查询词项的概率乘积

 

第三个因子计算的是【不出现在文档中的查询词项的概率乘积】

 

再做进一步变换:(乘了一个红框以及他的倒数)

 

注: 原来是xt=0,qt=1(不出现在文档中的查询词项的概率)来连乘,现在把所有xt=1,qt=1(出现在文档中的查询词项的概率)的也拿出来连乘了,两个一合并,那就相当于把所有qt=1(不管是不是出现在文档中的查询词项的概率)拿出来连乘?

注:乘这一项做的变换在这里有推导:https://www.jianshu.com/p/5f5f8396c420

 

所以最后这个因子跟文档无关了,只是跟查询有关,对于给定一个查询,他就是常数了,不同的文档算出来都一样,没有区分度。所以又可以忽略,很开心。

 

最后只剩下他了,这是唯一需要估计的量

 

最后再取个对数,定义为RSV:Retrieval Status Value检索状态值

 

再将p相关的分到一项,u相关的分到一项

 

ct:查询词项的优势率比率

 

小结:这一切都只是来源于一个贝叶斯公式+一些假设+一些数学变换

11.3.2 理论上的概率估计方法

得出这么个公式,然后到底怎么算这个ct呢?dft是包含t的文档数目

 

 

为了避免可能出现的0概率(比如所有的相关文档都包含或不包含某个特定的词项),一种很常规的做法是在公式(11-19)中的每个量的基础是都假设1/2,总数也相应地改变(比如上述表格右下角的总数也会变成N+2),于是有:

 

加上1/2是一种简单常见的平滑方法。

11.3.3 实际中的概率估计方法

【+假设】:相关文档只占所有文档的极小一部分,也就是说不相关文档约等于所有文档,可以用整个文档集的统计数字来计算与不相关文档有关的量。基于这个假设,在给定q,不相关文档中出现词项t的概率时dft/N,于是有

 

发现了最常用的idf:这给idf给出了一个理论上的合理解释

 

11.4 概率模型的相关评论及扩展

思想很好但是在性能上从来没有优势

BIM模型中有一些假设

文档、查询及相关性的布尔表示

词项的独立性

查询中不出现的词项不会影响最后的结果

不同文档的相关性之间是互相独立的

或许因为假设太苛刻了,检索性能很难达到较好的水平

然后出现了BM25,表现出非常好的检索性能。

11.4.3 Okapi BM25:一个非二值的模型

这里不讨论Okapi模型背后的全部理论(太好了),而只给出目前所用的一些常规文档评分的形式。对于文档d,最简单的文档评分方法是给文档中的每个查询词仅仅赋予一个idf权重:

 

然后在这个基础上引入词项频率和文档长度。

 

tftd是词项t在文档d中的权重,Ld和Lave分别是文档d的长度以及整个文档集中文档的平均长度。k1是一个取正值的调优参数,用于对文档中的词项频率进行缩放控制。如果k1=0,对应BIM模型(新增的这个因子整个消掉了),如果k1取较大的值,对应于使用原始词项频率(tftd<1,k1很大时分母约等于k1,新增的这个因子约等于tftd)。b是另一个调节参数,0<=b<=1,决定文档长度的缩放程度:b=1表示基于文档长度对词项进行完全的缩放,b=0表示归一化时不考虑文档长度因素。

 

如果查询很长,可以给查询词项也来一下:(最后一项写错了应该是tftq)

 

现有的实验结果表明,参数的合理取值范围是

k1 和k3 的取值区间为 1.2~2,b取 0.75。

 

学到了数学小妙招:如果想要对一个因子(如tf)设置调优参数,让他有时候消失(=1),有时候取自身,那就可以用这种方式给他整一下即可(k3>=0)

 

也可以给他整一个

 

0<=b<=1,b=0时变成1,b=1时就是自身。

 

ESBM25

https://www.elastic.co/guide/cn/elasticsearch/guide/current/pluggable-similarites.html

ES使用的是【实用评分算法】,不是BM25。这俩都使用词频、逆向文档频率以及字段长归一化,但是每个因子的定义都有细微区别。

词频饱和度

TF/IDF 和 BM25 同样使用 逆向文档频率 来区分普通词(不重要)和非普通词(重要),同样认为(参见 词频 )文档里的某个词出现次数越频繁,文档与这个词就越相关。

不幸的是,普通词随处可见,实际上一个普通词在同一个文档中大量出现的作用会由于该词在 所有 文档中的大量出现而被抵消掉。

曾经有个时期,将 普通的词(或 停用词 ,参见 停用词)从索引中移除被认为是一种标准实践,TF/IDF 正是在这种背景下诞生的。TF/IDF 没有考虑词频上限的问题,因为高频停用词已经被移除了。

Elasticsearch 的 standard 标准分析器( string 字段默认使用)不会移除停用词,因为尽管这些词的重要性很低,但也不是毫无用处。这导致:在一个相当长的文档中,像 the 和 and 这样词出现的数量会高得离谱,以致它们的权重被人为放大。

另一方面,BM25 有一个上限,文档里出现 5 到 10 次的词会比那些只出现一两次的对相关度有着显著影响。但是如图 TF/IDF BM25 的词频饱和度 所见,文档中出现 20 次的词几乎与那些出现上千次的词有着相同的影响。

这就是 非线性词频饱和度(nonlinear term-frequency saturation

 

 

字段长度归一化(Field-length normalization

字段长归一化 中,我们提到过 Lucene 会认为较短字段比较长字段更重要:字段某个词的频度所带来的重要性会被这个字段长度抵消,但是实际的评分函数会将所有字段以同等方式对待。它认为所有较短的 title 字段比所有较长的 body 字段更重要。(字段粒度的,出现在title中就是要出现在body中更重要)

BM25 当然也认为较短字段应该有更多的权重,但是它会分别考虑每个字段内容的平均长度,这样就能区分短 title 字段和 长title 字段。(BM25区分的更细)

 

BM25 调优

不像 TF/IDF ,BM25 有一个比较好的特性就是它提供了两个可调参数:

k1

这个参数控制着词频结果在词频饱和度中的上升速度。默认值为 1.2 。值越小饱和度变化越快,值越大饱和度变化越慢。

b

这个参数控制着字段长归一值所起的作用, 0.0 会禁用归一化, 1.0 会启用完全归一化。默认值为 0.75 。

 

12 基于语言建模的信息检索模型

用户要提出好的查询,一个通常的建议是,应该尽量采用那些最有可能出现在相关文档中的词来构成查询。这一章的语言建模方法就是用这个思路建模:给定查询,如果某篇文档对应的文档模型可能生成该查询,那么这篇文档是一个好的匹配文档。(用文档模型去生成查询)

12.1 语言模型

一个简单的例子:假设得到了模型,知道了每个词的概率,假设停止生成的概率为0.2

 

 

比较两个模型,可以计算似然比:将其中一个模型的数据生成概率除以另一个模型的数据生成概率。假定停止概率是固定的,他不会改变似然比的顺序,也不会改变两个语言模型生成同一字符串的概率大小次序。因此不会影响文档排序。如:

 

M1更可能是生成该词项序列的模型

12.1.2 语言模型的种类

链式规则将一系列事件的概率分解成多个连续的时间概率之积,每个概率是每个时间基于其历史事件的条件概率:

 

最简单的语言模型形式:去掉所有条件概率中的条件来独立的估计每个词项的概率:一元语言模型(unigram language model)

 

 

复杂一点的:二元语言模型(bigram language model),计算条件概率时只考虑前一个词项出现的情况

 

 

将统计语言模型用于信息检索领域的大部分工作都只使用了一元模型。

 

12.2 查询似然模型

12.2.1 IR中的查询似然模型

在这个模型中,我们对文档集中的每篇文档d构建其对应的语言模型Md。目标是将文档按照其与查询相关的似然P(d|q)排序。再次使用贝叶斯公式:

P(d|q) = P(q|d)P(d)/P(q)。

 

  • P(q)对所有文档都一样,可以忽略
  • 文档先验概率P(d)往往可以视为均匀分布,因此也可以忽略。当然实际中也可以使用真实的先验概率,比如可以包括权威度、长度、类型、新鲜度、以前阅读过该文档的用户数目这些因素。这里暂不考虑
  • 最后按照P(q|d)进行排序:这是文档d对应的语言模型生成q的概率。

 

最普遍的计算P(q|d)方法:使用多项式一元语言模型(等价于多项式朴素贝叶斯模型)

 

可以将查询的生成看成一个随机过程。具体的方法是:

1、对每篇文档推导出其LM

2、估计查询在每个文档di的LM下生成概率P(q|Mdi)

3、按照上述概率对文档进行排序

 

上述模型的直观意义:用户脑子里有一片原型文档,然后按照该文档中的词语用法来生成查询。通常用户对感兴趣的文档中可能出现的词项有一些合理的想法,然后他们会选择那些能够区分其他文档的查询项构成查询。

 

12.2.2 查询生成概率的估计

如何估计概率P(q|Md)? 在最大似然估计+一元语言模型假设的情况下,给定文档d的LM Md生成查询q的概率为

 

实际上就是q中的每个词在文档中出现的频率相乘,如果q中有个词在文档中没有出现(很有可能发生的事情),那频率就为0,整体算出来的概率就为0,这是一个非常严格的“与”语义:所有查询项都出现在文档中的时候才有一个非零的概率。另外,只出现一次的词会被过度估计,这是因为他们仅有一次出现一定程度上处于偶然性。

 

解决办法:平滑。做了平滑的模型不仅避免了零概率,还实现了词项权重计算的主要部分。

 

那么怎么平滑?非零结果进行折扣,未出现的词的概率赋予一定的值。

 

一个实际效果较好的简单方法是,将基于文档的多项式分布和基于全部文档集估计的多项式分布相混合:

 

未平滑前某个词在文档中没有概率就是0,平滑之后会使用在整个文档集中出现的概率代替。

 

这个平滑函数有点意思,较小的 λ意味着更平滑(极端情况下 λ =0,完全舍弃了在单文档中是否出现,直接使用在全部文档集中出现的频率; λ =1,完全回到了在单文档集中出现的频率,没有平滑效果)

 

所以最终查询q的检索排序函数定义如下:

 

看个例子:

q=revenue down

revenue在d1出现的频率1/8,d2出现的频率1/8,在整个文档集出现的频率2/16

down在d1出现的频率1/8,d2出现的频率0/8,整个文档及中出现的频率1/16

套上面公式:d1概率高,排名靠前

 

λ参数也不必是个常数,可以是查询长度的一个函数:如短查询可以严格一些,少用点平滑(类似于“ 与” 搜索)更为合适,而长查询可以宽松一些,则需要加大点平滑的力度。

 

【一些想法】零概率是严格的“与”搜索,类似于规则召回的精准检索,在一些case下太严格了导致召回不够;能不能把这个平滑的想法也用起来?

规则召回比较精准,适合短查询

term查询比较模糊,适合长查询

能不能把两种召回平滑地揉在一起,同时走规则查询和term查询,两种结果都拿到,对原来的规则召回做一个补充?

12.3 语言建模的方法与其他检索方法的比较

优点:与其他概率模型的方法相比(如11章BIM),最主要的区别似乎是语言模型的方法不再对相关性进行显示建模(BIM模型中相关性作为一个最主要的变量来建模)在LM中,要求文档和信息需求的表达式都是同一类型的对象。最后的模型数学上很精确、概念上简洁、计算上可行、直观上吸引人。

 

缺点:文档和信息需求表示之间的对象同类假设显然不符合实际情况。当前LM方法采用了非常简单的语言模型,比如常常使用一元模型。

 

语言建模的IR模型与传统的tf-idf模型具有很显著的关联。在tf-idf模型中,词项频率会直接进行表示。将文档生成概率和文档集生成概率二者混合的效果有点像idf,那些在整个文档集中出现较少而在某些文档中出现较多的词项将对文档的最后排序起到较大作用。最后:还没有足够的证据来证明LM方法的效果能够大大超过一个经过精心调节参数后的传统向量空间模型,因此也无法证明改变现有的实现系统是很有必要的。

 

结合11、12章看:用不同的方法建模,最后都会归结于使用tf、idf、文档长度这些常见的统计项。说明这些统计项真的很重要!

 

Lucene怎么做?

参考:

https://www.elastic.co/guide/cn/elasticsearch/guide/current/controlling-relevance.html

https://lucene.apache.org/core/7_4_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

 

VSM:把文档和query都表示成多维空间下权重的向量(weighted vector),每个term是一个维度,权重就是用的Tf-idf

 

原理上VSM不要求权重是Tf-idf,不过Tf-idf是被证明棒棒哒,所以Lucene用来Tf-idf

 

VSM得分实际上就是计算向量q和向量d的余弦相似度:

 

 V(q) · V(d) 就是点积, |V(q)| and |V(d)|就是做归一化

 

Lucene基于这个公式做了提炼,提高了质量和可用性:

  • 归一化V(d) 成为单位向量是有问题的,因为它移除了所有文档的长度信息。为了避免这个问题,使用了别的文档长度归一化因子: doc-len-norm(d)
  • 索引的时候,用户通过设定【文档boost】来指定某些文档就是比别的文档更重要的,乘一个doc-boost(d)
  • 搜索的时候用户可以对query再做boost。也要乘上这么一项

 

 

然后Lucene怎么实现呢?最终得到的是【实用评分函数】 Lucene's Practical Scoring Function

  • Query-boost在搜索开始的时候就知道了
  • Query Euclidean norm |V(q)| query归一化也是搜索开始就可以计算,但是它跟文档没有关系,从搜索优化的角度来说,根本就没必要算(所有文档都要乘一个相同的 |V(q)|,大可不必),直接干掉
  • 文档长度归一化、文档boost都是在索引期间就提前算好了。

 

注:相同的颜色代表对应的项

紫色的V(q) · V(d) 点积是怎么变换的?

V(q) · V(d) = tf(t in q)  · idf(t)  · tf(t in d)  · idf(t), query里的term必然出现 tf(t in q) = 1所以在公式中没有出现。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值