· liyu · algorithm · 7 min read · — 次浏览
TF-IDF 原理与应用:搜索打分与文本向量化的起点
TF-IDF 用「词频 × 稀缺度」给词打分,是信息检索绕不开的经典。本文快速讲透它的核心原理,重点展开两大应用:搜索系统里的相关性打分,以及把文本变成稀疏向量后的分类、相似度与关键词提取。
一、原理:一句话讲透
TF-IDF(Term Frequency × Inverse Document Frequency)的核心思想一句话就能说完:
一个词对一篇文档的重要性 = 它在这篇文档里出现的频率 × 它在整个语料库里的稀缺程度。
拆成两个因子:
TF(词频)——这篇文档有多依赖这个词:
TF(t, d) = f(t, d) / |d|其中 f(t, d) 是词 t 在文档 d 中的出现次数,|d| 是文档总词数,用于消除长文档的天然优势。
IDF(逆文档频率)——这个词有多稀缺、多有区分度:
IDF(t) = log(N / dfₜ)其中 N 是语料库总文档数,dfₜ 是包含词 t 的文档数。「的、是、在」这类停用词篇篇出现,IDF 趋近 0;「TF-IDF」「倒排索引」这类术语只出现在少数文档,IDF 很高。
两者相乘,就得到词权重:
TF-IDF(t, d) = TF(t, d) × IDF(t, d)它最漂亮的性质在于:停用词被自动压到接近 0,稀有而关键的词自动胜出——不需要人工维护停用词表,加权规则自己完成了过滤。
二、应用一:搜索的相关性打分
TF-IDF 最经典的舞台是搜索引擎。它和倒排索引配合,构成早期搜索系统的完整骨架:
离线阶段:每篇文档分词 → 建立 倒排索引「词 → 文档列表」
在线阶段:
1. 查询分词,得到 q₁, q₂, ..., qₙ
2. 逐词查倒排表,快速取回候选文档(不用扫全库)
3. 对每篇候选文档打分:Score(Q, d) = Σᵢ TF-IDF(qᵢ, d)
4. 按分数倒序返回 Top-K打分直觉很好懂:查询词在文档里出现得越多(TF 高)、这个词本身越罕见(IDF 高),这篇文档就越可能是你要找的。Lucene——Elasticsearch 的内核——早期默认相似度正是 TF-IDF 的变体,可见其工业地位。
不过它有两个硬伤:
- 词频线性增长:一个词出现 100 次得分正好是出现 50 次的两倍,显然不合理;
- 不感知文档长度:长文档词多分高,但长不等于相关。
这两个问题分别由 BM25 的词频饱和与长度归一化修复,后者如今是 Elasticsearch 的默认排序算法。两者的演进细节,见我之前的文章《从 TF-IDF 到 BM25 的演进之路》。
三、应用二:文本向量化
换个视角,TF-IDF 还有更重要的身份:把一段非结构化文本变成一个可计算的向量。
做法很直接:设整个语料库的词表大小为 V,那么每篇文档就是一个 V 维向量,第 i 维等于词表第 i 个词在该文档中的 TF-IDF 权重——没出现的词为 0,所以它是典型的稀疏向量。
文本一旦变成向量,就能参与一切向量化的数学运算:
- 相似度计算:文档间算余弦相似度,用于查重、聚类、「相关文章推荐」;
- 文本分类:向量直接喂给朴素贝叶斯、逻辑回归、SVM,就是经典的垃圾邮件识别、内容审核方案;
- 关键词提取:取文档中 TF-IDF 权重最高的 Top-K 词,就是一个零训练成本的关键词提取器;
- 特征工程:在深度学习之前的时代,它几乎是所有 NLP 任务的标准输入特征。
用 scikit-learn 十行就能跑通:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
corpus = [
"TF-IDF 是经典的稀疏文本向量化方法",
"倒排索引配合 TF-IDF 完成搜索打分",
"今天天气不错适合出门散步",
]
vec = TfidfVectorizer()
X = vec.fit_transform(corpus) # 3 × V 的稀疏矩阵
# 文档 0 与文档 1 共享「tf-idf」,相似度应明显高于与文档 2 的
sim = cosine_similarity(X[0], X[1])[0][0]
print(f"文档 0 vs 文档 1 余弦相似度: {sim:.4f}")四、稀疏向量与稠密 Embedding 的分工
把 TF-IDF 向量和当下的稠密 Embedding 放在一起看,分工一目了然:
| 维度 | TF-IDF 稀疏向量 | 稠密 Embedding |
|---|---|---|
| 训练成本 | 零训练,纯统计 | 依赖预训练模型 |
| 可解释性 | 每一维对应一个具体的词 | 黑盒 |
| 语义泛化 | 无:「电脑」与「计算机」正交 | 强:近义词在向量空间相近 |
| 精确匹配 | 强:专有名词、型号、代码 | 弱:容易被语义平滑掉 |
所以现代检索系统很少二选一,而是两路并行:向量检索管语义泛化,BM25/TF-IDF 这类稀疏检索管精确命中,再用 RRF 融合两路结果——混合检索的仲裁逻辑我之前也写过。
五、小结
TF-IDF 的全部智慧就是一次乘法:词频管「这篇文档多依赖它」,逆文档频率管「它有多稀缺」。这次乘法在搜索里是相关性打分器,在 NLP 里是文本向量化的起点。理解了它,BM25、倒排索引、稀疏检索乃至混合检索,都只是在这条延长线上继续走。
回看感悟累计回看 — 次
加载中…