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

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

你知道es是如何计算相似度得分的吗? 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{fleft(q_{i}, Dright) cdotleft(k_{1}+1right)}{fleft(q_{i}, Dright)+k_{1} cdotleft(1-b+b cdot frac{|D|}{operatorname{avgdl}}right)} score(D,Q)=i=1∑n​IDF(qi​)⋅f(qi​,D)+k1​⋅(1−b+b⋅avgdl∣D∣​)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-nleft(q_{i}right)+0.5}{nleft(q_{i}right)+0.5}+1right) IDF(qi​)=ln(n(qi​)+0.5N−n(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.2b:超参数,该值越大,包含相同多关键词 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{fleft(q_{i}, Dright) cdotleft(k_{1}+1right)}{fleft(q_{i}, Dright)+k_{1} cdotleft(1-b+b cdot frac{|D|}{operatorname{avgdl}}right)} f(qi​,D)+k1​⋅(1−b+b⋅avgdl∣D∣​)f(qi​,D)⋅(k1​+1)​值的变化

即 f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 frac{fleft(q_{i}, Dright) cdotleft(k_{1}+1right)}{fleft(q_{i}, Dright)+k_{1} } f(qi​,D)+k1​f(qi​,D)⋅(k1​+1)​值的变化:

从上图可以看出 ,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{fleft(q_{i}, Dright) cdotleft(k_{1}+1right)}{fleft(q_{i}, Dright)+k_{1} } f(qi​,D)+k1​f(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返回的结果是:

由于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{fleft(q_{i}, Dright) cdotleft(k_{1}+1right)}{fleft(q_{i}, Dright)+k_{1} cdotleft(1-b+b cdot frac{|D|}{operatorname{avgdl}}right)} score(D,Q)=∑i=1n​IDF(qi​)⋅f(qi​,D)+k1​⋅(1−b+b⋅avgdl∣D∣​)f(qi​,D)⋅(k1​+1)​

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

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

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

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

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


参考资料:

干货 | 一步步拆解 Elasticsearch BM25 模型评分细节 - 云+社区 - 腾讯云 (tencent.com)similarity | Elasticsearch Guide [6.8] | Elastic-es6.8 中有哪些内置的相似度计算的模块可插拔的相似度算法 | Elasticsearch: 权威指南 | Elastic --es2.x 中关于OKapi BM25使用到的公式说明Okapi BM25 - Wikipedia – 维基百科对于BM25公式的介绍

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5708784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存