BM25属于bag-of-word(词袋)模型, 是用来计算某一个目标文档(Document)相对于一个查询关键字(Query)的“相关性”(Relevance)的流程。BM25认为:词频和相关性之间的关系是非线性的,具体来说,每一个词对于文档相关性的分数不会超过一个特定的阈值,当词出现的次数达到一个阈值后,其影响不再线性增长,而这个阈值会跟文档本身有关。达到的效果是,某一个单词对最后分数的贡献不会随着词频的增加而无限增加。
算法按照以下3部分来构建
- 单词 q i q_i qi与文档 D D D之间的相关性
- 单词 q i q_i qi与query之间的相关性
- 每个单词 q i q_i qi的权重
单词和目标文档的相关性
tf-idf中,单词和文档的相关性用“词频”表示(关于
t
f
tf
tf和
i
d
f
idf
idf的计算可以参考文章文本特征提取之TF-IDF),BM25对词频进行了标准化处理,公式如下:
s
c
o
r
e
(
t
f
q
i
,
D
)
=
t
f
t
d
∗
(
k
1
+
1
)
t
f
t
d
+
k
1
∗
(
1
−
b
+
b
∗
∣
D
∣
a
v
g
d
l
)
score(tf_{q_i, D})=\frac{tf_{td}*(k_1+1)}{tf_{td}+k_1*(1-b+b*\frac{|D|}{avgdl})}
score(tfqi,D)=tftd+k1∗(1−b+b∗avgdl∣D∣)tftd∗(k1+1)
其中,
q
i
q_i
qi为query中的第
i
i
i个词,
t
f
(
q
i
,
D
)
tf(q_i, D)
tf(qi,D)为目标文档中
q
i
q_i
qi的词频,
∣
D
∣
|D|
∣D∣是文档D的长度,
a
v
g
d
l
avgdl
avgdl是语料库全部文档的平均长度,
k
1
k_1
k1和
b
b
b是参数。
单词和query的相关性
s
c
o
r
e
(
t
f
q
i
,
Q
)
=
(
k
2
+
1
)
∗
t
f
t
q
k
2
+
t
f
t
q
score(tf_{q_i, Q}) = \frac{(k_2+1)*tf_{tq}}{k_2+tf_{tq}}
score(tfqi,Q)=k2+tftq(k2+1)∗tftq
其中,
t
f
t
q
tf_{tq}
tftq是词项t在查询q中的权重,从上面的公式中可以看到,当词频无限增大时,
s
c
o
r
e
(
t
f
q
i
,
D
)
=
k
2
+
1
score(tf_{q_i, D})=k_2+1
score(tfqi,D)=k2+1
单词权重
单词的权重最简单的就是用idf值或是其变种,我们用
i
d
f
(
q
i
)
idf(q_i)
idf(qi)表示单词
q
i
q_i
qi的权重。
合起来公式就是
s c o r e ( D , Q ) = ∑ i = 1 n i d f ( q i ) ∗ t f t d ∗ ( k 1 + 1 ) t f t d + k 1 ∗ ( 1 − b + b ∗ ∣ D ∣ a v g d l ) ∗ ( k 2 + 1 ) ∗ t f t q k 2 + t f t q score(D,Q)=\sum_{i=1}^nidf(q_i)*\frac{tf_{td}*(k_1+1)}{tf_{td}+k_1*(1-b+b*\frac{|D|}{avgdl})} * \frac{(k_2+1)*tf_{tq}}{k_2+tf_{tq}} score(D,Q)=i=1∑nidf(qi)∗tftd+k1∗(1−b+b∗avgdl∣D∣)tftd∗(k1+1)∗k2+tftq(k2+1)∗tftq
BM25 在 TF-IDF 的基础上增加了两个可调参数: k 1 k_1 k1 和 b b b,分别代表 “词语频率饱和度(term frequency saturation)” 和 “字段长度规约(Field-length normalization)”
- 词语频率饱和度(term frequency saturation): k 1 k_1 k1参数的值一般介于 1.2 到 2.0 之间。数值越低则饱和的过程越快速。如果 k 1 k_1 k1 取 0,则对应 BIM 模型,document term frequency完全没有影响,如果 k 1 k_1 k1 取较大值,对应使用原始的 term frequency
- 字段长度归约(Field-length normalization): 将文档的长度归约化到全部文档的平均长度上。b=1 表示基于文档长度对 term frequency 进行完全的缩放,b=0 表示归一化时不考虑文档长度因素,长文档更有可能排在前面如果查询很长,
- 对于 query term 也可以采用类似的权重计算方法。对查询长度没有进行归一化(相当于b=0)。 k 2 = 0 k_2=0 k2=0 表示 term frequency in query 并没有影响,(apple apple pie) 和 (apple pie) 完全一样。
参考文档