Elasticsearch分布式搜索引擎搜索引擎

Lucene 6.0 默认算分公式 TF-IDF 详解(官方文档

2017-11-27  本文已影响44人  Mr韶先生

前言

Lucene官方文档
http://lucene.apache.org/core/6_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

上篇文章中介绍了Lucene中下一代的打分公式以及Lucene经典的TF-IDF打分公式。那么Lucene中真正的打分公式是怎样的呢?接下来我们分析一下Lucene的源码(Lucene6.0,从6.0开始Lucene默认打分公式切换到了BM25)了解一下Lucene中具体的TF-IDF打分公式。

相似性计算

Lucene中的相似度计算是信息检索的中布尔模型(Boolean model)和向量空间模型( Vector Space Model,VSM)的结合。在Lucene的VSM中,文档和查询被表示为多维空间中的加权向量,其中每个不同的索引词是维度,权重是tf-idf值。

VSM并不要求必须使用tf-idf的值来计算,但是tf-idf计算的值被认为能够产生高质量的搜索结果,因此Lucene中使用tf-idf的值来计算相似性。下面让我们看一下对于给定的文档d,在确定的查询q下的余弦相似度:


其中



是加权向量的点积, 是他们的欧几里得距离。
注意,向量空间模型的基础是余弦定理,即使用两个向量的夹角来表示相似度

Lucene概念评分公式

Lucene从搜索质量和可用性两方面修改了SVM计算:

Lucene的实用得分公式

概念公式是在某种意义上的简化,(1)词和文档是在域上的,(2)提权通常是基于查询词而不是查询的。
现在来描述Lucene如何实现这个概念评分公式,并从中推导出Lucene的实用评分函数,
为了有效的计算分数,一些评分项会被预先计算和聚合:

以上,可得出Lucene的实用得分公式:


Lucene Practical Scoring Function

其中tf(t in d)与词频相关,是词t在文档d中出现的次数,词频越高文档得分越高,对于tf(t in q)默认认为查询的词频为1,Lucene中的默认计算公式为:


idf(t)是逆文档频率,这个值与docFreq(词t在文档中出现的次数)的倒数有关,即文档频率越低得分越高,Lucene中的默认计算公式为:


coord(q,d)是基于在指定文档中找到多少查询词的分数因子。通常,查询词多的文档比查询词少的文档得分更高。这个值是搜索时动态计算的,Lucene中默认的计算公式如下:


maxOverlap:是Query中有效的term数;overlap:表示文档中出现term数

queryNorm(q)是用于使查询之间的分数相当的标准化因子。这个因素不影响文档排名(因为所有排名的文档都乘以相同的因子)而只是试图使得来自不同查询(甚至不同索引)的分数具有可比性。这是一个搜索时因子,由搜索时有效的相似度计算得出。Lucene中的默认计算公式为:


查询项的平方权重的总和由查询权重对象计算。例如,一个BooleanQuery计算这个值为:


q.getBoost()是查询级别的提权,即概念评分公式中的query_boost(q),查询中的每个词的词频默认为1,因此
的计算公式变为
t.getBoost()是查询过程中对查询q的文本中的指定词t的提权(默认为1,请参阅查询语法),该值也可以通过使用BoostQuery进行设置。
请注意,在多项查询中没有直接的API来获取一个词的权重,但是多词查询可以被表示为多个TermQuery对象,因此可以通过调用子查询的getBoost()来获取。

norm(t,d)在索引过程中封装了一些域权重和长度因子:

computeNorm(org.apache.lucene.index.FieldInvertState)方法负责将所有这些因素组合成一个浮点数。
当一个文件被添加到索引时,所有上述因子都会相乘。如果文档具有多个名称相同的Field,每个Field的权重相乘作为最终权重。


norm(t,d)在索引时计算完毕后将编码为一个Byte存储起来,在搜索时,再从文件中读取出该值并解码成float。在这个过程中,可能会造成精度的缺失,并不能保证decode(encode(morm(t,d))) = morm(t,d)。

以上是Lucene6.0中的javadoc文档翻译。

Lucene评分公式的理解

Lucene中使用空间向量模型,其基于余弦定理,对于搜索中的每一个词term看做向量中的一维,每一维度的值由Lucene中的tf-idf打分公式给出,最后使用余弦定理获得搜索结果的最终得分。

向量余弦定理


假设

boost的作用就是在索引时或搜索时,改变filed或者term的重要,从而影响文档的最终得分。

  1. 两个时间点:搜索时和索引时,都能设置
  2. 四个级别:Query条件、文档、字段和词条

Lucene概念得分公式到实际得分公式之间的转变

Lucene Conceptual Scoring Formula Lucene Practical Scoring Function

coord_factor(q,d)不变,使用符号coord(q,d)代替,表示文档中与查询词匹配的term数与有效查询词的个数的比值;

概念公式中的
作为实际公式中的queryNorm(q),请看之前具体公式;
doc_len_norm(d) * doc_boost(d)合并到 之中,作为实际公式中的

Lucene不同版本中算分公式中的变化

Lucene4.0之前并没有org.apache.lucene.search.similarities包,其默认打分公式是放在org.apache.lucene.search.DefaultSimilarity类中的tf-idf计算公式,在Lucene4.0之前,对Document可以使用方法setBoost(float boost)设置文档权重,4.0之后就删掉了该方法;

在4.0之后增加了专门的包org.apache.lucene.search.similarities用来计算搜索得分,默认使用本文介绍的计算方法,在搜索过程中计算结果得分,4.0到6.0之间一直使用tf-idf作为Lucene默认的算分公式;

Lucene6.0之后,更换了默认的算分公式,默认使用BM25算法计算搜索过程中的文档得分。

参考文献:
http://blog.csdn.net/zteny/article/details/57366074
http://blog.csdn.net/woaizhoulichao1/article/details/6663275

注:能力一般,水平有限,如有不当之处,请批评指正,定当虚心接受!

上一篇 下一篇

猜你喜欢

热点阅读