BM25算法的实现过程

来源:互联网 发布:玉兔miki淘宝照片 编辑:程序博客网 时间:2024/04/30 12:58

最近需要帮别人写一个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相似度

 

0 0
原创粉丝点击