找回密码
 立即注册
查看: 473|回复: 0

[其它] BM25(Best Matching 25)算法基本思想

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-7-9 13:49:53 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-7-9 14:13 编辑

1. 引言

BM25(Best Matching 25)是一种广泛应用于信息检索和搜索引擎中的排名函数。它基于概率检索模型,通过对文档和查询词项的相关性评分,实现对文档的排序。BM25在TF-IDF(词频-逆文档频率)的基础上进行了改进,更好地处理了文档长度和词频的影响。

1.1 BM25的基本概念

BM25的基本思想是根据文档中词项出现的频率和文档的长度来计算文档和查询之间的相关性。其核心公式如下:

  1. Score(D, Q) = ∑ ( IDF(qi) * ( ( k1 + 1) * f(qi, D) ) / ( k1 * (1 - b + b * |D| / avgD) + f(qi, D) ) )
复制代码


其中:
(1) D 表示文档,Q 表示查询。
(2) qi 表示查询中的第i个词项。
(3) f(qi, D) 表示词项qi在文档D中出现的频率。
(4) |D| 表示文档D的长度。
(5) avgD 表示语料库中文档的平均长度。
(6) k1 和 b 是调节参数,通常取值分别在1.2和0.75左右。

1.1.1 IDF(逆文档频率)

IDF的作用是降低高频词项的权重,增加低频词项的权重。IDF的计算公式如下:

  1. IDF(qi) = log ( ( N - df(qi) + 0.5 ) / ( df(qi) + 0.5 ) + 1 )
复制代码


其中:
(1) N 表示语料库中的文档总数。
(2) df(qi) 表示包含词项qi的文档数。

1.2 BM25的实现

java中,我们可以通过以下代码实现BM25算法:

  1. class BM25 {

  2.     private double k1;
  3.     private double b;
  4.     private Map<String, Integer> docFrequencies;
  5.     private int totalDocs;
  6.     private double avgDocLength;

  7.     public BM25(double k1, double b, int totalDocs, double avgDocLength, Map<String, Integer> docFrequencies) {
  8.         this.k1 = k1;
  9.         this.b = b;
  10.         this.totalDocs = totalDocs;
  11.         this.avgDocLength = avgDocLength;
  12.         this.docFrequencies = docFrequencies;
  13.     }

  14.     public double score(String doc, String[] query, Map<String, Integer> termFreqs, int docLength) {
  15.         double score = 0.0;
  16.         for (String term : query) {
  17.             if (!docFrequencies.containsKey(term)) {
  18.                 continue;
  19.             }
  20.             int df = docFrequencies.get(term);
  21.             double idf = Math.log((totalDocs - df + 0.5) / (df + 0.5) + 1);
  22.             int tf = termFreqs.getOrDefault(term, 0);
  23.             score += idf * (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * docLength / avgDocLength));
  24.         }
  25.         return score;
  26.     }
  27. }
复制代码


1.3 参数调节

BM25算法的两个核心参数 k1 和 b 对算法的性能有重要影响:

(1) k1 是调节词项频率(term frequency)对评分影响的参数。较高的 k1 值会增加词项频率的重要性,较低的 k1 值则会减弱其影响。

(2) b 是调节文档长度对评分影响的参数。b 值为1时,表示完全考虑文档长度的影响;b 值为0时,表示完全忽略文档长度的影响。通常,b 取值在0.75左右效果较好。

1.4 应用场景

BM25算法在以下几个场景中有广泛应用:

(1) 搜索引擎:BM25常用于搜索引擎中的文档排序,帮助提高搜索结果的相关性。

(2) 问答系统:BM25可用于计算问句和答案的相关性,从而找到最匹配的答案。

(3) 信息检索:在信息检索系统中,BM25可用于评估文档和查询的匹配程度,帮助用户找到最相关的信息。

1.4.1 搜索引擎

在搜索引擎中,BM25通过对网页内容和用户查询进行相关性评分,实现对搜索结果的排序,从而提高用户体验。

1.4.2 问答系统

在问答系统中,BM25用于计算问句和候选答案的相关性,帮助系统找到最佳答案,提高回答的准确性。

1.4.3 信息检索

在信息检索系统中,BM25通过对文档和查询进行评分,帮助用户快速找到最相关的信息,提高检索效率。

2. 总结

BM25是一种高效的文档排序算法,通过对词频和文档长度的综合考虑,实现了对文档和查询相关性的准确评分。其核心思想是通过调节参数 k1 和 b,平衡词项频率和文档长度对评分的影响。在实际应用中,BM25在搜索引擎、问答系统和信息检索等领域都有广泛的应用。通过对BM25算法的理解和实现,能够有效提高信息检索系统的性能和用户体验。









/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz

荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:36 , Processed in 0.049686 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表