浅谈文章相关性打分机制

203 阅读3分钟

在学习数据库的时候,就接触到了查询,在学习查询的时候,又接触到了模糊查询,最近参与一个搜索引擎项目的开发,发现,在搜索引擎搜索的过程当中,除了精确命中之外,相关性也很重要。

思考

起初的时候,觉得一次搜索,就是查询命中的内容,比如,搜索 '飞机',在返回飞机相关的内容的时候,希望可以把最相关的内容排列在前面返回,并且类似飞艇,飞船等相关内容也希望有返回,或者作为相关性推荐,那么这个时候如果用mysql like这样的模糊查询感觉是不够的,所以就有了文档相关性打分。

基本概念

词频

首先,要了解一个概念就是词频,就是一个单词在文章当中出现的次数,还是比如搜索 '飞机',第一段出现了一次,第二段出现了五次,那么相关性上第二段要高于第一段,当然,这里只是基于词频举例,实际上要考虑的因素要更多。

逆文档频率

比词频复杂一点的就是逆文档词频了,逆文档词频是对词的考量,如果一个词,在一篇文档当中出现的评率很高,在其他的文档当中出现的频率也很高,那么这个词在相关性打分过程当中的权重也就很低,比如'的'字,几乎在所有文章当中出现评率都很低,但是实际计算相关性的时候,这个字的权重就很低。

ES的相关性算法

ES采用的是Luncenc的打分机制,Luncenc的默认打分公式如下:

image.png

这个公式超级难打(嘿嘿嘿)

简单做一个翻译:

给定查询q和文档d,其得分是查询中给个词条t的等分总和,每个词条的得分是盖茨在文档当d中的词屏(TF)的平方根乘以改词逆文档频率(IDF)的平方再乘以文档字段的归一化因子和该词的提升权重。

这段很绕口,开头自己看的时候晕晕的,所以对每个变量进行了注释,这里在解释一下归一化和提升权重:

归一化:luncenc认为端的句子比长的句子更加重要,比如标题没有内容长,但是标题在相关性计算的时候权重高(这个需要结合语文来理解,嘿嘿嘿),那么,再深度思考,词频高,也就是说句子长这样带来的权重会受到句子长度的抵消,归一化因子就是有此带来的因素。

提升权重是提供给人为干预打分的一个值

这里讲了这么多,大家不要担心,实际操作es的时候并不需要直接操作这个公式,只是作为理解,当然除了这种相关性打分算法之外,还有很多,我们之后再聊,还是请各位大佬多多指点。