BM25 算法原理详解:相关性打分与应用
BM25 是文本相关性排序的概率检索算法。它综合词频、逆文档频率和文档长度,并通过词频饱和机制改善 TF-IDF 得分,适合理解搜索排序和混合检索。

什么是 BM25?
BM25 是一种用于信息检索的概率性排序函数,也是一种文本相关性算法。它的核心任务是估算用户查询与候选文档之间的相关性分数,并按照分数对搜索结果进行排序。
在典型搜索场景中,用户输入关键词后,系统会先找到可能匹配的文档,再判断哪些文档更符合查询。BM25 常用于这个“相关性打分”的环节:它不是简单统计关键词有没有出现,而是综合多个统计因素判断文档与查询的匹配程度。
可以把 BM25 理解为搜索系统中的一个排序规则:同样包含查询词的两篇文档,哪一篇更可能回答用户问题,BM25 会尝试给出一个可排序的分数。
要点: BM25 关注的是查询词与文档之间的统计相关性,常用于关键词检索和搜索结果排序。
BM25 与 TF-IDF 有什么关系
BM25 通常被看作 TF-IDF 的改进版本或进化方案。两者都关注两个基本问题:查询词在文档中出现得多不多,以及这个词在整个文档集合中是否具有区分度。
传统 TF-IDF 容易受到词频持续增长的影响:同一个词在文档中重复出现越多,得分可能被不断拉高。BM25 的重要改进之一,是引入词频饱和机制,让高频词带来的增益逐渐变小,从而缓解得分失衡。
| 对比维度 | TF-IDF | BM25 |
|---|---|---|
| 共同基础 | 关注词频和逆文档频率 | 同样关注词频和逆文档频率 |
| 词频影响 | 词频增长可能持续推高得分 | 词频增长会逐渐趋于饱和 |
| 排序目标 | 衡量词项与文档的重要性 | 估算查询与文档的相关性分数 |
| 改进重点 | 规则相对直接 | 加入更适合检索排序的加权思想 |
因此,BM25 并不是脱离关键词匹配的语义模型,而是在词项统计基础上,对相关性排序做了更稳健的处理。
BM25 相关性打分主要看哪些因素
BM25 的相关性打分会综合考虑词频、逆文档频率和文档长度,而不是只看关键词出现次数。理解这三个因素,有助于判断为什么某些文档会排在更靠前的位置。
| 因素 | 含义 | 对排序的影响 |
|---|---|---|
| 词频 | 查询词在文档中出现的次数 | 出现次数越多,通常越可能相关,但增益不会无限增长 |
| 逆文档频率 | 词项在整个文档集合中的区分能力 | 越少见、越能区分文档的词,通常权重越高 |
| 文档长度 | 文档本身的长短 | 用于校正长文档和短文档之间的差异,避免仅因篇幅长而占优 |
例如,一个专业术语如果只在少量文档中出现,往往比“的”“是”“如何”这类常见词更有区分度;同样,一篇文档虽然很长、包含更多词项,也不应仅凭篇幅获得不合理的排序优势。
要点: BM25 的打分结果来自综合加权计算,不能用“关键词出现越多,排名就一定越高”来简单理解。
词频饱和机制如何改善排序结果
词频饱和机制的直观含义是:同一个查询词在文档中重复出现,确实会提升相关性判断,但提升幅度会逐渐变小。
这解决了 TF-IDF 中一个常见问题:如果词频越高得分就近似持续增长,那么重复堆叠关键词的文档可能获得过高分数。BM25 通过让词频贡献逐步趋缓,减少这种得分失衡。
一个简化例子是:关键词从出现 2 次增加到 5 次,可能明显提升文档相关性;但从 50 次增加到 100 次,并不应该让相关性线性翻倍。因为当系统已经确认文档多次包含该词后,继续重复同一个词带来的新增信息会变少。
这种机制使 BM25 更适合真实搜索排序:它既承认关键词重复出现有意义,又避免把重复出现本身当成唯一信号。
BM25 在搜索系统中的典型应用
BM25 常用于搜索引擎和文本检索系统中的相关性排序,是现代搜索系统中的基础算法之一。在工程实践中,用户输入查询后,系统可以使用 BM25 对候选文档进行打分,再根据分数生成排序结果。
一个常见例子是,Elasticsearch 默认使用 BM25 作为相似度排序算法。这说明 BM25 不只是理论算法,也可以落地到实际检索系统的排序环节。
| 应用位置 | BM25 承担的作用 | 读者需要关注的问题 |
|---|---|---|
| 站内搜索 | 根据关键词与文档内容计算相关性 | 为什么某些页面排在更前面 |
| 文档检索 | 对说明文档、知识库、帮助中心内容排序 | 查询词是否与文档中的关键术语匹配 |
| 搜索引擎排序 | 作为文本相关性信号的一部分 | 词频、区分度和文档长度如何影响结果 |
理解 BM25 后,排查搜索排序问题会更有方向。例如,当某篇文档没有排到前面时,可以检查查询词是否出现在关键内容中、相关术语是否过于常见、文档长度是否影响了归一化后的分数。
BM25 在混合检索中的作用
在混合检索中,系统通常会组合关键词检索和其他检索方式。BM25 可承担关键词相关性排序部分,帮助系统保留对术语、编号、名称等字面匹配信息的敏感性。
在这类语境中,基于关键词的检索通常与稀疏嵌入、稀疏向量检索相关。它更关注词项是否出现以及出现后的统计相关性,适合补充非关键词检索方式可能遗漏的精确匹配信号。
| 用户需求 | 解决方式 | 效果 |
|---|---|---|
| 查询中包含明确术语 | 使用 BM25 计算关键词相关性 | 更容易命中包含相同术语的文档 |
| 查询中包含编号、型号或专有名词 | 保留关键词检索链路 | 减少精确字面信息被忽略的情况 |
| 需要兼顾字面匹配和其他检索能力 | 将 BM25 与其他检索方式组合 | 有助于兼顾不同类型的匹配信号 |
需要注意的是,BM25 本身主要基于词项匹配和统计相关性。它可以在混合检索中承担关键词侧的排序能力,但不应被等同于完整的语义理解模型。
理解和使用 BM25 时的常见误区
误区一:关键词出现越多,排序一定越靠前
关键词出现次数确实会影响 BM25 得分,但词频饱和机制会让重复出现带来的增益逐渐变小。同时,文档长度也会参与校正,因此不能只用词频判断排名。
误区二:BM25 是语义理解模型
BM25 主要基于词项匹配和统计相关性,用于估算查询与文档之间的相关性分数。它擅长处理关键词检索,但并不等同于理解句子含义、上下文意图或语义推理的模型。
误区三:只看单个因素就能解释排序
BM25 会综合词频、逆文档频率和文档长度等因素。一个词出现很多次,如果它本身过于常见,区分度可能有限;一篇文档内容很长,也需要通过长度因素进行校正。
误区四:BM25 只适合传统搜索,不适合新检索架构
BM25 常见于搜索引擎排序,也可以在混合检索中承担关键词检索部分。对于包含明确术语、产品名、字段名、编号或专有词的查询,关键词相关性仍然有实际价值。
检查清单: 分析 BM25 排序结果时,可以优先检查查询词是否命中、词项是否具有区分度、文档长度是否影响分数,以及是否存在重复堆叠关键词但实际信息量不足的情况。