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

TF-IDF BM25 原理及应用

1. 什么是TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,
词频-逆文档频率),是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降

词频 (term frequency, TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

逆文档频率(Inverse Document Frequency,IDF)指的是文件总数和某个词语出现文件数之比。

TF-IDF就是TF和IDF的乘积。

TF是一个词语在一篇文章中的出现次数,IDF是一个词语在所有文档中出现次数的倒数,一个词语在一篇文档中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章,所以二者相乘的TF-IDF就可以用来衡量一个词在一篇文档中的重要性。

对于语料库D中给定的文档d里的词项t,有:

tf(t,d)=(t在d中出现的次数)/(d的长度)tf(t, d) = (t在d中出现的次数)/(d的长度)tf(t,d)=(td中出现的次数)/(d的长度)

idf(t,D)=log(文档数)/(包含t的文档数)idf(t, D) = log(文档数)/(包含t的文档数)idf(t,D)=log(文档数)/(包含t的文档数)

tfidf(t,d,D)=tf(t,d)×idf(t,D)tfidf(t, d, D) = tf(t, d)\times idf(t, D)tfidf(t,d,D)=tf(t,d)×idf(t,D)

2. 用TF-IDF找到文档的主题

认为在一篇文档中某个词的TF-IDF值越大,这个词就越能代表这篇文档。

1fromsklearn.feature_extraction.textimportTfidfVectorizer23if__name__=="__main__":6docs=["The faster Harry got to the store, the faster and faster Harry would get home."]7docs.append("Harry is hairy and faster than Jill.")8docs.append("Jill is not as hairy as Harry.")9corpus=docs10vectorizer=TfidfVectorizer(min_df=1)11model=vectorizer.fit_transform(corpus)12print(vectorizer.get_feature_names())13print(model.todense().round(2))~

这是一段使用sklearn来计算文档TF-IDF的代码,结果如下:

根据TF-IDF的数值可以看到,这种方法认为第一、二个句子中"the"这个词的最重要,而第三个句子认为"as"这个词最重要,但是在常识上我们知道这两个词是不能够代表这三个句子的。这种常见的但对短语而言承载实际意义很少的词被称为“停用词”,在实际用的时候回去掉的,或者当语料足够多的情况下因为它们在每一个文档中都大量存在,所以TF-IDF分数会变小。

3. 用TF-IDF的向量计算两个文档的相关度

我们已经得到了每篇文档使用TF-IDF表示的向量,之后只要对两个向量做点乘就可以得到对应的两篇文档的相关性了。

4. BM25

BM25 是信息检索(IR)里最经典、工程上仍然大量使用的 稀疏检索打分函数,本质是在 TF-IDF 基础上的一个概率化 + 饱和 + 长度归一化改进版本。

4.1 BM25 在干什么(直观理解)

给定 queryqqq和文档ddd,BM25 做的是计算这个 query 和文档的相关性分数,用于排序(ranking)

核心思想:

  • 词出现越多 → 越相关(TF)
  • 词越稀有 → 越重要(IDF)
  • 文档太长 → 要惩罚(length normalization)
  • 同一个词出现很多次 → 收益递减(饱和)

4.2 BM25 公式(核心)

BM25(q,d)=∑t∈qIDF(t)⋅f(t,d)⋅(k1+1)f(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)BM25(q,d)=\sum_{t\in q} IDF(t)\cdot \frac{f(t,d)\cdot(k_1+1)}{f(t,d)+k_1\cdot(1-b+b\cdot\frac{|d|}{avgdl})}BM25(q,d)=tqIDF(t)f(t,d)+k1(1b+bavgdld)f(t,d)(k1+1)

  • f(t,d)f(t,d)f(t,d):词频,query 中的词ttt在文档ddd中出现的次数
  • IDF(t)IDF(t)IDF(t):逆文档频率
    常见形式:
    IDF(t)=log⁡N−nt+0.5nt+0.5IDF(t)=\log \frac{N-n_t+0.5}{n_t+0.5}IDF(t)=lognt+0.5Nnt+0.5
    NNN表示总文档数,ntn_tnt表示包含词ttt的文档数
  • 分母:长度归一化 + 饱和控制
    关键在这一项:
    f(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)f(t,d)+k_1\cdot(1-b+b\cdot\frac{|d|}{avgdl})f(t,d)+k1(1b+bavgdld)
    包含两个机制:
    • 长度归一化(b):其中∣d∣|d|d表示文档长度,avgdlavgdlavgdl表示平均文档长度,b∈[0,1]b\in[0,1]b[0,1],是可调节参数,文档越长 → 分母越大 → 得分降低
    • TF 饱和(k1):可调节参数,k1∈[1.2,2.0]k_1\in[1.2,2.0]k1[1.2,2.0],词出现 1 次 vs 10 次 → 不会差 10 倍,防止关键词堆砌(spam)
http://www.jsqmd.com/news/614421/

相关文章:

  • PDE (Processing D Editor) 三维场景编辑器 · 软件白皮书 · 基于 v..爸
  • Vue-Multiselect 安全防护终极指南:彻底防范 XSS 攻击与数据注入威胁
  • 断崖式下跌!最强AI也搞不定长期开发:代码堆得越多系统崩得越快
  • React Express JSX语法详解:如何编写高效的React组件
  • 集成AI 的 Redis 客户端 Rudist发布新版了诒
  • SEATA分布式事务——AT模式郝
  • PMSG永磁同步发电机并网仿真模型:包含多部分控制与优化特性的动态仿真研究
  • HTML怎么显示灵感便签关联项目_HTML拖拽绑定项目入口【详解】
  • 3D点云标注的高效工具:labelCloud从入门到精通的实践指南
  • YOLOE官版镜像快速部署指南:5分钟搞定开放词汇目标检测环境
  • PHP代码“带病上线”时代终结:2024最严GDPR/等保合规AI校验清单(仅限首批200名开发者获取)
  • 学术论文助手:LaTeX写作中集成Qwen3-ASR-0.6B进行语音草稿输入
  • 蓝桥杯单片机组——榨干选手资源包(STC)
  • Pixel Dimension Fissioner 高性能计算:C++后端推理服务开发
  • 中望CAD2025
  • 工业五官:08 传感器在工厂到底能干啥?18 个真实案例告诉你
  • Inspektor Gadget开发者指南:从零构建你的第一个eBPF监控工具
  • Boneyard部署指南:CI/CD集成、生产环境配置和性能监控最佳实践
  • 终极鸣潮自动化助手:如何用OK-WW一键解放双手,智能刷取声骸与日常任务
  • 蓝桥杯单片机组——榨干选手资源包(芯片数据手册)
  • OpenAlternative 终极数据备份策略:确保开源目录信息的安全可靠
  • esp32s3中使用串口中断事件消息队列的方式接收数据
  • 河道泄洪预警广播系统解决方案详解
  • 单片机世界探秘:09 听懂模拟世界的声音——ADC模拟采集全攻略!
  • 3大技术突破:COMET如何重塑机器翻译质量评估标准
  • 终极指南:如何用虎符台轻松管理全面战争MOD,告别游戏崩溃烦恼
  • 【GraalVM企业级落地红皮书】:金融级静态镜像构建规范(含SBOM生成、符号表剥离、RPM签名、CVE自动扫描闭环)
  • OpenSSF Scorecard安全策略检查:保护代码仓库的终极完整指南
  • 微软2026年Win11路线图梳理:18项关键改进,重塑用户体验
  • 2026届必备的六大AI辅助论文神器横评