你知道es是如何计算相似度得分的吗?

2023-11-09

1.es中相似度计算公式-BM25

6.x版本和7.x 版本的es的默认得分计算方式都是BM25。

假如用户给定一个输入 Q Q Q,其包含了关键字 q 1 , q 2 , . . . . . . q n , q_1,q_2,... ... q_n, q1,q2,......qn,那么该输入 Q Q Q与文档 D D D的BM25得分为:

score ⁡ ( D , Q ) = ∑ i = 1 n IDF ⁡ ( q i ) ⋅ f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ avgdl ⁡ ) \operatorname{score}(D, Q)=\sum_{i=1}^{n} \operatorname{IDF}\left(q_{i}\right) \cdot \frac{f\left(q_{i}, D\right) \cdot\left(k_{1}+1\right)}{f\left(q_{i}, D\right)+k_{1} \cdot\left(1-b+b \cdot \frac{|D|}{\operatorname{avgdl}}\right)} score(D,Q)=i=1nIDF(qi)f(qi,D)+k1(1b+bavgdlD)f(qi,D)(k1+1)

参数说明如下:

  • s c o r e ( D , Q ) score(D,Q) score(D,Q) : 表示用户输入Q与文档D的相关性得分
  • I D F ( q i ) IDF(q_i) IDF(qi) : 关键字 q i q_i qi的逆文档频值, IDF ⁡ ( q i ) = ln ⁡ ( N − n ( q i ) + 0.5 n ( q i ) + 0.5 + 1 ) \operatorname{IDF}\left(q_{i}\right)=\ln \left(\frac{N-n\left(q_{i}\right)+0.5}{n\left(q_{i}\right)+0.5}+1\right) IDF(qi)=ln(n(qi)+0.5Nn(qi)+0.5+1)
  • f ( q i , D ) f(q_i,D) f(qi,D) : 关键词 q i q_i qi在文档D中的频数
  • N :全部文档的个数
  • n ( q i ) n(q_i) n(qi) : 包含关键字 q i q_i qi所有文档的个数
  • a v g d l avgdl avgdl:文档平均token个数,全部文档包含的token个数总和除以总文档数
  • ∣ D ∣ |D| D:文档D包含的token的个数
  • k 1 k1 k1:超参数,该值越小 大词频的词对整体得分的贡献就会越会被抑制,默认值是1.2
  • b:超参数,该值越大,包含相同多关键词 q i q_i qi情况下,文档得分越短得分越高,若该值为0,b的默认值是0.75

为了了解一下超参数k1的对最终得分的影响,假定b=0,然后观察一下公式: f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ avgdl ⁡ ) \frac{f\left(q_{i}, D\right) \cdot\left(k_{1}+1\right)}{f\left(q_{i}, D\right)+k_{1} \cdot\left(1-b+b \cdot \frac{|D|}{\operatorname{avgdl}}\right)} f(qi,D)+k1(1b+bavgdlD)f(qi,D)(k1+1)值的变化

f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 \frac{f\left(q_{i}, D\right) \cdot\left(k_{1}+1\right)}{f\left(q_{i}, D\right)+k_{1} } f(qi,D)+k1f(qi,D)(k1+1)值的变化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKV5a8fn-1642578889247)(%E5%85%B3%E4%BA%8Ees%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E7%9B%B8%E4%BC%BC%E5%BA%A6%E5%BE%97%E5%88%86%E7%9A%84%2046434b09ef1f4271987d374017945cba/Image_2.png)]

从上图可以看出 ,k1值越小,随着关键词 q i q_i qi的词频 f ( q i , D ) f(q_i,D) f(qi,D)增加,对于 f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 \frac{f\left(q_{i}, D\right) \cdot\left(k_{1}+1\right)}{f\left(q_{i}, D\right)+k_{1} } f(qi,D)+k1f(qi,D)(k1+1)的增幅越小。

2.查看es的得分计算过程

当使用es进全文查询时,es会计算出每一个返回文档的相关得分“_score”。

在查询的时候,通过设置“ “explain”: true ”来让给出相关得分计算的过程解释。

举个例子:首先在es中创建一个索引,并写入数据,用户输入“PPT小工具”并开启相关得分解释设置

POST nlu-pro-44-94/_search
{
  "explain": true,
  "_source":["similary_query"],
  "query": {
    "match": {
      "similary_query": "PPT小工具"
    }
  }
}

es返回的结果是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mjhNgMq-1642578889249)(%E5%85%B3%E4%BA%8Ees%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E7%9B%B8%E4%BC%BC%E5%BA%A6%E5%BE%97%E5%88%86%E7%9A%84%2046434b09ef1f4271987d374017945cba/Untitled.png)]

由于7.x 版本的es默认相关得分计算公式是BM25, score ⁡ ( D , Q ) = ∑ i = 1 n IDF ⁡ ( q i ) ⋅ f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ avgdl ⁡ ) \operatorname{score}(D, Q)=\sum_{i=1}^{n} \operatorname{IDF}\left(q_{i}\right) \cdot \frac{f\left(q_{i}, D\right) \cdot\left(k_{1}+1\right)}{f\left(q_{i}, D\right)+k_{1} \cdot\left(1-b+b \cdot \frac{|D|}{\operatorname{avgdl}}\right)} score(D,Q)=i=1nIDF(qi)f(qi,D)+k1(1b+bavgdlD)f(qi,D)(k1+1)

下面具体来看一下"_explanation"部分的内容。

"_explanation"部分也是基于上述公式进行计算的,首先找到用户输入与文档的所有匹配token,然后计算每一个匹配token的得分,然后再求和。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcejmmyQ-1642578889250)(%E5%85%B3%E4%BA%8Ees%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E7%9B%B8%E4%BC%BC%E5%BA%A6%E5%BE%97%E5%88%86%E7%9A%84%2046434b09ef1f4271987d374017945cba/Untitled%201.png)]

从上述图中可以看出,关键词有三个“ppt”,“小”,“助手”,将该三个关键词的得分求和就可以得到最终得分。

下面看一下某一个关键词的得分是如何计算的,以关键词“助手“为例。首先先点开其下面的字段”details“

在这里插入图片描述

从上述的过程中可以看出,es相关性得分计算是按照BM25公式计算来的。


参考资料:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你知道es是如何计算相似度得分的吗? 的相关文章

随机推荐

  • okhttp异常: java.io.IOException: closed okio.RealBufferedSource$1.read

    java io IOException closed at okio RealBufferedSource 1 read RealBufferedSource java 405 at sun nio cs StreamDecoder rea
  • Redis——redis配置与优化

    文章目录 一 关系数据库与非关系型数据库 1 关系型数据库 2 非关系型数据库 二 Redis 简介 1 Redis的应用场景 2 Redis的优点 三 Redis 安装部署 1 安装Redis 2 配置参数 四 Redis
  • 任务管理器详解

    进程 看是否有除系统外多余进程 可能是病毒或没有完全关闭的进程 影响机器性能 进程下显示了所有当前正在运行的进程 包括应用程序 后台服务等 性能下可以看到CPU和内存 页面文件的使用情况 卡机 死机 中毒时 CPU使用率会达到100 CPU
  • mysql 用sqlyog连接1045错误解决办法(数据库在linux)

    1045 多半就是要么你端口号3306没开 要么就是你密码错误 安装网路分析 yum install net tools 防火墙开放3306端口 root localhost firewall cmd zone public add por
  • 学生信息管理系统(登录功能)

    工具eclipse 主要操作登陆 增删查改 编写实体类 public class Student private int id private String sId 学号 private String name private String
  • CTF BugKu平台———(Web篇②)

    源代码 unescape编码 https tool chinaz com Tools Escape aspx PS p1 35 34 61 61 32 p2 然后提交即可 67d709b2b54aa2aa648cf6e87a7114f1 文
  • 操作系统 线程同步实验

    操作系统 线程同步实验 一 实验目标 顺序表循环队列实现的实验目标 掌握使用顺序表和循环队列实现队列的基本操作 如队列的插入 删除 遍历等 同时了解循环队列的内部实现原理和利用循环队列解决实际问题的方法 Linux生产者 消费者问题的多线程
  • MFC自定义消息

    一 背景 消息机制是windows程序的典型运行机制 在MFC中有很多已经封装好了的消息 但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能 这时候MFC的向导不能帮助我们做到这一点 对此 我们可以通过添加相应的代码去完成
  • C++ 深浅拷贝、写时拷贝

    前言 本章以string类为例介绍浅拷贝与深拷贝 引用计数写时拷贝作为了解内容 string类的模拟实现参考C string类的模拟实现 文章目录 1 浅拷贝 2 深拷贝 3 引用计数 写时拷贝 1 浅拷贝 浅拷贝 对于有申请空间的对象的类
  • Java集合类的总结与比较

    Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection接口 Collection是最基本的集合接口
  • react自定义useState hook获取更新后值

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 在业务中有比较多的场景需要在setState中获取更新后的值从而进行下一步的业务操作 在Class组件中可以通过 this setState name 123
  • 全网最详细中英文ChatGPT-GPT-4示例文档-官网推荐的48种最佳应用场景——从0到1快速入门自然语言指令创建支付API代码(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node js接口请求示例 curl命令示例 json格式示例
  • 分布式系统领域经典论文翻译集

    分布式领域论文译序 sql nosql年代记 SMAQ 海量数据的存储计算和查询 一 google论文系列 1 google系列论文译序 2 The anatomy of a large scale hypertextual Web sea
  • Azure云服务基础其五

    文章目录 Azure云服务基础其五 什么是Azure Kubernetes 服务 创建 Kubernetes集群 部署应用程序 测试应用程序 Azure云服务基础其五 什么是Azure Kubernetes 服务 官网的解释是Azure K
  • docker搭建mysql高可用集群

    docker中搭建mysql高可用集群 percona xtradb cluster percona xtradb cluster是一款很棒的mysql高可用集群解决方案 特点是每个节点都能进行读写且都保存全量的数据 也就是说在任何一个节点
  • 大数据 第一节课 linux基础 基本的操作

    Linux的基础 一 Linux的实验环境 二 安装配置Linux和Linux的目录结构 1 安装Linux的过程中 注意的问题 虚拟机类型 Redhat linux 7 64位 重要的 网卡的类型 仅主机模式 host only IP地址
  • 性能测试(并发负载测试)测试分析

    声明 此文章是从网络上转载下来的 至于真实出处无法找到 在对系统进行测试的时候 通常有一个难点那就是使用LR JMeter等进行了性能测试 但是很难进行测试后的分析 以下很大一部分是从网上转载下的一位前辈对性能测试后的分析的见解 分析原则
  • 一些诗集-自创+整理

    常学问 传统文化常学问 研究中易琢磨神 时时出来抬头看 兼容并包实践真
  • win10和linux双系统免u盘,WIN10下免U盘安装Ubuntu双系统

    目录 一 工具下载 二 安装前的准备工作 三 安装Ubuntu系统 四 注意 最后 附下本文参考的博客 一 工具下载 1 下载Ubuntu操作系统 Ubuntu操作协同最好是去Ubuntu官方网站下载 https ubuntu com do
  • 你知道es是如何计算相似度得分的吗?

    1 es中相似度计算公式 BM25 6 x版本和7 x 版本的es的默认得分计算方式都是BM25 假如用户给定一个输入 Q Q Q 其包含了关键字 q 1