BM25算法, Best Matching

2,818 阅读2分钟

BM25是信息索引领域用来计算query与文档相似度得分的经典算法。 不同于TF-IDF,BM25的公式主要由三个部分组成:

  • query中每个单词t与文档d之间的相关性
  • 单词t与query之间的相似性
  • 每个单词的权重

BM25的一般公式: Score(Q,d)=inWiR(qi,d)Score(Q,d) = \sum_i^n{W_i R(q_i, d)} 其中QQ表示一条query,qiq_i表示query中的单词。d表示某个搜索文档。

WiW_i表示单词权重

这里其实就是IDF: IDF(qi)=logNdfi+0.5dfi+0.5IDF(q_i) = \log{\frac{N-df_i+0.5}{df_i+0.5}} 其中N表示索引中全部文档数,dfidf_i为包含了qiq_i的文档的个数。依据IDF的作用,对于某个qiq_i,包含qiq_i的文档数越多,说明qiq_i重要性越小,或者区分度越低,IDF越小,因此IDF可以用来刻画qiq_i与文档的相似性。

单词与文档的相关性

BM25的设计依据一个重要的发现:词频和相关性之间的关系是非线性的,也就是说,每个词对于文档的相关性分数不会超过一个特定的阈值,当词出现的次数达到一个阈值后,其影响就不在线性增加了,而这个阈值会跟文档本身有关。因此,在刻画单词与文档相似性时,BM25是这样设计的: S(qi,d)=(k1+1)tftdK+tftdS(q_i, d) = \frac{(k_1+1)tf_{td}}{K+tf_{td}} K=k1(1b+bLdLave)K = k_1(1-b+b*\frac{L_d}{L_{ave}})

其中,tftdtf_{td}是单词t在文档d中的词频,LdL_d是文档d的长度,LaveL_{ave}是所有文档的平均长度,变量k1k_1是一个正的参数,用来标准化文章词频的范围,当k1=0k_1=0,就是一个二元模型(binary model)(没有词频),一个更大的值对应使用更原始的词频信息。b是另一个可调参数(0<b<10<b<1),他是用决定使用文档长度来表示信息量的范围:当b为1,是完全使用文档长度来权衡词的权重,当b为0表示不使用文档长度。

单词与query的相关性

当query很长时,我们还需要刻画单词与query的之间的权重。对于短的query,这一项不是必须的。 S(qi,Q)=(k3+1)tftqk3+tftqS(q_i, Q)=\frac{(k_3+1)tf_{tq}}{k_3+tf_{tq}} 这里tftqtf_{tq}表示单词t在query中的词频,k3k_3是一个可调正参数,来矫正query中的词频范围。

因此,BM25最终的公式为: TIM截图20180828203827.png-4.8kB

经过试验,上面三个可调参数,k1k_1k3k_3可取1.2~2,b取0.75

这里有一篇关于BM25和IF/IDF词频饱和度的比较,字段长度归一化,BM25调优的文章供参考--链接--。 关于BM25调参--链接--