BM25算法详解

概括:
BM25算法通过加入文档权值和查询权值,拓展了二元独立模型的得分函数。这种拓展是基于概率论和实验验证的,并不是一个正式的模型。BM25模型在二元独立模型的基础上,考虑了单词在查询中的权值以及单词在文档中的权值,拟合综合上述考虑的公式,并通过实验引入经验参数。
BM25的原始公式为:
(公式1)
log后有三部分组成,其中,第一部分是二元独立模型的计算得分

二元独立模型介绍:
有两个假设:
假设一:二元假设
类似于布尔模型的方法,一篇文章由特征表示时,以特征“出现”和“不出现”两种情况表示,亦可以理解成特征“相关”和“不相关”。
假设二:词汇独立性假设
所谓独立性假设,是指文档里出现的单词之间没有任何关联,任一个单词在文章中的分布率不依赖于另一个单词是否出现,这个假设明显与事实不符,但是为了简化计算,很多地方需要做出独立性假设,这种假设是普遍的。

在以上两个假设的前提下,二元独立模型即可以对两个因子P(D|R)和P(D|NR)进行估算(条件概率),举个简单的例子,文档D中五个单词的出现情况如下:{1,0,1,0,1} 0表示不出现,1表示出现。用Pi表示第i个单词在相关文档中出现的概率,在已知相关文档集合的情况下,观察到文档D的概率为:
这里写图片描述(公式2)

对于因子P(D|NR),用Si表示第i个单词在不相关文档中出现的概率,在以知不相关文档的情况下,观察到文档D的概率为:
这里写图片描述(公式3)

观察得:
这里写图片描述(公式4,其中C为常数)

并且带入Pi,Si可得:
这里写图片描述(公式5,其中C为常数,di=1表示i为单词出现在相关文档和不相关文档的情况)

为了方便计算,对上述公式两边取log,得到:
这里写图片描述

那么如何估算概率Si和Pi呢,如果给定用户查询,我们能确定哪些文档集合构成了相关文档集合,哪些文档构成了不相关文档集合,那么就可以用如下的数据对概率进行估算:
这里写图片描述

根据上表可以计算出Pi和Si的概率估值,为了避免log(0),对估值公式进行平滑操作,分子+0.5,分母+1.0
这里写图片描述

在我们不知道哪些文档相关,哪些文档不相关的情况下,将相关文档数R及包含查询词相关文档数r设为0,那么第一部分退化成:
这里写图片描述

代入公式1变为:
这里写图片描述(公式6)

三个自由调节参数
在公式:这里写图片描述
第二个组成部分是查询词在文档 D 中的权值,其中 fi代表了单词在文档 D 中的词频,k1和 K 是经验参数。第三个组成部分是查询词自身的权值,其中 qfi代表查询词在用户查询中的词频,如果查询较短小的话,这个值往往是 1,k2是经验参数在第二个计算因子中,K 因子代表了对文档长度的考虑,它用来利用文档长度归一化 tf 因子。 公式(7)所示 K 的计算公式中 ,dl 代 表 文 档 D 的 长 度 , 而 avdl 则 代 表 文 档 集 合 中所有文档的平均长度,k1和 b 是经验参数。 其中参数 b 是调节因子,极端情况下,将 b 设定为 0,则文档长度因素将不起作用,经验表明一般将 b 设定为 0.75 会获得较好的搜索效果。
这里写图片描述(公式7)

BM25 公式中包含 3 个自由调节参数 ,除了调节因子 b 外 ,还有针对词频的调节因子 k1和 k2。 k1的作用是对查询词在文档中的词频进行调节,如果将 k1设定为 0,则第二部分计算因子成了整数 1,即不考虑词频的因素,退化成了二元独立模型。 如果将 k1设定为较大值, 则第二部分计算因子基本和词频 fi保持线性增长,即放大了词频的权值,根据经验,一般将 k1设定为 1.2。调节因子 k2和 k1的作用类似,不同点在于其是针对查询词中的词频进行调节,一般将这个值设定在 0 到 1000 较大的范围内。之所以如此,是因为查询往往很短,所以不同查询词的词频都很小,词频之间差异不大,较大的调节参数数值设定范围允许对这种差异进行放大。

参考:搜索之BM25和BM25F模型
基于 Lucene 的 BM25 模型的评分机制的研究(范晨熙 黄理灿 李雪利)

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BM25算法是一种用于文本检索和文档排序的算法。在Python中,可以使用gensim库中的bm25模块来实现BM25算法。下面是一个示例代码,用于展示如何使用BM25算法进行文本分类: ```python from gensim.summarization import bm25 import jieba def gensim_bm25_word_classification(test_word): corpus = [ ['高', '血', '压', '高血', '血压'], ['糖', '尿', '病'], ['精', '神', '病'] ] corpus_dic = { '高血压': ['高', '血', '压', '高血', '血压'], '糖尿病': ['糖', '尿', '病'], '精神病': ['精', '神', '病'] } bm25Model = bm25.BM25(corpus) # 构建BM25模型 test_word = list(test_word) # 将测试文本转为列表 scores = bm25Model.get_scores(test_word) # 计算相关性分数 print('测试短文本:', test_word) for i, j in zip(scores, corpus): for m in corpus_dic.keys(): if j == corpus_dic[m]: word_name = m print('分值:{},原词:{}'.format(i, word_name)) test_word = '高血压的症状是什么' # 设置测试文本 gensim_bm25_word_classification(test_word) ``` 以上代码演示了如何使用BM25算法对文本进行分类,根据测试文本的相关性分数来判断其属于哪个类别。在这个例子中,我们使用了一个简单的文本分类任务,将测试文本与预定义的文本集进行匹配,得到相关性分数并输出对应的类别名称。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python bm25短文本分类,相似度识别,BM25算法相似度匹配,疾病相似度匹配gensim实现,bm25算法原理和实现...](https://blog.csdn.net/L_goodboy/article/details/124415418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值