TF-IDF为什么能找出文本里的重要词?

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

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

TF-IDF为什么能找出文本里的重要词?

最近看TF-IDF的时候,一开始只理解了它的计算过程,但没有完全想明白一个问题:为什么用这个公式,就能把一段文本里更重要的词找出来?

后来想明白了,TF-IDF的思想其实很朴素。它不是单纯看一个词在当前文本里出现了多少次,而是同时看两个维度:

这个词在当前文本里出现得多不多;

这个词在所有文本里常不常见。

一个词要想被认为重要,需要满足两个条件:

在当前文本中比较高频;

在全局文本中比较稀缺。

这就是TF-IDF的核心直觉。它想找的不是"出现最多的词",而是:

当前文本里经常出现,但在其他文本里不那么常见的词。

换句话说,TF-IDF真正看重的是:

高频,但不泛滥。

  1. 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是不够的。

  1. 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要表达的不是"这个词在当前文章里重要不重要",而是:

这个词在所有文章中是不是足够少见。

  1. 为什么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篇文章里就出现一次,说明它很普通;如果一个词平均几百篇文章里才出现一次,说明它很特殊。越特殊的词,越有可能帮助我们识别文章主题。

  1. 为什么还要取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 压缩极端差距。

  1. 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能找出主题词的原因。

  1. 一个完整例子

假设有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能把"情况、问题、相关、发展"这类普通词压下去,把更有区分度的主题词提上来。

  1. 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负责把文本变成向量;

余弦相似度负责比较两个文本向量是否相近。

  1. TF-IDF适合做什么?

TF-IDF适合做文本检索、候选召回、主题相似度初筛。

比如:

用户输入一段标题;

系统从历史文章中找出标题相近的文章。

或者:

输入一个文档;

系统找出可能相关的历史文档。

它很适合做第一轮筛选。

但它不一定适合做最终判断。

因为TF-IDF主要看词的重要性和文本相似度,它不理解复杂业务口径。两个标题相似,不代表内容完全一样;两个字段名字很像,也可能业务含义完全不同。

所以在实际应用里,TF-IDF更像一个"候选召回器"。

它先帮我们从大量文本中找出可能相关的一批候选结果,后面再通过更精细的规则、字段比对、语义判断或人工审核,确认是否真的相同。

  1. 一句话总结

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不是玄学,它本质上是一种很朴素的统计思想:

高频但不泛滥的词,才更有区分度。

相关推荐
m沐沐8 天前
【机器学习】NLP---用 Python+TF-IDF 给《红楼梦》自动提取关键词
人工智能·python·机器学习·自然语言处理·nlp·中文分词·tf-idf
不会计算机的g_c__b14 天前
基于酒店文本描述的相似酒店推荐系统:从TF-IDF到余弦相似度实战
tf-idf
人工干智能2 个月前
科普:CountVectorizer、TF、TF-IDF,三者层层递进
python·tf-idf
琪伦的工具库2 个月前
本地文档批量统计词权
tf-idf
阿钱真强道2 个月前
37 Python 时序和文本:词袋模型 BoW 和 TF-IDF 到底怎么理解?
python·nlp·tf-idf·文本向量化·词袋模型·bow
Dway2 个月前
TF-IDF
tf-idf
我材不敲代码3 个月前
Python 实战——红楼梦文本分析全流程:从分卷处理到分词再到TF-IDF 提取核心关键词
人工智能·自然语言处理·tf-idf
光羽隹衡5 个月前
机器学习——TF-IDF实战(红楼梦数据处理)
python·tf-idf
囊中之锥.5 个月前
从分词到词云:基于 TF-IDF 的中文关键词提取实践
前端·tf-idf·easyui