BM25算法,通常用于计算两个文本,或者文本与文档之间的相关性.所以可以用于文本相似度计算和文本检索等应用场景.它的主要思想是:对于文本query中的每个词qi,计算qi与候选文本(文档)的相关度,然后对所有词qi得到的相关度进行加权求和,从而得到query与文档document的相关性得分.
BM25算法的公式:
其中Q为查询文本query,qi是query中的词i,d为候选文档中的一个.W是词i的权重,通常是用IDF(逆文档频率)来计算.R(qi,d)是计算词i和文档d的相关程度.对query中的每个词求其对文档d的相关性R,然后乘上词对应的权重Wi,然后将所有词加和,就是要求的query和候选文档d的相关度得分.
首先来看一下这个IDF:IDF全称逆文档频率,什么是文档频率呢?就是对于某个词,文本语料中,含有该词的文档数,除以文档总数,就是该词的文档频率,而逆文档频率就是求文档频率的倒数.
其中以防分母为0所以在分母处+1.同时为了计算方便,是数值处在一个合理区间,并且函数性质好,所以对其取log.图2就是IDF的公式.通常,为了得到某个词的权重,会用该词的词频TF计算,但是为了防止像'的','是的','好的',这种无意义但是高频词的出现,就会使用到IDF.它的作用就是抑制了高频无意义词.
再来看看词qi和文档d的相关性计算R(qi,d):在BM25中,相关性计算公式如下:
其中k1,k2和b都是调节因子,根据经验设置,一般k1=2,b=0.75.dl是文档d的长度,avgdl是所有语料文档的平均长度.fi表示词qi在文档d中的频率,qfi表示词qi在query中出现的频率,由于绝大部分情况下,qi在Query中只会出现一次,因此公式可以简化为:
相似度计算公式R很好理解:相对来说,对于两个文档(长短不一样),如果某词在两个文档中的出现的次数一样,那么肯定文档长度短的文档与该词的相关度高一些.所以在K中,使用文档长度除以平均文档长度,用来表示该文档的相对长度,这样K在R中作为分母,当文档长度一样时,fi越大,相关度越高,fi一定时,K相对长度越大,相关度越低.
综上,BM25算法的相关性得分公式可总结为:
代码实现:
1.计算每个词的IDF,将结果保存为字典形式
2.计算query与预料中某个文档d(index)的相关性评分