https://www.youtube.com/watch?v=D2V1okCEsiE

https://www.youtube.com/watch?v=D2V1okCEsiE
TF-IDF为什么能找出文本里的重要词?
最近看TF-IDF的时候,一开始只理解了它的计算过程,但没有完全想明白一个问题:为什么用这个公式,就能把一段文本里更重要的词找出来?
后来想明白了,TF-IDF的思想其实很朴素。它不是单纯看一个词在当前文本里出现了多少次,而是同时看两个维度:
这个词在当前文本里出现得多不多;
这个词在所有文本里常不常见。
一个词要想被认为重要,需要满足两个条件:
在当前文本中比较高频;
在全局文本中比较稀缺。
这就是TF-IDF的核心直觉。它想找的不是"出现最多的词",而是:
当前文本里经常出现,但在其他文本里不那么常见的词。
换句话说,TF-IDF真正看重的是:
高频,但不泛滥。
- TF在看什么?
TF是Term Frequency,词频。
它衡量的是某个词在当前文本中出现的频率。常见公式是:
TF(t, d) = 词t在文档d中出现的次数 / 文档d中的总词数
也可以写成:
TF(t, d) = f(t, d) / Σ f(w, d)
其中:
t 表示某个词;
d 表示某篇文档;
f(t, d) 表示词t在文档d中出现的次数;
Σ f(w, d) 表示文档d中所有词出现次数之和。
TF想表达的是:
一个词在当前文档中出现比例越高,它越可能代表当前文档主题。
比如一篇文章中反复出现这些词:
人工智能
大模型
训练数据
推理能力
那这些词大概率就是这篇文章的主题词。如果只看当前文本,某个词出现得越多,我们就越容易认为它和这篇文章有关。
但只看TF会有问题,因为很多普通词也会高频出现,比如:
我们
这个
问题
情况
进行
相关
这些词在很多文章里都可能反复出现,但它们并不能真正代表文章主题。所以只靠TF是不够的。
- IDF在看什么?
IDF是Inverse Document Frequency,逆文档频率。
它衡量的是某个词在整个语料库里有多稀缺。常见公式是:
IDF(t) = log(N / DF(t))
其中:
N = 语料库中的总文档数;
DF(t) = 包含词t的文档数。
IDF想表达的是:
一个词出现在越少的文档里,它越有区分度;
一个词出现在越多的文档里,它越普通。
比如一共有10000篇新闻文章。
如果"新闻"这个词出现在9000篇文章里:
IDF(新闻) = log(10000 / 9000)
这个值会很小,因为"新闻"太常见,几乎没什么区分度。
如果"量子芯片"只出现在20篇文章里:
IDF(量子芯片) = log(10000 / 20)
这个值就会明显更大。因为"量子芯片"很少见,一旦出现,就更能代表某些特定文章的主题。
所以IDF要表达的不是"这个词在当前文章里重要不重要",而是:
这个词在所有文章中是不是足够少见。
- 为什么IDF要用 N / DF(t)?
很多人刚学TF-IDF时会疑惑:为什么IDF要写成:
log(总文档数 / 包含该词的文档数)
也就是为什么要用:
N / DF(t)
原因很简单:这个比例本身就是一种"稀缺度"。
假设总共有10000篇文章。
词A出现在9000篇文章里:
N / DF(A) = 10000 / 9000 ≈ 1.11
这说明这个词几乎到处都有,很普通。
词B出现在100篇文章里:
N / DF(B) = 10000 / 100 = 100
这说明这个词相对少见。
词C只出现在1篇文章里:
N / DF© = 10000 / 1 = 10000
这说明这个词非常稀缺。
可以看到:
出现得越广泛 → DF越大 → N / DF越小 → IDF越低;
出现得越少见 → DF越小 → N / DF越大 → IDF越高。
这个变化趋势刚好符合我们对"区分度"的理解。
也可以换一种理解方式:
N / DF(t)
可以理解为:
平均多少篇文档里,才有一篇包含这个词。
如果一个词每1篇、2篇文章里就出现一次,说明它很普通;如果一个词平均几百篇文章里才出现一次,说明它很特殊。越特殊的词,越有可能帮助我们识别文章主题。
- 为什么还要取log?
如果只用:
N / DF(t)
会有一个问题:极端稀缺词的权重会被放得太大。
比如总共有100000篇文章,一个词只出现了1篇:
100000 / 1 = 100000
这个数太大了。它可能让一个偶然出现的词支配整个结果。
取log以后:
log(100000)
这个值仍然比普通词大,但不会大到离谱。
所以log的作用是:
保留"稀缺词更重要"的趋势;
压缩极端差距;
避免个别极罕见词权重过大。
可以理解为:IDF想奖励稀缺词,但不想让稀缺词"权力过大"。
所以IDF公式:
IDF(t) = log(N / DF(t))
本质上是在做两件事:
用 N / DF(t) 表示稀缺程度;
用 log 压缩极端差距。
- TF-IDF为什么要把TF和IDF相乘?
TF和IDF分别回答两个问题。
TF回答:
这个词在当前文档里重要吗?
IDF回答:
这个词在全局文档中稀缺吗?
所以TF-IDF把二者相乘:
TF-IDF(t, d) = TF(t, d) × IDF(t)
也就是:
TF-IDF(t, d) = f(t, d) / Σ f(w, d) × logN / DF(t)
它表达的是:
一个词既要在当前文本中经常出现,又不能在所有文本中太常见。
如果一个词在当前文章中出现很多次,但它在所有文章中也很常见,那么IDF会把它压下去。
如果一个词在全局中很稀缺,但在当前文章中只出现了一次,那么TF不会太高。
只有那种:
当前文章里出现得比较多;
全局文章里又不太常见。
这样的词,TF-IDF值才会高。
这就是TF-IDF能找出主题词的原因。
- 一个完整例子
假设有10000篇文章。
某篇文章一共有1000个词。
"动力电池回收"在这篇文章中出现了20次,并且在全库10000篇文章中只出现在20篇里。
那么:
TF(动力电池回收) = 20 / 1000 = 0.02
IDF(动力电池回收) = log(10000 / 20) = log(500)
所以:
TF-IDF(动力电池回收) = 0.02 × log(500)
这个权重会比较高,因为:
它在当前文章中出现得不少;
它在全库文章中又比较少见。
再看"情况"这个词。
假设"情况"在当前文章中也出现了20次,但它在全库10000篇文章中出现在8000篇里。
那么:
TF(情况) = 20 / 1000 = 0.02
IDF(情况) = log(10000 / 8000) = log(1.25)
所以:
TF-IDF(情况) = 0.02 × log(1.25)
虽然"情况"在当前文章里也出现了20次,但因为它在全局文章里太常见,IDF很低,最终TF-IDF也会很低。
这就解释了为什么TF-IDF能把"情况、问题、相关、发展"这类普通词压下去,把更有区分度的主题词提上来。
- TF-IDF和文本相似度有什么关系?
TF-IDF不仅可以找关键词,还可以把文本变成向量。
假设整个语料库里有这些词:
人工智能
大模型
训练数据
新能源汽车
电池回收
那么每篇文章都可以表示成一个向量。
比如:
文章A = 0.8, 0.7, 0.5, 0, 0
文章B = 0.75, 0.6, 0.4, 0, 0
文章C = 0, 0, 0, 0.9, 0.8
文章A和文章B的向量方向很接近,说明它们都在讨论人工智能相关内容。
文章A和文章C的方向差得很远,说明它们主题不同。
这时候就可以用余弦相似度计算两个文本向量之间的相似程度:
cosine_similarity(A, B) = (A · B) / (||A|| × ||B||)
其中:
A · B 表示两个向量的点积;
||A|| 和 ||B|| 表示两个向量的长度。
余弦相似度看的不是文本有多长,而是两个向量的方向是否接近。方向越接近,说明两个文本的高权重词越相似,主题也越接近。
所以TF-IDF和余弦相似度常常一起使用:
TF-IDF负责把文本变成向量;
余弦相似度负责比较两个文本向量是否相近。
- TF-IDF适合做什么?
TF-IDF适合做文本检索、候选召回、主题相似度初筛。
比如:
用户输入一段标题;
系统从历史文章中找出标题相近的文章。
或者:
输入一个文档;
系统找出可能相关的历史文档。
它很适合做第一轮筛选。
但它不一定适合做最终判断。
因为TF-IDF主要看词的重要性和文本相似度,它不理解复杂业务口径。两个标题相似,不代表内容完全一样;两个字段名字很像,也可能业务含义完全不同。
所以在实际应用里,TF-IDF更像一个"候选召回器"。
它先帮我们从大量文本中找出可能相关的一批候选结果,后面再通过更精细的规则、字段比对、语义判断或人工审核,确认是否真的相同。
- 一句话总结
TF-IDF的思想可以概括为:
当前文本里经常出现,全局文本里不常出现的词,更能代表当前文本。
它的公式是:
TF-IDF(t, d) = TF(t, d) × IDF(t)
展开就是:
TF-IDF(t, d) = f(t, d) / Σ f(w, d) × logN / DF(t)
其中:
TF负责衡量词在当前文档中的重要程度;
IDF负责衡量词在全局文档中的稀缺程度;
N / DF(t) 表示稀缺程度;
log 用来压缩极端差距。
所以TF-IDF不是玄学,它本质上是一种很朴素的统计思想:
高频但不泛滥的词,才更有区分度。