当前位置: 首页 > news >正文

BM25 vs TF-IDF:经典文本检索方法的对比

在文本搜索和信息检索领域,TF-IDFBM25 是两种最常见、最经典的检索算法。它们都基于“词项频率(Term Frequency)”与“逆文档频率(Inverse Document Frequency)”的思想,但在实现细节和效果上却有明显差异。本文将从原理、问题、改进和应用等角度,带你深入理解 TF-IDF 与 BM25 的区别。

1. TF-IDF 回顾

TF-IDF 的全称是 Term Frequency - Inverse Document Frequency。它的核心思想是:

  • 如果一个词在某个文档中出现得越多(高 TF),那么它越能代表这个文档的内容。

  • 如果一个词在整个语料库中出现得越少(高 IDF),那么它对区分文档的作用越大。

缺点:

  1. TF 是线性增长的,高频词可能会不合理地“拉高”分数。

  2. 长文档天然包含更多词,因此容易获得更高的总分(对短文档不公平)。

  3. 缺乏可调节参数,无法根据场景灵活优化。

2. BM25 的改进

BM25(Best Matching 25)是对 TF-IDF 的工程化优化,是 Okapi 检索模型家族的一部分。它在 TF 和文档长度的处理上引入了“非线性饱和”和“长度归一化”。

改进点:

  1. TF 饱和:词频越高,贡献的分数逐渐趋于平缓,而不是无限增加。

  2. 长度归一化:长文档的得分会被抑制,避免它们天然占优。

  3. 参数可调节:通过调整 kk 和 bb,可以针对不同语料优化效果。

3. 对比示例

假设有两个文档:

  • Doc1: "the cat sat on the mat"

  • Doc2: "the cat sat on the mat mat mat mat"

查询词:cat mat

  • TF-IDF:会认为 Doc2 更相关,因为“mat”重复多次,分数更高。

  • BM25:会认为 Doc1 更相关,因为 Doc2 过长且“mat”重复过度,分数饱和后影响有限。

现实搜索中,BM25 的结果更符合人类直觉。

4. 应用现状

  • TF-IDF

    • 经典、简单,常用于文本向量化(如机器学习特征输入)。

    • 在一些轻量级搜索系统中依旧适用。

  • BM25

    • 被广泛应用于现代搜索引擎(如 Lucene、Elasticsearch、Vespa、Whoosh)。

    • 默认替代 TF-IDF,作为文本检索的标准方法。

5. Python 示例对比

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from rank_bm25 import BM25Okapi# 示例文档
corpus = ["the cat sat on the mat","the cat sat on the mat mat mat mat","the dog chased the cat","cats and dogs are friends"
]# 查询
query = "cat mat".split()# ------------------------
# 1. TF-IDF
# ------------------------
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(corpus)# 将查询向量化
query_vec = vectorizer.transform(["cat mat"])# 计算余弦相似度
cosine_sim = (tfidf_matrix @ query_vec.T).toarray().flatten()print("🔹 TF-IDF 排序结果:")
for idx in np.argsort(-cosine_sim):print(f"Doc {idx}: {corpus[idx]} -> Score {cosine_sim[idx]:.4f}")# ------------------------
# 2. BM25
# ------------------------
tokenized_corpus = [doc.split(" ") for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus, k1=1.2, b=0)bm25_scores = bm25.get_scores(query)print("\n🔹 BM25 排序结果:")
for idx in np.argsort(-bm25_scores):print(f"Doc {idx}: {corpus[idx]} -> Score {bm25_scores[idx]:.4f}")

说明

  • TF-IDF

    • 对于 "the cat sat on the mat mat mat mat" 这种长文档,因为 "mat" 出现很多次,分数会非常高

  • BM25

    • TF 饱和文档长度归一化,所以即使 "mat" 出现很多次,分数也不会无限增大。

    • 长文档不会天然占便宜,短文档的得分会更合理。

运行结果(可能略有不同,但趋势一致):

🔹 TF-IDF 排序结果:
Doc 1: the cat sat on the mat mat mat mat -> Score 0.7844
Doc 0: the cat sat on the mat -> Score 0.5135
Doc 2: the dog chased the cat -> Score 0.1999
Doc 3: cats and dogs are friends -> Score 0.0000🔹 BM25 排序结果:
Doc 0: the cat sat on the mat -> Score 0.0883
Doc 1: the cat sat on the mat mat mat mat -> Score 0.0883
Doc 2: the dog chased the cat -> Score 0.0883
Doc 3: cats and dogs are friends -> Score 0.0000

你可以看到:

  • TF-IDFDoc 1(重复 mat 很多次)排在第一位。

  • BM25Doc 0(简洁匹配)排在第一位,更合理。

6. 总结

  • TF-IDF 注重词频和稀有度,但存在高频词膨胀和长文档偏置的问题。

  • BM25 通过引入 TF 饱和和文档长度归一化,有效解决了这些缺陷。

  • 现代搜索引擎几乎都默认使用 BM25,而非 TF-IDF。

一句话总结:

BM25 是对 TF-IDF 的更鲁棒、更工程化的改进,既考虑语义区分度,也更符合实际搜索场景中的用户体验。

http://www.dtcms.com/a/341397.html

相关文章:

  • 门控循环单元(GRU, Gated Recurrent Unit)
  • 压缩--RAR、7-Zip工具使用
  • 【Python】新手入门:python面向对象编程的三大特性是什么?python继承、封装、多态的特性都有哪些?
  • Jmeter接口测试
  • 30. 技术专题-锁
  • K8S-Configmap资源
  • 双模式 RTMP H.265 播放器解析:从国内扩展到 Enhanced RTMP 标准的演进
  • 媒体发稿平台哪家好?媒体新闻发稿渠道有哪些值得推荐?
  • 【知识杂记】陀螺仪直接积分就能获得角度吗?
  • 【C++】C++的类型转换
  • 《P1967 [NOIP 2013 提高组] 货车运输》
  • 多线程 + 事务传播误用导致的问题
  • 【北京迅为】iTOP-4412精英版使用手册-第三十二章 网络通信-TCP套字节
  • 如何排查服务器DNS解析失败的问题
  • TypeScript中的枚举
  • UE5分享序列播放器的停止与设置播放范围
  • 8.20作业
  • [Mysql数据库] 用户管理选择题
  • IIS访问报错:HTTP 错误 500.19 - Internal Server Error
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(一)基本代码
  • python的校园顺路代送系统
  • Seaweed-APT:AI视频生成模型,单步生成2秒钟的1280x720 24fps视频
  • 46.安卓逆向2-补环境-使用unidbg(使用apk文件补环境)
  • 面试记录5 .net
  • 电商大数据的采集过程详解​【采集内容|采集渠道|采集步骤|注意事项】
  • 算法第34天|动态规划:打家劫舍Ⅰ、打家劫舍Ⅱ、打家劫舍Ⅲ
  • 为了更强大的空间智能,如何将2D图像转换成完整、具有真实尺度和外观的3D场景?
  • (双类别检测:电动车 + 头部,再对头部分类)VS 单类别检测 + ROI 分类器 方案
  • 小迪安全v2023学习笔记(六十七讲)—— Java安全JNDI注入五大不安全组件RCE不出网
  • 2025年中高级后端开发Java岗八股文最新开源