计算用户输入query和语料库中每条语句之间的相似度分数。
我参考了gensim中的源码,实现的挺简单的,还是包括tf和idf两部分,
tf:单词在文档中出现的频率
idf:,其中D是整个语料库中包含多少篇文档,df是语料库中有多少个文档包含了某个单词,0.5是用来做平滑的。现在忽略0.5,分子分母约分,就变成了。如果语料库中一半的文档都包括某个词,那这个词的idf=0,如果语料库中超过一半的文档都包括某个词,那么这个词的idf<0,这时候就用eps代替,eps是一个比较小的值,是平均每个词的idf×EPSILON,gensim里面EPSILON是0.25.
最后:sum {(idf*tf*常数)/(tf+常数*(1-常数+常数*(这篇文档的长度/语料库中文档的平均长度)))}
BM25会遍历query中的每个词,计算每个词和语料库中句子的相似程度,计算方式就是上面那个。