《一文吃透 TF-IDF:原理、公式推导、手算例子与 Python 实战》
目录
3. IDF(Inverse Document Frequency)是什么?
背景:
当我们处理文本任务时,经常会遇到一个核心问题:
计算机如何理解一段文字?
机器并不懂“语言”,它只能理解“数字”。所以无论是做:
- 文本分类(垃圾邮件识别)
- 搜索引擎(输入关键词找文章)
- 文本相似度(两段文本是否像)
- 关键词抽取(自动生成文章标签)
- 推荐系统(找相似内容)
都绕不开一个关键步骤:
把文本转成可用于计算的数字特征(向量)。
而在传统 NLP 中,最经典、最稳定、最常用的特征工程方法之一,就是 TF-IDF。
它不用深度学习,也不需要训练模型,却能用统计方式给每个词赋予一个“重要性评分”,从而帮助我们提取关键词、计算相似度、构建检索系统,是理解 NLP 的一个经典起点。
核心定义
TF-IDF 是一种衡量“某个词对某篇文章有多重要”的方法。
- 如果一个词在某篇文章里出现很多次(说明这篇文章在强调它)→ TF 高
- 如果这个词在所有文章里到处都有(比如“的”“是”“我们”)→ 说明它不稀有、不具区分度 → IDF 低
- 反之,一个词在很多文章里都不出现,却在某篇里出现 → 说明它很能代表这篇文章 → IDF 高
所以:
TF-IDF = 词在文档中出现得多(TF) × 词在全体文档中越稀有越重要(IDF)
1. 为什么要 TF-IDF?
我们在做:
- 关键词抽取
- 文本分类
- 相似度计算
- 搜索引擎(最经典应用)
- 文本向量化(传统 NLP 的基本操作)
时,都需要把文字变成数值特征,而 TF-IDF 就是一种经典的“词重要性”数值化方法。
2. TF(Term Frequency)是什么?
定义
词频:某个词在一篇文档里出现的频率。
最常见形式:
意思就是:
词 t 在文档 d 的出现次数 / 文档总词数
举例
文档 d: "我 爱 北京 北京 天安门"
- “北京”出现 2 次
- 总词数 5
TF(北京,d)=2/5=0.4
3. IDF(Inverse Document Frequency)是什么?
定义
词的逆文档频率:某个词在整个语料库中出现得越少,它越能区分文档 → 越重要。
最常见形式:
- N:语料库中文档数量
- df(t):包含词 t 的文档数量(Document Frequency)
直觉
- 如果所有文章都有“我们”,那它无法区分文章 → IDF 低
- 如果只有少数文章有“量子计算”,它能强烈区分文章 → IDF 高
平滑版(更常用)
为了避免某个词从不出现导致除零:
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 D3 | 3 |
| 爱 | D1 D2 D3 | 3 |
| 北京 | D1 D3 | 2 |
| 上海 | D2 | 1 |
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.简答题
你应该能回答这三个问题:
- 为什么单用 TF 不够?
因为高频词可能是全库共用词,不具有区分性,需要 IDF 抑制。 - 为什么单用 IDF 不够?
因为一个词虽然稀有,但若在该文档没出现(TF=0)也没意义。 - 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 基础工具之一。掌握它,就掌握了传统文本特征工程的核心。