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

Posted 丘文波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你知道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 ⁡ ) \\operatornamescore(D, Q)=\\sum_i=1^n \\operatornameIDF\\left(q_i\\right) \\cdot \\fracf\\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|\\operatornameavgdl\\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 ) \\operatornameIDF\\left(q_i\\right)=\\ln \\left(\\fracN-n\\left(q_i\\right)+0.5n\\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 ⁡ ) \\fracf\\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|\\operatornameavgdl\\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 \\fracf\\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)值的变化:

从上图可以看出 ,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 \\fracf\\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返回的结果是:

由于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 ⁡ ) \\operatornamescore(D, Q)=\\sum_i=1^n \\operatornameIDF\\

以上是关于你知道es是如何计算相似度得分的吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

基于欧氏距离(或任何其他距离计算技术)提取的SIFT描述符估计两幅图像的相似度得分

Python:字符串的语义相似度得分

Python Gensim:如何使用 LDA 模型计算文档相似度?

在python中计算单词相似度得分

文本相似度-bm25算法原理及实现