《一文吃透 TF-IDF:原理、公式推导、手算例子与 Python 实战》

目录

背景:

核心定义

1. 为什么要 TF-IDF?

2. TF(Term Frequency)是什么?

定义

举例

3. IDF(Inverse Document Frequency)是什么?

定义

直觉

平滑版(更常用)

4. TF-IDF 合起来是什么?

5. 手算一个完整例子(你会彻底懂)

Step 1:统计 N

Step 2:计算 df

Step 3:算 IDF(用简单版 log(N/df))

Step 4:算 TF(以 D3 为例)

Step 5:算 TF-IDF

6. TF-IDF 的核心本质

7. TF-IDF 常见坑(必须掌握)

1)分词很重要(中文必须先分词)

2)停用词(stopwords)要过滤

3)TF 不是简单次数

4)TF-IDF 不理解语义

8.简答题

9. “练习题”

10. Python 实战:sklearn 快速上手

结语:TF-IDF 是传统 NLP 的基石


背景:

当我们处理文本任务时,经常会遇到一个核心问题:

计算机如何理解一段文字?

机器并不懂“语言”,它只能理解“数字”。所以无论是做:

  • 文本分类(垃圾邮件识别)
  • 搜索引擎(输入关键词找文章)
  • 文本相似度(两段文本是否像)
  • 关键词抽取(自动生成文章标签)
  • 推荐系统(找相似内容)

都绕不开一个关键步骤:

把文本转成可用于计算的数字特征(向量)。

而在传统 NLP 中,最经典、最稳定、最常用的特征工程方法之一,就是 TF-IDF

它不用深度学习,也不需要训练模型,却能用统计方式给每个词赋予一个“重要性评分”,从而帮助我们提取关键词、计算相似度、构建检索系统,是理解 NLP 的一个经典起点。

核心定义

TF-IDF 是一种衡量“某个词对某篇文章有多重要”的方法。

  • 如果一个词在某篇文章里出现很多次(说明这篇文章在强调它)→ TF 高
  • 如果这个词在所有文章里到处都有(比如“的”“是”“我们”)→ 说明它不稀有、不具区分度 → IDF 低
  • 反之,一个词在很多文章里都不出现,却在某篇里出现 → 说明它很能代表这篇文章 → IDF 高

所以:

TF-IDF = 词在文档中出现得多(TF) × 词在全体文档中越稀有越重要(IDF)

1. 为什么要 TF-IDF?

我们在做:

  • 关键词抽取
  • 文本分类
  • 相似度计算
  • 搜索引擎(最经典应用)
  • 文本向量化(传统 NLP 的基本操作)

时,都需要把文字变成数值特征,而 TF-IDF 就是一种经典的“词重要性”数值化方法


2. TF(Term Frequency)是什么?

定义

词频:某个词在一篇文档里出现的频率。

最常见形式:

TF(t,d) = \frac{\operatorname{count}(t,d)}{\sum_{w \in d} \operatorname{count}(w, d)}

意思就是:

词 t 在文档 d 的出现次数 / 文档总词数

举例

文档 d: "我 爱 北京 北京 天安门"

  • “北京”出现 2 次
  • 总词数 5

TF(北京,d)=2/5=0.4

3. IDF(Inverse Document Frequency)是什么?

定义

词的逆文档频率:某个词在整个语料库中出现得越少,它越能区分文档 → 越重要。

最常见形式:

IDF(t) = \log\left( \frac{N}{df(t)} \right)
  • N:语料库中文档数量
  • df(t):包含词 t 的文档数量(Document Frequency)

直觉

  • 如果所有文章都有“我们”,那它无法区分文章 → IDF 低
  • 如果只有少数文章有“量子计算”,它能强烈区分文章 → IDF 高

平滑版(更常用)

为了避免某个词从不出现导致除零:

IDF(t) = \log\left( \frac{N + 1}{df(t) + 1} \right) + 1

4. TF-IDF 合起来是什么?

TFIDF(t,d)=TF(t,d)×IDF(t)

一个词在文档里出现多(TF)且在全库里稀有(IDF) → TFIDF 高 → 关键词


5. 手算一个完整例子(你会彻底懂)

我们有 3 篇文档:

  • D1:"我 爱 北京"
  • D2:"我 爱 上海"
  • D3:"我 爱 北京 北京"

Step 1:统计 N

N = 3

Step 2:计算 df

出现在哪些文档df
D1 D2 D33
D1 D2 D33
北京D1 D32
上海D21

Step 3:算 IDF(用简单版 log(N/df))

IDF(我)=log⁡(3/3)=0

IDF(爱)=0

IDF(北京)=log(3/2)=0.176

IDF(上海)=log⁡(3/1)=1.099

Step 4:算 TF(以 D3 为例)

D3 = "我 爱 北京 北京" 总词 4

  • TF(北京, D3)=2/4=0.5

Step 5:算 TF-IDF

TFIDF(北京,D3)=0.5×0.176=0.088

在 D2:

TFIDF(上海,D2)=0.333×1.099=0.366

上海比北京更能代表 D2,因为它更稀有。


6. TF-IDF 的核心本质

它不是“词有多重要”,而是“词能不能代表这一篇,并能和其他文章区别开”。

所以:

  • “的”“是”“我们”这些词 TF 高,但 IDF 近似 0 → TF-IDF 低
  • “上海”“量子计算”这些词 TF 可能不高,但 IDF 很高 → TF-IDF 可能很高

7. TF-IDF 常见坑(必须掌握)

1)分词很重要(中文必须先分词)

TF-IDF 是基于“词”的,中文必须先分词。

一般做法:

  • jieba 分词后再喂给 TfidfVectorizer(tokenizer=...)

2)停用词(stopwords)要过滤

比如:的、是、在、了、我、你

否则这些词大量出现导致向量质量很差。

3)TF 不是简单次数

有些版本会用:

  • log(1 + count)
  • 或者归一化,避免长文档占优势

4)TF-IDF 不理解语义

它只看“词统计”,不懂:

  • 同义词(北京/京城)
  • 上下文语义
  • 多义词

所以它适合:
关键词/检索/文本相似度
不适合:
深层语义理解(需要 BERT 这类模型)


8.简答题

你应该能回答这三个问题:

  1. 为什么单用 TF 不够?
    因为高频词可能是全库共用词,不具有区分性,需要 IDF 抑制。
  2. 为什么单用 IDF 不够?
    因为一个词虽然稀有,但若在该文档没出现(TF=0)也没意义。
  3. TF-IDF 的思想是什么?
    “在某篇文档高频 + 在全库稀有” 才代表该文档。

9. “练习题”

我们有 4 篇文档:

  • D1:"猫 喜欢 吃 鱼"
  • D2:"狗 喜欢 吃 肉"
  • D3:"猫 喜欢 睡觉"
  • D4:"狗 喜欢 睡觉"

问题:
1)哪个词在整个语料库里 IDF 最大?
2)D1 的关键词可能是什么?(按 TF-IDF 最大判断)
3)为什么“喜欢”一定 TF 很高但 TF-IDF 很低?

10. Python 实战:sklearn 快速上手

from sklearn.feature_extraction.text import TfidfVectorizer docs = [     "我 爱 北京",     "我 爱 上海",     "我 爱 北京 北京" ] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(docs) print(vectorizer.get_feature_names_out()) print(X.toarray())

输出:

  • 第一行:词表(所有词)
  • 第二行:每篇文档的 TF-IDF 向量

结语:TF-IDF 是传统 NLP 的基石

虽然深度学习现在很强,但 TF-IDF 仍然在很多场景里依然实用:

  • 工程上快速实现关键词和召回
  • 数据量小但需要可解释性
  • 构建搜索系统的 baseline

它是最经典、最耐用的 NLP 基础工具之一。掌握它,就掌握了传统文本特征工程的核心。

Read more

JAVA 泛型与通配符:从原理到实战应用

JAVA 泛型与通配符:从原理到实战应用

JAVA 泛型与通配符:从原理到实战应用 1.1 本章学习目标与重点 💡 掌握泛型的核心概念与设计初衷,理解泛型的编译期检查机制。 💡 熟练使用泛型类、泛型接口和泛型方法,解决数据类型安全问题。 💡 理解通配符(?)、上界通配符(? extends T)和下界通配符(? super T)的使用场景。 ⚠️ 本章重点是 泛型的擦除机制 和 通配符的灵活运用,这是提升代码通用性和安全性的关键。 1.2 泛型的核心概念与设计初衷 1.2.1 为什么需要泛型 在没有泛型的 JDK 5 之前,集合类只能存储 Object 类型的对象。获取元素时需要强制类型转换,这会带来两个严重问题: 1. 类型不安全:可以向集合中添加任意类型的对象,运行时可能抛出 ClassCastException。 2. 代码臃肿:频繁的强制类型转换会让代码可读性和维护性变差。 💡 泛型的出现就是为了解决这些问题,它的核心思想是

By Ne0inhk

CustomTkinter终极指南:5分钟创建现代化Python桌面应用

CustomTkinter终极指南:5分钟创建现代化Python桌面应用 【免费下载链接】CustomTkinterA modern and customizable python UI-library based on Tkinter 项目地址: https://gitcode.com/gh_mirrors/cu/CustomTkinter CustomTkinter是一个基于Python Tkinter的现代化UI库,为传统Tkinter注入了全新的生命力。它提供了一系列美观、现代化且完全可定制的组件,支持自动适配系统外观模式和高DPI缩放,让Python桌面应用开发变得简单而优雅。 为什么选择CustomTkinter?🚀 在Python GUI开发领域,传统Tkinter界面陈旧,而PyQt等库学习曲线陡峭。CustomTkinter完美解决了这一痛点——它保留了Tkinter的简单语法,同时提供了媲美现代桌面应用的视觉效果。 深色主题的复杂应用界面,包含侧边栏、选项卡、文本框、滑块、按钮等多种组件 浅色主题的复杂应用界面,展示了CustomTkinter在ma

By Ne0inhk
Python快速落地的临床知识问答与检索项目(2025年9月教学配置部分)

Python快速落地的临床知识问答与检索项目(2025年9月教学配置部分)

项目概述与技术选型 本项目定位为临床辅助决策支持工具,而非替代临床诊断的独立系统,旨在解决医疗行业两大核心痛点:一是医学知识更新速率加快,2025 年临床指南年均更新量较 2020 年增长 47%,传统知识管理方式难以同步;二是科室规范呈现碎片化分布,不同院区、亚专科的诊疗流程存在差异,导致知识检索效率低下。技术路线采用 RAG 知识库 + ChatFlow 多轮对话 + 工具节点对接 的三层架构,通过整合指南文献、临床路径和院内 SOP 文档,满足门诊快速问诊、病房随访问答及科室知识库精准检索需求,最终实现医疗信息可及性提升 30%、基层医生决策效率提高 25% 的核心价值目标[1]。 技术栈选型分析 1. 大语言模型:领域专精与多模态融合 临床知识问答核心模型需兼顾专业性与部署灵活性。2025 年主流选型包括: * Chimed - GPT:基于 Ziya - V2 架构,通过预训练、

By Ne0inhk
Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型 * 什么是"一切皆对象"? * Python对象的类型层次 * 1. 内置类型对象 * 2. 函数对象 * 3. 类对象和实例对象 * 4. 模块对象 * 对象行为的统一性 * 特殊方法:对象行为的背后 * 对象模型的实际应用 * 性能考虑 * 总结 Python以其"一切皆对象"的设计哲学而闻名,这种设计为语言带来了极大的灵活性和一致性。本文将深入探讨Python的对象模型,解释为什么说"Python中一切皆对象",并通过实例展示这一特性如何影响我们的编程方式。 什么是"一切皆对象"? 在Python中,从简单的数字、字符串到复杂的函数、类甚至模块,所有这些都是对象。这意味着它们都有: 1. 身份(identity):对象在内存中的唯一地址,可通过id()函数获取 2.

By Ne0inhk