最近需要帮别人写一个BM25的文档,写完顺便上传了
BM25是一个计算文本相似度的算法
1. BM25公式:
BM25是通过q和s中的公共词汇进行相似度计算的算法,其中
q: 待测试文档
s:需要进行相似度比较的文档
2. IDF的计算公式如下:
N是训练集的总文档数,即需要比较的文档(s)的总数量
Nt是含有单词t的文档(s)的总数量
3. tf(t,s):公共单词t在文档s中出现的次数
4. tq(t,q): 公共单词t在文档q中出现的次数
5. k1,k3,b 都是需要调节的参数,大小在(0,1)
实现方法:
训练集:s的集合(假设组成为:ID + 文本内容)
测试集:q的集合(假设组成为:ID + 文本内容)
预处理:
1. 定义全局变量map<string1,set<string2> > ,其中string1是指训练集S中的单词所有单词,set<string>是指单词string1,出现在了哪几个训练集中,记录的是ID号
2. 创建一个文本类,记录文档的组成,组成部分如下
a. ID号
b. 文本内容(分词后,将文本以单词为单位存储在set中,注:set已经去除了重复单词)
c. hashMap(记录文档Si中,每个单词Ti出现的次数)
过程:
假设训练集有2个文档,分别为
001 : aa bb cc aa
002 : cc dd dd
1. 读取文档001的所有词汇aa bb cc aa
读取的过程中,将aa bb cc分别保存在全局变量map<string1,set<string2> >中,以此类推
2. 计算相似度
假设q为003 aa ee bb
计算q与001的相似度,使用BM25的公式
Q与001的公共词汇为aa,bb
第一步,计算单词aa的值
IDF中,N为文档总数量,即为2,Nt是指出现aa这个单词的总数,由于002中没有出现,Nt为1,所以IDF即为 log()
Tf(t,s)即,aa在001中出现的次数,为2
Tf(t,q)即,aa在q中出现的次数,为1
第二步,计算单词bb的值,步骤同上
第三步,把aa,bb计算的值加起来,即为q与001的BM25相似度