· 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 的变体,可见其工业地位。

不过它有两个硬伤:

  1. 词频线性增长:一个词出现 100 次得分正好是出现 50 次的两倍,显然不合理;
  2. 不感知文档长度:长文档词多分高,但长不等于相关。

这两个问题分别由 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、倒排索引、稀疏检索乃至混合检索,都只是在这条延长线上继续走。

Share:

回看感悟累计回看 — 次

加载中…

Back to Blog

Related Posts

View All Posts »

搜索算法基石:从 TF-IDF 到 BM25 的演进之路

在搜广推系统中,搜索是最核心的能力之一。本文从信息检索的经典算法 TF-IDF 出发,深入剖析其原理与局限,再引出工业界广泛使用的 BM25 算法,探讨它如何优雅地解决 TF-IDF 的不足。

文本向量化演进:从 Word2Vec 到现代 Embedding 模型

文本向量化是搜索、推荐与 RAG 共同的地基。本文快速回顾 one-hot、TF-IDF、Word2Vec 等经典方案的思路与局限,重点拆解现代 Embedding 模型的三大支柱:BERT 上下文表示、Sentence-BERT 句向量专用化与对比学习训练范式,并盘点 BGE、GTE、E5、OpenAI text-embedding-3 等主流模型与 MRL、指令前缀等关键技术。

RRF 倒数排名融合:混合检索里的"排名仲裁者"

向量语义召回与 BM25 关键词召回的分数天然不可比,混合检索需要一个仲裁者。本文以混合检索为例讲解 RRF(Reciprocal Rank Fusion)算法的公式与 k 常数的数学直觉,并横向对比分数级融合、名次级融合与学习排序三类融合策略的取舍。