TF-IDF(Term Frequency–Inverse Document Frequency,词频–逆文档频率)是一个给词打分的公式:一个词在某篇文档里出现得越多、在整个语料库里出现得越少,它就越能代表这篇文档。
拆开看,其实是两把尺子
第一把尺子:词频(Term Frequency,TF),衡量"这个词在这篇文档里有多活跃"。最常见的归一化写法是:该词在文档中出现次数 ÷ 文档总词数。除以总词数是为了防止长文档天然占便宜——一万字的报告里"预算"出现 10 次,未必比一千字邮件里出现 3 次更关键。
第二把尺子:逆文档频率(Inverse Document Frequency,IDF),衡量"这个词在整个语料库里有多稀有"。经典写法是 log(总文档数 ÷ 包含该词的文档数)。一个词如果每篇文档都有,比值接近 1,IDF 接近 0,权重被压到几乎消失;只在少数文档里出现的词,IDF 就很大。
打个比方:公司年会上评选"最能代表某个部门的词"。某部门汇报里反复出现的词,说明这个部门确实常聊它(TF 高);但如果全公司每个部门都在说"降本增效",这个词就区分不出任何部门(IDF 低)。最后得分是两者相乘:既要在这个部门嗓门大,又要是别人不怎么提的词。
一个小例子
假设语料库只有三篇文档:文档 1 是"猫 猫 猫 粮",文档 2 是"狗 粮",文档 3 是"鱼 粮"。全库 3 篇,"粮"在三篇里都出现,df=3,IDF=log(3/3)=0,无论它在文档里出现几次,权重都归零;而"猫"只在一篇里出现,IDF 明显更大,于是"猫"成了文档 1 最有代表性的词。这正是 TF-IDF 能自动过滤"的、是、我们"这类高频虚词的原理——不需要人手工写停用词表,数学自己就把它们压下去了。
(现实中不同实现用的对数底数、归一化方式、平滑处理各不相同,具体数值不必较真,看的是排序结果。工程上以所用库的官方文档为准。)
和相邻概念的区别
| 方法 | 看什么 | 特点 |
|---|---|---|
| 词频 TF | 只看词在单篇文档里的次数 | 无法过滤全库高频词 |
| TF-IDF | 局部频率 × 全局稀有度 | 稀疏向量、字面匹配、可解释、无需训练 |
| BM25(Best Matching 25) | 在 TF-IDF 基础上加词频饱和与文档长度归一化 | 词出现 100 次不该是 10 次的 10 倍权重,配 k1、b 参数调节,是当今多数全文检索库的默认相关性打分思路 |
| 词向量 / embedding | 词的语义分布 | 稠密向量,能匹配同义词,但需要模型和算力 |
对从业者的意义
TF-IDF 是几乎所有搜索、推荐、文本挖掘系统的"出厂设置":关键词抽取、找相似文章、文本分类的基线模型、去重,第一版方案往往都是它。今天大家写 TfidfVectorizer 一行代码就调出来了,但真正踩坑时能救命的还是公式本身:搜索搜不到词,可能是它的 IDF 太低;某篇长文排名异常,可能是归一化策略不合适;同义词搜不出来,说明该上稠密向量了。
理解 TF-IDF 的另一个价值在于,它是 BM25 的老祖宗。搞懂"词频要打折、稀有词要加分"这两条直觉,再去调检索参数,就不是盲调了。
