ES入门十二:相关性评分

news2024/11/20 12:43:42

对于一个搜索引擎来说,对检索出来的数据进行排序是非常重要的功能。全文本数据的检索通常无法用是否相等来的出结果,而是用相关性来决定最后的返回结果

相关性是值搜索内容和结果的相关性,是用来描述文档和查询语句的匹配程度的。通过计算相关性,可以得出一个相关性评分,然后根据评分对结果集进行排序,返回最符合的数据给用户。所以打分最终的目的是为了对结果进行排序,找出最匹配的结果集展示给用户。

那查询语句与文档的相关性该如何计算那?或者说用什么来作为相关性的依据呢?今天我们就来学习Lucene的相关性算分模型

设计我们自己的相关性算分模型

在不了解Lucene的相关性算分模型是如何实现之前,如果给你来设计相关性算分的模型,你有没有思路?

要找出与查询语句相关性最高的文档集合,是不是可以有这样的一种想法:把查询语句分词,如果某个词项在相关的文档中出现的频率越高,相关性就越高?然后把每个词项在文档的出现频率相加得到评分是不是可以作为相关性评分?如下表:
image.png
如果我们搜索“java in linux”的话,将这个查询语句分词后可以命中文档2,4,5。那么按照我们上述的步骤计算评分的话,操作如下:

  1. 求出linux、java这2个词项分别在2、4、5中出现的频率
  2. 将对应的频率进行相加,然后得出最终的评分如下:
sorce(doc 2) = F(java) + F(linux)
sorce(doc 4) = F(java) + F(linux)
sorce(doc 5) = F(java) + F(linux)

其中频率F(linux)的含义是:“linux”这个词在文档中出现的次数除以文档的总次数。需要注意的是,一些停顿词(the、in这些)本身没有意义,而且它们在文章中出现的频率非常高,所以它们的评分是不应该被考虑的!

在我们设计的算分模型中,数据的相关性有词项在文档中出现的频率高低来决定。而现实中,很多著名的算分模型就是基于概率统计的,例如:TF-IDF、BM25

TF-IDF算法模型

TF-IDF(Term Frequency-inverse Document Frequcency)是信息检索领域非常重要的发明,TF-IDF是一种关键词统计方法,用来反映一个词在一个文档集合或者资料库中的重要程度。其通常作为信息检索、文本挖掘、用户建模的加权因子。现在的搜索引擎很多依赖于TF-IDF,但都进行了微调和优化。

TF-IDF模型的思想其实都是说了这么一件事:如果一个词在一篇文章中出现的次数多,那么这个词对于这篇文章来说就越重要。但同时如果这个词在这个词库中出现的次数越多,那么其就不那么重要了,例如停用词就会在整个语料库中频繁出现,所以反而不那么重要了。这样做可以提高关键词与文章的相关性,并且减少常用词对结果的影响。换句话来说:一个词的重要程度跟它在一篇文中出现的频率成正比,跟它在语料库中出现的频率称反比

TF-IDF 中的概念:TF、DF、IDF

TF-IDF模型的公式中,主要包括:TF、DF、IDF三个概念,下面来看看这三个概念的定义和它们的计算过程

  • TF(Term Frequency On Per Document):表示一个词在一篇文章中出现的概率。TF的计算公式为:

image.png

  • DF(Document Frequency):表示词项在语料库中出现的频率。其计算公式为:

image.png

  • IDF(Inverse Document Frequency):表示逆文档频率,其可以通过DF计算得到,可以简单的理解为DF的倒数。其计算公式为:

image.png
如上公式,词项的IDF=log(1/DF),可以忽略log,只看里面的(1/DF),那么如果词项的IDF越高,说明词项在语料库中越稀有,所以IDF表示词项在语料库中的稀有性

在熟知了TF、DF、IDF这三个概念后,我们来看看TF-IDF算分的公式:

tf-idf(termA) = TF(termA) * IDF(termA)

如上公式,可以得出tf-idf(termA)与TF(termA)正相关,与IDF(termA)正相关。说白了,就是一个词项在一篇文章中出现的越多,其对于这篇文档来说越重要,同时这个词项在整个语料库中的越少,其对于这个文档来说越重要。tf-idf 本质上是对 TF 进行了加权计算,而这个权重就是 IDF。
那回到 “java in linux” 这个查询,我们可以这样来计算每个匹配文档的得分:

sorce(D) = TF(java) * IDF(java) + TF(linux) * IDF(linux)

如上公式,其中D为某个匹配的文档,score(D)的值为各个词项的TF-IDF值的和

Lucene的TF-IDF算分公式

image.png
如上图所示的是Lucene的TF-IDF算分公式,公式中的各个项都容易理解,图中也做了注释,下面对几个项进行解析,其他不在赘述。

  • norm(t,d):是文档长度的加权因子,在索引文档时候就确定了的参数,其由文档的长度(也就是字段的内容长度)来去定,它可以提高短文档的分数
  • coord(q,d):将查询内容分词后,如果匹配的文档出现的分词后的词项越多,coord(q,d)越大
  • queryNorm(q):是一个归一化因子,使得查询之间的分数具有可比性
  • tf(t in d):Lucene中tf于标准的TF-IDF中的TF计算公式不一样,其值为t在文档d中出现次数的平方根
  • Idf(t):Luence中逆文档频率与上面的IDF公式也有点不一样,idf(t) = 1+log【(文档总数+1)/(匹配的文档树+1)】

TF-IDF 在 Lucene 中的实现文档可以参考:Lucene-TFIDF

BM25 算分模型

BM是Best Matching(最佳匹配)的缩写。在信息检索的领域,OKapi BM25是搜索引擎用来评估文档相关性以进行排序的函数,这个方法是上世纪七八十年代在概率检索的框架下被提出的,Okapi是第一个使用这个方法的信息获取系统的名称

BM25是基于词频的,它不会考虑多个搜索词项在文档里靠不靠近,只考虑它们各自在文档中出现的次数。BM25是一系列的评分函数,它们彼此之间有形式和参数个数的差异。最常用的形式之一如下:
image.png
如上图,公式中的各项同样很容易理解,下面对比较特别的几项进行介绍:

  • k1和b:它们是自由参数,k1的取值范围为[1.2, 2.0],k1默认是1.2,而b=0.75
  • |D| / avgdl:文档越短的话,此值越小,所以当tf(t in d)相等的情况下,公式后半部分取值越高。其值反映了词项在匹配文档中的重要性,对短篇文档更有利
  • idf(t):为词项t的逆文档频率,但其计算方式跟TF-IDF中介绍的公式有点不一样,普通版的计算公式为:

image.png
如上图所示,其中N为语料库中文档的总数,n(t)为包含词项t的文档个数,遗憾的是,当含有词项的文档数量大于语料库的一半时候,此公式的idf(t)为负。所以一般会对此公式优化:
image.png
通过进行加一的操作,可以避免对数后的结果出现负数的情况

下面来对比一下Lucene TF-IDF、BM25优化版、BM25版的IDF公式,语料库中共计100个文档,匹配的文档个数从1到100,图中横坐标为匹配的文档个数,纵坐标IDF公式计算出来的值
image.png
上面我们说过IDF的作用是代表了词项在语料库中的稀有性,也是一个词项的权重,所以这个权重不应该为负数,并且当所有文档出现了某个词项,那么这个词项在语料库中就不稀有了,其权限应无限接近于0才是合理的。相比之下,优化后的BM25中的IDF公式更符合我们的需求

TF- IDF与BM25的比较

相对于TF-IDF来说,BM25降低了TF对算分的影响力。当TF无限增加时,TF-IDF模型的算分也会无限增加,而BM25则会趋于一个值。如果不考虑文档长度的影响(|D|/avgdl = 1 了),BM25 的 TF 算分的公式为:(tf * (k1 + 1)/ (tf + k1))参考BM25算分公式的后半部分
image.png
如上图,当TF无限大的时候,BM25的TF算分结果无限逼近于(k1+1),虽然TF越大意味着这个词项相关性更大,但很快其影响力就下降了,收益递减。而Lucene的TF-IDF中词频的相关性会一直增加,算分也一直增加。

经过这么一比较,其实可以发现,k1 的作用是用来调节词频的影响力的。如果 k1 = 0,那么公式的后半部分 (tf * (k1 + 1)/ (tf + k1))= 1,即不再考虑词频的影响了。而 k1 为较大值时,(tf * (k1 + 1)/ (tf + k1))会与 tf 保持线性增长。
回过头来看,我们似乎还不知道 b 这个参数的意义到底是什么。我们令 L = |D|/avgdl,那么公式的分母部分可以表示为:tf(t in d) + k1 * (1 - b + b * L),可以看到,b 控制了文档篇幅对于得分的影响程度,当 b = 0 的时候,文档长度将不影响算分,而当 b = 1 的时候,将不起调节作用。
而 k1 和 b 都是可以用户自己设定的,如下实例,可以在创建Mapping的时候指定一个 similarity 的k1 和 b 值,并应用到每个字段中:

PUT test_similarity_index
{
  "settings": {
    "index": {
      "similarity": {
        "my_similarity": {
          "type": "BM25",
          "k1": 1.3,
          "b": 0.76
        }
      }
    }
  },
  "mappings": {
    "properties" : {
        "title" : { "type" : "text", "similarity" : "my_similarity" }
    }
  }
}

总结

本文为你介绍了数据相关性的原理,我们从自己设计相关性算分模型出发,学习了经典的 TF-IDF 、BM25 算分模型。
TF-IDF 模型中主要有3个部分:

  1. TF 是词项在文档中出现的频率,代表了这个词项对文档的重要程度。其中 Lucene 的 TF 实现为 t 在文档 d 中出现次数的平方根。
  2. DF 词项在整个语料库中出现的频率,DF 越大词项的重要程度也就越低。
  3. IDF 也叫逆文档频率,代表了词项在语料库中的稀有程度,其在计算得分时作为 TF 的权重。

在 ES 5.0 的版本后,ES 默认使用了 BM25 的算分模型,相对 TF-IDF 来说,其优化点在于降低 TF 对算分结果的影响力,并且引入了可以自定义的参数:k1 和 b,其中 k1 用来调节词频的影响力的,而 b 则控制了文档篇幅对于得分的影响程度。
好了,在学习了 ES 的算分模型后,大家可以结合之前学习的数据操作、查询的 API 来做一些实践啦。
可以使用 explain API 来查看算分的过程:

POST your_index/_search
{
    "explain": true, # 开启 explain
    "query": .....
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot+Vue项目-基于Java+MySQL的校园管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

bugku-web-login1

<!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title>WEB管理系统</title><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content…

【STL详解 —— list的模拟实现】

STL详解 —— list的模拟实现 list接口总览结点类的模拟实现构造函数 迭代器类的模拟实现迭代器类的模板参数说明构造函数运算符的重载--运算符的重载运算符的重载!运算符的重载* 运算符的重载-> 运算符的重载 list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载…

SQL语法 case when语句用法讲解

CASE WHEN解释 &#xff1a; SQL中的CASE WHEN语句是一种条件表达式&#xff0c;它允许你根据不同的情况返回不同的值。CASE WHEN通常用于SELECT语句中&#xff0c;用于创建新的列&#xff0c;该列的值取决于其他列的值。CASE WHEN可以用于任何可以使用表达式的地方。 大致概…

顺序表(增删减改)+通讯录项目(数据结构)

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下&#xff0c;就像大家去吃饭&#xff0c;然后左边是苍蝇馆子&#xff0c;右边是修饰过的苍蝇馆子&#xff0c;但是那个好看的苍蝇馆子一看&#xff0c;这不行啊&a…

UI自动化测试中公认最佳的设计模式-POM

一、概念 什么是POM&#xff1f; POM是PageObjectModule&#xff08;页面对象模式&#xff09;的缩写&#xff0c;其目的是为了Web UI测试创建对象库。在这种模式下&#xff0c;应用涉及的每一个页面应该定义为一个单独的类。类中应该包含此页面上的页面元素对象和处理这些元…

css 实现排行榜向上滚动

使用动画实现无线向上滚动 复制一层dom&#xff0c;使用动画向上滚动&#xff0c;鼠标hover的时候暂停动画 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

Java调用WebServices接口

当拿到一个WebServices接口时&#xff0c;首先用接口测试工具调用一下接口&#xff0c;看是否可以正常发送请求和获取返回接口&#xff0c;确保接口是没有问题的&#xff0c;可以用SoapUI工具进行测试。 下面以一个免费的天气预报接口为例&#xff0c;记录整个接口的调用过程。…

【echarts】支持根据data中最大的数值来动态计算y轴最大数据以及间隔

以这个图例可以看到Y轴最大显示到250ml&#xff0c;如果超过就会出现有一部分数据看不到了&#xff1a; https://echarts.apache.org/examples/zh/editor.html?cmix-line-bar 那么如何根据这个data数据的最大值&#xff0c;来动态计算y轴最大数据以及间隔呢&#xff1f; 那我…

数组(java)

目录 数组的定义和使用&#xff1a; 数组的初始化&#xff1a; 遍历数组&#xff1a; 数组是引用类型 初始JVM的内存分布 再读引用变量 认识null 数组的应用场景 作为函数的参数 作为函数的返回值 数组练习 数组转字符串 排序 冒泡排序 数组逆序 数组求平均…

伺服驱动器算法入门的一些建议和书籍推荐

希望此篇文章对想从事伺服驱动器的研发工作的一些刚刚入门的同学一些建议。 针对伺服驱动器的研发工作涉及的知识和需要掌握的技能主要分为两部分&#xff0c;第一是原理部分、第二是工程实践部分。原理部分的学习在此主要推荐大家查看一些入门书籍&#xff0c;本文章中也对书籍…

【vue】导入组件

先行知识 用vite创建vue项目 1.导入组件 项目结构 App.vue中&#xff1a; 导入后&#xff0c;App.vue是Header.vue和Footer.vue的父组件 参考 https://www.bilibili.com/video/BV1nV411Q7RX

在js中计算两个时间段重叠的时长问题

文章目录 前言一、过程分析二、实现代码(js)总结 前言 最近遇到一个需求&#xff0c;就是在js中计算两段时间的重叠时长问题&#xff0c;这里记录一下。 一、过程分析 两段时间的重叠问题&#xff0c;一般有3中情况 两段时间完全无重叠&#xff0c;也就是无任何交集两段时间…

08 Php学习:if语句、Switch语句

PHP 条件语句 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码&#xff0c;…

【树哈希】CF1182D Complete Mirror

CF1182D - Complete Mirror Description 给定一个 n n n 个点的无根树&#xff0c;求一个树根 r o o t root root,使得对于任意两个节点 v 1 , v 2 v_1,v_2 v1​,v2​&#xff0c;若满足 d i s t ( v 1 , r o o t ) d i s t ( v 2 , r o o t ) dist(v_1,root)dist(v_2,ro…

【CSS】SVG图片属性及修改颜色

最近的开发中遇到了SVG不能修改颜色的问题&#xff0c;以前是直接用&#xff0c;没有研究过&#xff0c;现在搞个笔记记录下 SVG的属性&#xff1a; width:设置最终SVG图片的宽度height:设置最终SVG图片的高度viewbox&#xff1a;视区&#xff0c;在svg上截取一块&#xff0c…

C++--用list容器处理约瑟夫环问题

约瑟夫环 约瑟夫环问题是一个经典的数学问题&#xff0c;描述如下&#xff1a; 假设有 n 个人站成一圈&#xff0c;编号从 1 到 n。从第一个人开始报数&#xff0c;报到 m 的人出列&#xff0c;然后下一个人继续从 1 开始报数&#xff0c;直到所有人都出列为止。问最后留下的…

013:vue3 Pinia详解使用详解

文章目录 1. Pinia 是什么2. Pinia 功能作用3. 手动添加Pinia到Vue项目4. Pinia基础使用5. getters实现6. action异步实现7. storeToRefs工具函数8. Pinia的调试9. 总结 1. Pinia 是什么 Pinia 是 Vue 的专属的 最新状态管理库是 Vuex 状态管理工具的替代品和 Vuex 一样为 Vue…

ESP-IDF移植lvgl 驱动 ST7789

文章目录 1 前言2 准备3 移植LVGL3.1 工程准备3.2 修改 CMakeLists.txt文件编译 LVGL3.3 编译LVGL 4 编译 ST7789 LCD驱动5 发现问题 1 前言 本教程开始学习 LVGL的&#xff0c;开始之前要把环境配置好&#xff0c;首先就需要移植 lvgl&#xff0c;使用的是 esp32 环境&#xf…

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非常好。 可以先去看一篇视频&#xff0c;再来参考这篇笔记&#xff08;或者说直接偷走&#xff09;。 …