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=1∑nIDF(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-n\left(q_{i}\right)+0.5}{n\left(q_{i}\right)+0.5}+1\right)
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.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⋅(1−b+b⋅avgdl∣D∣)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)值的变化:
从上图可以看出 ,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返回的结果是:
由于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⋅(1−b+b⋅avgdl∣D∣)f(qi,D)⋅(k1+1)
下面具体来看一下"_explanation"部分的内容。
"_explanation"部分也是基于上述公式进行计算的,首先找到用户输入与文档的所有匹配token,然后计算每一个匹配token的得分,然后再求和。
从上述图中可以看出,关键词有三个“ppt”,“小”,“助手”,将该三个关键词的得分求和就可以得到最终得分。
下面看一下某一个关键词的得分是如何计算的,以关键词“助手“为例。首先先点开其下面的字段”details“
从上述的过程中可以看出,es相关性得分计算是按照BM25公式计算来的。
参考资料: