BM25
BM25,全称是 Best Matching 25,是一种用于信息检索的排名函数。它用来计算一个查询(Query)与一组文档(Documents)的相关性得分,并按照得分从高到低对文档进行排序。
简单来说,它的核心任务是:给定一个用户搜索词(如“苹果手机”),从海量文档中找出最相关的文档,并排名返回。
BM25 并非一个突然出现的新算法,而是基于经典的 TF-IDF 框架,经过多年研究和改进(从BM1到BM15等)后,在20世纪80-90年代形成的更为精确和健壮的版本。因此,理解BM25最好从TF-IDF开始。
TF-IDF 由两个部分组成:
-
TF(词频):一个词在当前文档中出现的次数越多,说明该词对当前文档越重要。
-
TF(单词, 文档) = 单词在文档中出现的次数
-
-
IDF(逆文档频率):一个词在整个文档集合中出现的次数越少,说明这个词越有区分度,越重要。
-
IDF(单词) = log(文档总数 / (包含该词的文档数 + 1))
-
TF-IDF得分 = TF × IDF
这个公式的直觉是:一个词的重要性,与它在当前文档中出现的次数成正比,与它在所有文档中出现的次数成反比。
TF-IDF的缺陷:
-
文档长度不敏感:一篇1000字的文章出现5次“苹果”,和一篇50字的短文出现5次“苹果”,TF值相同。但显然,短文中的“苹果”密度更高,可能更相关。
-
TF线性增长问题:一个词出现100次,并不代表它比出现10次相关100倍。相关性不会随词频无限线性增长,应该有上限(饱和点)。
BM25 算法基本思想
-
TF-IDF 的改进: BM25 通过对文档中的每个词项引入饱和函数(saturation function)和文档长度因子,改进了 TF-IDF 的计算。让算法在衡量词与文档相关性时更加精准。
-
饱和函数: 在 BM25 中,对于词项的出现次数(TF),引入了一个饱和函数来调整其权重。这是为了防止某个词项在文档中出现次数过多导致权重过大。
在文档中,某些词可能出现次数过多,如果直接按照 TF-IDF 计算,这些词的权重会过大,可能会掩盖其他重要词的作用。BM25 算法引入饱和函数来调整词项出现次数(TF)的权重,有效避免了某个词项权重过高的问题,使得算法能更合理地评估每个词对文档相关性的贡献。
-
文档长度因子: BM25 考虑了文档的长度,引入了文档长度因子,使得文档长度对权重的影响不是线性的。这样可以更好地适应不同长度的文档。
不同文档长度差异很大,如果不考虑文档长度,短文档可能因为词频较低,在检索中处于劣势。BM25 引入的文档长度因子,使得文档长度对权重的影响不再是简单的线性关系。它会根据文档的平均长度,对不同长度文档中的词权重进行调整,让算法能更好地适应各种长度的文档,提高检索的公平性和准确性。
BM25 的优缺点
优点:
-
非监督学习:BM25是一个无监督算法,不需要人工标注的相关性数据即可直接使用,简单高效。
-
效果卓越:在传统关键字匹配的检索任务中,效果非常好,多年来是学术研究和工业界实践的黄金标准。
-
可解释性强:得分由明确的公式计算,可以分析每个词对最终得分的贡献,易于理解和调试。
-
计算高效:可以建立倒排索引进行加速,适合大规模文档集合的快速检索。
缺点:
-
语义鸿沟:和所有基于词袋模型的方法一样,BM25无法理解语义。
-
例如,查询“轿车”,无法匹配包含“汽车”但未出现“轿车”的文档。它无法理解同义词、上下位词等语义关系。
-
-
词汇不匹配:对拼写错误、缩写、词形变化等比较敏感。
-
缺乏深层语义理解:无法捕捉词语之间复杂的上下文关系。
现代搜索引擎的实践:
通常采用 “混合检索” 策略,结合两者的优点:
-
召回:先用BM25等传统方法从海量文档中快速召回一批候选文档。
-
精排:再用BGE-M3这类深度模型对召回的候选文档进行更精细的语义重排,选出最相关的结果。