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

前言

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计算:

  • 由于上述公式中消除了文档d的长度信息的影响,对某些文档消除文档长度信息是合理的,例如,一个通过复制某一段10次而成的文件。但是对于不包含重复段落的文件,这可能是错误的。为了避免这个问题,使用不同的文档长度归一化因子doc_len_norm(d).
  • 在进行索引时,用户可以指定某些文档比其他文档更重要,即对文档提权。每个文档的分数需要乘以其指提权值doc_boost(d).
  • Lucene是基于域(Field)的,因此除了文档提权之外还有域提权,例如,文档中的title域其中的内容可能要比content域中的内容更重要,因此在索引过程中可以单独对文档的某个域进行提权。在索引过程中,可以将相同的域添加到文档中(即可以多次添加相同的域),因此域的提权是文档内该域添加提权的乘积。
  • 搜索时用户可以对每个查询、子查询、查询词进行提权,因此查询词对文档得分的贡献需要乘以该查询词的提权query_boost(q).
  • 一个文档可以匹配查询的多个词,因此可以根据匹配查询的词的个数对文档提权,使用调节因子进行调节coord_factor(q,d).
    综上所述,我们可以得到Lucene的概念公式:


    Lucene Conceptual Scoring Formula

Lucene的实用得分公式

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

  • 在搜索开始时,查询(实际上对于每个查询词)的Query_boost(查询提权)是已知的。
  • 可以在搜索开始时计算,因为它与被评分的文档无关。从搜索优化的角度看,为什么要那么麻烦要对查询进行归一化处理?每个计算的文档都会被乘以相同数值,文档的最后得分不会因其而改变。但是由于以下原因需要保持这个计算:

    • 余弦相似性可以用于比较文档的相似性,也就是说三分是文档级别的,因此查询可以看做是一个文档,只是这个文档比较小,只包含查询词。该值使得两个不同查询的结果文档的得分是可以比较的。对于同一个Index的同一个Query该值是唯一的。作为查询归一化,那么它作用就是缩小同一个Query在不同Index上产生的影响。这使得分布式查询(同一个Query用在不同的Index上并计算文档的分数)的评分变得有意义和有可比性。
    • 其可以防止由于浮点精度限制而导致分数数据丢失。
  • 文档长度归一化doc_len_norm(d) 和文档提权doc_boost(d)在索引期间是已知的,它们是事先计算出来的,它们的乘积在索引中保存为一个单一的值norm(t in d) 其代表着 norm(field(t) in doc d) ,field(t)表示与t相关的域。

以上,可得出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)在索引过程中封装了一些域权重和长度因子:

  • Field boost - 通过在将字段添加到文档之前调用field.setBoost()来设置。衡量Field的重要程度。
  • lengthNorm - 当向索引中添加文档时,分别计算不同Field在文档中的长度(term的个数),默认长度短的Field会获得更高的得分。该值在索引建立过程中计算。

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606网站:h...
    布客飞龙阅读 573评论 1 37
  • 接着1接着写了。 记得到了连队以后,跟着全连官兵一起吃饭,餐厅里只是筷子跟饭缸碰撞的声音,没有任何人...
    王者传说阅读 186评论 0 2
  • 曾经有人说过,人生就是在做减法。越是长大,你就越来越懂得人情世故,你便开始失去那份天真烂漫。最残忍的减法,是失去一...
    小百姓阅读 249评论 0 0
  • 2017年的春节,已经悄然过半,有人在聚会喝酒,有人喜迎贵子,有人在被长辈逼婚,有人享受天伦之乐,而小天和他的父母...
    空思我阅读 310评论 0 0
  • 毕业后就很少追剧了,国产剧太冗长,我没有耐心看,唯一一部看完的就是琅琊版。如果不是环环相扣,估计也看不下去。...
    过把瘾就死01阅读 660评论 0 0