BM25算法是在20世纪70年代到80年代由英国的一批信息检索领域的计算机科学家发明, 用来衡量搜索词query和文档document相似度得分的经典算法,这个相关性打分是一个类似TF-IDF的基于统计计数的无监督学习过程.
是一种基于词袋方法的词频计数, 它不考虑多个搜索词在文档中的关联性, 只考虑它们各自的出现次数
BM25算法的核心思想可以简介如下: 对query进行特征提取分解, 生成若干特征词 q i q_i qi, 然后对于每个搜索结果D, 计算每个特征 q i q_i qi与D的相关性得分, 最后, 将 q i q_i qi相对于D的相关性得分进行加权求和, 从而得到query与D的相关性得分.
BM25的公式主要由三个部分组成
query中每个单词 q i q_i qi与文档d之间的相关性
单词 q i q_i qi与query之间的相似性
每个单词 q i q_i qi的权重(IDF)
S c o r e ( Q , d ) = ∑ i n W i R ( q i , d ) Score(Q, d)= \sum_{i}^n{W_iR(q_i, d)} Score(Q,d)=i∑nWiR(qi,d)
其中Q表示query, q i q_i qi表示query中的单词. d表示一个搜索文档,
BM25选择是Robertson-Sparck Jones IDF
W i = I D F ( q i ) = l o g ( N − d f i + 0.5 d f i + 0.5 ) W_i=IDF(q_i)=log(\frac {N-df_i+0.5}{df_i+0.5}) Wi=IDF(qi)=log(dfi+0.5N−dfi+0.5)
其中N表示索引中全部文档数, d f i df_i dfi为包含 q i q_i qi的文档的个数. 依据IDF的作用, 对于某个 q i q_i qi, 包含 q i q_i qi的文档数越多, 说明 q i q_i qi重要性越小, 或者区分度很低, IDF越小, 因此IDF可以用来刻画 q i q_i qi与文档的相关性.
这里有个问题, 如果一个词在超过半数的文档里出现, 则IDF为负值, 于是这个词对BM25分数的贡献就是负的. 一般不希望这样的特性, 所以当IDF为负数时, 可将其置为0, 或者一个比较小的正数, 或者改用一个平滑过渡到0的函数形式.
比较朴素的考虑可以用特征词的文档词频来简单表示 R ( q i , d ) R(q_i, d) R(qi,d), 但这种直观的想法会导致长文本中, 词的频度普遍较高, 最终相关性得分会过度倾向于长文本。另一方面, 不难想到, 某个词对文档的贡献不应该无限度地随词频增加而线性增加, 当该次的词频高于某个词就应该趋于饱和, 而不应该让其得分贡献度无限度增大, 从而在整个得分求和式子中占支配地位.
BM25的设计依据一个重要的发现: 词频和相关性之间的关系是非线性的, 也就是说, 每个词对于文档的相关性分数不会超过一个特定的阈值, 但词的次数达到一个阈值后, 其影响就不在线性增加了, 而这个阈值和文档本身有关. 因此, 在刻画单词和文件相似性时, BM25是这样设计的.
R ( q i , d ) = ( k 1 + 1 ) t f t d K + t f t d R(q_i, d)=\frac{(k_1+1)tf_{td}}{K+tf_{td}} R(qi,d)=K+tftd(k1+1)tftd
K = k 1 ( 1 − b + b ∗ L d L a v e ) K=k_1(1-b+b*\frac{L_d}{L_{ave}}) K=k1(1−b+b∗LaveLd)
其中, t f t d tf_{td} tftd是单词t在文档d中的词频, L d L_d Ld是文档d的长度, L a v e L_{ave} Lave是所有文档的平均长度,
超参数 k 1 k_1 k1起到调节特征词文本频率尺度的作用, k 1 = 0 k_1=0 k1=0时算法退化为二元模型(Binary model)(没有词频), 取更大的值使用更原始的词频信息.
b一般被称作文本长度的规范化, 是另一个可调参数( 0 < b < 1 0\lt b \lt 1 0<b<1), 是用决定文档长度对相关性影响的大小: 当b为1, 是完全使用文档长度来衡量相关性, 当b=0, 表示不使用文档长度. 可以看出b越大,文档长度对相关性得分的影响越大,反之越小。而文档d的相对长度越长,K越大,也就是R的分母越大,R相关性得分也就越小。这里可以理解成,当文档较长时,包含的词语也就越多,那么相应地包含有 q i q_i qi这个词的可能性也就越大,但是虽然可能性要大一点,当 q i q_i qi的频率同等的情况下,长文档与qi的相关性就应该比短文档与qi的相关性弱。
当query很长时, 我们还需要刻画单词和query之间的权重. 对于短的query, 这一项不是必须的
R ( q i , Q ) = ( k 2 + 1 ) t f t q k 2 + t f t q R(q_i, Q)=\frac{(k_2+1)tf_{tq}}{k_2+tf_{tq}} R(qi,Q)=k2+tftq(k2+1)tftq
这里 t f t d tf_{td} tftd表示单词t在query中的词频, k 2 k_2 k2是一个可调正参数, 来矫正query中的词频范围.
s c o r e ( q , d ) = ∑ t ∈ q [ l o g ( N − d f i + 0.5 d f i + 0.5 ) ] ⋅ ( k 1 + 1 ) t f t d k 1 ( ( 1 − b ) + b ( L d / L a v e ) ) + t f t d ⋅ ( k 2 + 1 ) t f t q k 2 + t f t q score(q, d)=\sum_{t \in q}[log(\frac {N-df_i+0.5}{df_i+0.5})] \cdot \frac{(k_1+1)tf_{td}}{k_1((1-b)+b(L_d/L_{ave}))+tf_{td}} \cdot \frac {(k_2+1)tf_{tq}}{k_2+tf_{tq}} score(q,d)=t∈q∑[log(dfi+0.5N−dfi+0.5)]⋅k1((1−b)+b(Ld/Lave))+tftd(k1+1)tftd⋅k2+tftq(k2+1)tftq
经过试验, 上面三个可调参数, k 1 k_1 k1和 k 2 k_2 k2可取1.2~2, b取0.75
从以上对 BM25 的完整讨论,我们知道了 BM25 其实是一个(准确说,是一系列)经验公式,这里面的每一个环节都是经过很多研究者的迭代而逐步发现的。很多研究在理论上对 BM25 进行了建模,从“概率相关模型”(Probabilistic Relevance Model)入手,推导出 BM25 其实是对某一类概率相关模型的逼近,对此我还没有详尽研究,就无法进一步展开论述了。从结果上看,我们应该明了 BM25 权重计算公式,已经在众多的数据集和搜索任务上,被极其高频广泛和成功地使用.
相对完整的介绍了在IR领域重要的相关性打分算法BM25.后续如果有更深的体会也会进行更新.
BM25算法公式由三个主要的模块构成–词在文档中的相关度, 词在查询关键字中的相关度以及词的权重(IDF).
BM25算法是一个长期积累的经验公式, 是一个简单高效基础基于词袋的无监督的learning-to-rank的算法, 但是并没有考虑词之间的相关性, 是在词的基础上进行统计计算, 没有深入到语义层面.
Okapi BM25算法 - geeks_reign - 博客园
BM25算法, Best Matching - 知乎
史上最小白之BM25详解与实现_Tink1995的博客-CSDN博客_bm25