原文链接:https://cloud.tencent.com/developer/news/762466

本文要点:

  • 相关性得分是一个搜索引擎的核心,了解它的工作原理对创建一个好的搜索引擎至关重要。
  • Elasticsearch使用了两种相似度评分函数:5.0版本之前的TF-IDF以及5.0版本之后的Okapi BM25。
  • TF-IDF通过衡量一个单词在局部的常见性以及在全局的罕见程度来确定查询的相关性。
  • Okapi BM25是基于tf-idf的,解决了TF-IDF的缺陷,使函数结果与用户的查询更相关。
  • 我们可以使用Elasticsearch提供的_explain API来调试相似度评分函数的计算。

排序通常是通过计算语料库中的文档和用户查询之间的相关性或相似度评分来进行。相关性得分是一个搜索引擎的核心。

理解如何计算相关性得分是创建一个好的搜索引擎所必须采取的第一步。

使用Elasticsearch,我们可以开箱即用地计算相关性得分。 Elasticsearch 带有一个内置的相关性评分计算模块,称为相似度模块。

直到 Elasticsearch 5.0.0 版本为止,相似度模块一直使用TF-IDF作为它的默认相似度函数。

后继版本使用BM25(它是TF-IDF的变更版本)作为默认的相似度函数。

在本文中,我们将探讨TF-IDFBM25这两个函数,以及相似度评分在 Elasticsearch 中的工作原理。

  • TF-IDF函数的公式如下图:

TF-IDF公式

tf-idf 代表的是Term Frequency-Inverse Document Frequency。它是文本分析和自然语言处理中常用于计算单词之间相似度的函数。 TF-IDF 通过将词频(Term Frequency)反向文档频率(Inverse Document Frequency)相乘来工作。前者词频,是给定单词在文档中出现的次数。后者逆向文档频率,是对单词在语料库中的罕见程度进行评分的一种计算。单词越罕见,其得分就越高。

当我们要寻找与某个单词相关的文档时,我们希望这个单词是:

  1. 局部常见:该单词在文档中多次出现
  2. 全局罕见:该单词在语料库中出现的次数并不多。

如果文档中具有某个在局部常见但在全局罕见的单词,那么该文档就是与给定单词相关的文档。使用TF-IDF,在计算哪些是最相关的时候,我们可以同时考虑文档的局部常见因素和全局罕见因素。

词频

词频(Term Frequency)是一种考虑了局部常用词的计算。它的价值是显而易见的。 你可以通过计算这个单词在语料库文档中分别出现的次数来得到它。

因此,我们可以使用词频来计算文档与单词的相关性,但仅凭这一项是不够的。 我们仍然会遇到如下问题:

  1. 文档长度:如果我们在公式中只使用词频,那么文档越长将会被认为越相关。 假设我们有一个包含了 1000 个单词的文档,而另一个文档则只有 10 个单词,那么可以理解的是,我们查询的单词在包含了 1000 个单词的文档中出现的频率更高的几率自然要高得多。
  2. 常用词:如果我们只使用词频,并且查询“a”、“the”、“of”、“et”等常用词,那么最相关的文档将是包含了最多常用词的文档。 比如,我们有“The blue keyboard”和“The painting of the farmers and the plants”两个文档。 如果我们要查询“the keyboard”,则第二个文档似乎比第一个更相关,尽管从人类的角度看,我们知道这不是真的。

由于存在这些问题,所以不建议只使用词频来计算相似度评分。 幸运的是,通过引入逆向文档频率,我们可以避免上述两个问题。

逆向文档频率

逆向文档频率是一种将全局罕见词考虑在内的计算函数,某个单词在整个语料库中越罕见,那么它就越重要。

我们来看下逆向文档频率的公式:

我们可以看到N是我们语料库中的文档数,而df是包含某个单词的文档数。

让我们用一个极端的例子来说明这一点。 假设我们的语料库中有 100 个文档,每个文档中都包含单词“a”。 如果要查询单词“a”会发生什么呢?

正是我们想要的!当某个单词在全局范围内并不罕见(它存在于每个文档中)时,得分将会降为 0。

现在我们来看另一个例子。 像之前一样,我们的语料库中有 100 个文档。 但是现在,只有一个文档中包含了单词“a”。

可以看到,某个单词在语料库中越罕见,其计算评分就越高。

如果我们要查询一个以上的单词,那么逆向文档频率就非常重要了。 假设我们要查询包含两个单词“a”和“keyboard”的“a keyboard”。 我们可以认为“ a”在全局范围内并不罕见,而“keyboard”却很罕见。 如果我们只使用词频,那么包含更多“a”的文档将会显示成最相关的。 但我们知道这是错的,因为包含了 1 个“keyboard”的文档应该比包含了 10 个“ a”且没有包含“keyboard”的文档更相关。

TF-IDF计算示例

既然我们已经理解了什么是词率和逆向文档频率,以及它们为什么会如此重要,那么让我们来看一些示例吧。

假设语料库中有五个文档,每个文档中都包含了一个产品名称:

  • “Blue Mouse”
  • “Painting of a Blue Mountain with a Blue Sky”
  • “Blue Smartphone”
  • “Red Keyboard”
  • “Black Smartphone”

对于语料库中的这些文档,如果我们使用TF-IDF在语料库中查询“Blue”,哪个文档是最相关的呢?

我们需要计算单词“Blue”到每个文档的距离。让我们从第一个文档“Blue Mouse”开始。

还记得我们之前学过的公式吗?

根据这个计算,我们可以看到“Blue”和“Blue Mouse”之间的距离是 0.51。那其他文档呢?

以下是我们列出的所有文档的计算结果:

  • “Blue Mouse” = 0.51
  • “Painting of a Blue Mountain with a Blue sky” = 1.02
  • “Blue smartphone” = 0.51
  • “Red Keyboard” = 0
  • “Black Keyboard” = 0

正如预期的那样,单词“Blue”出现次数最多的文档被计算为最相关的文档。但是如果我们在查询中再加入“Mouse”这个单词呢?

使用“Blue Mouse”作为查询,我们需要首先要将其拆分为单词“Blue”和“Mouse”,然后计算它们到每个文档的距离。

其结果为:

  • “Blue Mouse” = 0.51 + 1.61 = 2.12
  • “Painting of a Blue Mountain with a Blue sky” = 1.02 + 0 = 1.02
  • “Blue smartphone” = 0.51 + 0 = 0.51
  • “Red Keyboard” = 0
  • “Black Keyboard” = 0

正如我们所看到的那样,“Blue Mouse”文档已经成了最相关的文档了,这正是我们所期望的。

TF-IDF的缺陷

tf-idf 就像变魔术一样,它可以按照我们想要的方式计算出最相关的文档!那么,为什么 Elasticsearch 和其他搜索引擎使用的是BM25而不是它呢?

Elasticsearch 在 5.0 版本之前其实一直都是使用TF-IDF来计算相似度评分的,但由于下面的这些缺陷,它后来转而使用BM25了:

  • 它并没有考虑文档的长度:假设我们有一个包含 1000 个单词的文档,其中单词“soccer”出现 1 次和单词“soccer”出现 10 次。你认为哪次的文档与单词“soccer”更相关?应该是单词出现 10 次时,因为与 1000 个单词中只出现一次相比,出现 10 次时文档与“soccer”相关的可能性更大。
  • 词频并不饱和:我们从上一节知道,IDF 将惩罚常用词。但是,如果有些文档本身就有这么多常用词呢?词频的值将会很大。由于 TF-IDF 函数的词频不饱和,会对含有大量常用词的不相关文档进行增强。

由于这些缺点,人们会认为BM25是最先进的相似度函数。

Okapi BM25

Okapi BM25是一个更适合现代用例的相似度评分函数。与TF-IDF一样,我们可以通过将TFIDF相乘来获得Okapi BM25函数的结果。只是,在Okapi BM25中,TFIDF公式本身是有不同的。

让我们来看下公式:

与 TF-IDF 相比,Okapi BM25的公式似乎有点吓人。对于公式和计算,我们就不作详细介绍了。

为什么Okapi BM25在相似度评分上优于TF-IDF

我们知道TF-IDF的缺陷使得它不太适合用于现代的搜索评分函数。那么,Okapi BM25是如何克服这些问题的呢?

TF-IDF的第一个缺陷是它没有考虑文档的长度。在这个公式的分母中,我们可以看到fieldLen/avgFieldLen。这意味着,如果文档的字段长度大于文档的平均长度,该函数将会对文档的得分进行惩罚。我们可以通过更改参数b来控制该函数对较长文档的惩罚程度。如果我们将b设置成一个较大的值,那么该函数将对较长文档的得分进行更多的惩罚。

第二个缺陷是“词频不饱和”。从上一节我们知道,TF-IDF中的词率会增强包含很多常见词的文档。在Okapi BM25函数中,参数k1将确定词频的饱和程度。k1的值越小,词频越饱和。我们可以看到词频的可视化如下图所示:

Okapi BM25 计算示例

现在我们已经知道了Okapi BM25的工作原理,那我们来尝试一下。对于这些示例,我们将使用 Elasticsearch 中默认的k1b

  • k1= 1.2
  • b= 0.75

我们使用TF-IDF示例中使用过的相同文档,并查询“Blue”。

  • “Blue Mouse” = 0.29
  • “Painting of a Blue Mountain with a Blue sky” = 0.23
  • “Blue Smartphone” = 0.29
  • “Red Keyboard” = 0
  • “Black Keyboard” = 0

正如我们看到的那样,结果与TF-IDF函数的相比有所不同。之前得分最高的“Painting of a Blue Mountain with a Blue sky”,现在比“Blue Mouse”和“Blue Smartphone”要低。这是因为我们现在考虑了文章的长度,且更喜欢较短的文章。我们也使词频变得饱和了。但是由于单词重复而产生的得分并没有 TF-IDF 函数的大,在这个例子中,这并没有真正显示出来。

所以,让我们使用b=0 来再试下。我们会得到什么呢?

  • “Blue Mouse” = 0.24
  • “Painting of a Blue Mountain With a Blue Sky” = 0.34
  • “Blue Smartphone” = 0.24
  • “Red Keyboard” = 0
  • “Black Keyboard” = 0

由于我们将参数b降为 0,所以该函数不再考虑文章的长度。 因此,文档“Painting of a Blue Mountain With a Blue Sky”成为得分最高的文档了。

现在,让我们试着把k1降为 0,看看会发生什么:

  • “Blue Mouse” = 0.24
  • “Painting of a Blue Mountain With a Blue Sky” = 0.24
  • “Blue Smartphone” = 0.24
  • “Red Keyboard” = 0
  • “Black Keyboard” = 0

所有包含单词“Blue”的三个文档的得分都是相同的,因为当k1降为 0 时,词频不会影响得分。如果我们试着将k1增加到一个更大的数字,该函数将会提高重复出现查询词的文档的评分。

Elasticsearch中的相似度评分机制相关推荐

  1. 【Elasticsearch】Elasticsearch中的相似度评分介绍

    1.概述 转载:Elasticsearch中的相似度评分介绍 本文要点 相关性得分是一个搜索引擎的核心,了解它的工作原理对创建一个好的搜索引擎至关重要. Elasticsearch 使用了两种相似度评 ...

  2. 【Elasticsearch】实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分

    1.概述 翻译:https://www.elastic.co/cn/blog/practical-bm25-part-1-how-shards-affect-relevance-scoring-in- ...

  3. Elasticsearch中基于词项的搜索

    为了方便我们学习,我们导入kibana为我们提供的范例数据. 目前为止,我们已经探索了如何将数据放入Elasticsearch,现在来讨论下如何将数据从Elasticsearch中拿出来,那就是通过搜 ...

  4. Elasticsearch中的Multi Match Query

    在Elasticsearch全文检索中,我们用的比较多的就是Multi Match Query,其支持对多个字段进行匹配.Elasticsearch支持5种类型的Multi Match,我们一起来深入 ...

  5. 逆水寒捏脸服务器维护,《逆水寒》优化热门服务器排队体验 捏脸颜值评分机制优化...

    2) 整容时,新增了一个[还原修改]按钮,点击可以将本次在捏脸界面的操作都清除,还原为整容前的容颜. 3) 颜值评分机制优化,发型.妆容等部分也加入评判范围 3. "倚竹袖长寒卷翠,凌波袜小 ...

  6. ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

    全文搜索两个最重要的方面是: 相关性(Relevance) 它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法.地理位置邻近.模糊相似,或 ...

  7. 2021年大数据ELK(五):Elasticsearch中的核心概念

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Elasticsearch中的核心概念 一.索引 index 二 ...

  8. SBB:无机肥对土壤中固氮菌丰度和群落结构的影响

    文章目录 25年的无机施肥处理对华南酸性土壤中固氮菌丰度和群落结构的影响 写在前面 摘要 背景 结果 玉米生物量与土壤性质 图 1 25年(1990 - 2015)的长期施肥试验的玉米生物量 表 1 ...

  9. 如何用你最熟悉的 SQL 来查询 Elasticsearch 中的数据?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! Elasticsearch 是一个全文搜索引擎,具有您期 ...

最新文章

  1. JsonDB php json数据库 NoSql
  2. 【数据竞赛】从0梳理1场时间序列赛事!
  3. oracle10g ty_str_split,Oracle split(分隔字符串函数)
  4. idea 添加servlet依赖_详解如何使用IntelliJ IDEA新建一个Servlet项目
  5. npoi操作word书签_100份Word文档合并只需3分钟?不用复制粘贴,简单到一学就会...
  6. 更新浏览器CSS样式表
  7. 数据分析师的30种死法
  8. Cygwin-安装和配置ssh服务
  9. C#可空类型(Nullable)
  10. excel公式里用html,Excel公式中{}是什么意思?要如何用?
  11. 史上最简单的word文档docx文档解密方法,忘记word文档docx密码怎么办?
  12. 设置网页视频播放倍速
  13. word怎么删除参考文献的横线_word2016怎么去掉引用参考文献中的横线
  14. 辽宁启迪电商:拼多多选款对于店铺权重提高有帮助吗?
  15. QT基于百度的人脸考勤系统
  16. 面对互联网风口下的人口老龄化,AI智能如何做好医疗健康管理?
  17. 什么是脏读、幻读、不可重复读?要怎么处理?
  18. QX5299人体感应太阳能LED灯控制器
  19. 在canvas中应用font-awesome字体
  20. iar环境下c语言编程,在IAR中编译C程序代码用printf调试

热门文章

  1. 中国石油大学《安全管理学》第三阶段在线作业
  2. 物联网毕业设计 单片机空气质量检测仪
  3. 汉字转拼音 python_python把汉字转换成拼音实现程序
  4. strcpy函数的模拟实现
  5. 高考志愿-各校专业成绩
  6. opencv能够打开摄像头却无法获取摄像头数据
  7. Aruba:无限你的无线
  8. (4)微信UI自动化-联系人采集(C#)
  9. 管理电脑文件11条妙招
  10. 双百双新产业项目是什么_广西:“双百双新”产业项目集中开竣工