TF-IDF关键词提取原理与代码实践
1. 什么是TF-IDF
TF-IDF(Term Frequency - Inverse Document Frequency)是一种用于文本关键词提取和信息检索的统计方法。它评估一个词语对于一个文档集或语料库中某个文档的重要程度。

1.1 核心思想
- • 词频(TF):一个词语在当前文档中出现的频率越高,越重要
- • 逆文档频率(IDF):一个词语在越少文档中出现,越独特,越重要
最终得分 = TF × IDF
2. TF(词频)原理
2.1 计算公式
2.2 示例说明
假设文档D:「苹果手机维修服务,提供屏幕更换、电池更换、主板维修与进水处理」
jieba分词后得到词语:苹果、手机、维修、服务、屏幕、更换、电池、主板、进水、处理(共12个词)

2.3 TF的问题
如果只使用TF,会导致常见词(如:「的」「了」「是」)排名最高,无法有效提取关键词。
3. IDF(逆文档频率)原理
3.1 计算公式
3.2 示例说明
假设语料库有100个文档:

3.3 IDF的作用
4. TF-IDF综合计算
4.1 最终公式
4.2 组合效果

5. 代码实现
5.1 完整代码
# encoding=utf-8import jiebaimport numpy as npfrom sklearn.feature_extraction.text import TfidfVectorizerdoc = "苹果手机维修服务,提供屏幕更换、电池更换、主板维修与进水处理"top_k = 5# 设置取几个关键词tok = lambda s: [w for w in jieba.lcut(s) iflen(w) > 1and w.strip()]v = TfidfVectorizer(tokenizer=tok, token_pattern=None)X = v.fit_transform([doc]) # 如果有多篇文档,就用docs列表替换[doc]即可vocab = v.get_feature_names_out()# 提取TF(scikit-learn的TfidfVectorizer默认是词频/文档长度)tf = (X > 0).astype(int).toarray()[0] * 0# 先占位term_counts = np.array(X.toarray()[0]) / v.idf_ # TF(因为TF-IDF / IDF = TF)tf = term_counts / term_counts.sum() # 归一化后就是TFidf = v.idf_ # 每个词的IDFtfidf = X.toarray()[0]# 取权重最高的top_kidx = tfidf.argsort()[::-1][:top_k]for i in idx:print(f"{vocab[i]}\tTF: {tf[i]:.3f}\tIDF: {idf[i]:.3f}\tTF-IDF: {tfidf[i]:.3f}")
5.2 代码流程图

5.3 关键函数说明
| |
jieba.lcut() | |
TfidfVectorizer | |
tokenizer | |
fit_transform() | |
get_feature_names_out() | |
argsort()[::-1] | |
6. 运行结果
6.1 示例输出
更换 TF: 0.167 IDF: 1.000 TF-IDF: 0.535进水 TF: 0.083 IDF: 1.000 TF-IDF: 0.267苹果 TF: 0.083 IDF: 1.000 TF-IDF: 0.267维修服务 TF: 0.083 IDF: 1.000 TF-IDF: 0.267维修 TF: 0.083 IDF: 1.000 TF-IDF: 0.267
注意: 当只有单个文档时,所有词的IDF值都是1.0(因为log(1/1)=0,sklearn添加了平滑项)。要看到IDF的区分作用,需要多个文档。在实际应用中,通常会使用多个文档的语料库来计算IDF。
6.2 结果可视化

7. 应用场景
7.1 典型应用
7.2 优缺点分析
优点:
缺点:
8. TF-IDF与词嵌入对比

9. 扩展:多文档TF-IDF
为什么要用多文档?
当只有一个文档时,所有词的IDF值都相同(log(1/1)=0,加平滑项后=1),此时TF-IDF完全由TF决定。只有在多个文档的情况下,才能看到IDF的真正区分作用。
多文档示例:
# 多文档示例docs = ["苹果手机维修服务","屏幕更换主板维修","电池更换进水处理","手机屏幕维修","屏幕更换服务"]v = TfidfVectorizer(tokenizer=tok, token_pattern=None)X = v.fit_transform(docs)# 查看第一个文档的TF-IDF向量tfidf_vector = X.toarray()[0]vocab = v.get_feature_names() ifhasattr(v, 'get_feature_names') else v.get_feature_names_out()# 输出结果for word, score inzip(vocab, tfidf_vector):if score > 0:print(f"{word}: {score:.3f}")print(f"TF-IDF矩阵形状: {X.shape}")
应用场景:
10. 总结
10.1 核心要点
- 4. TF-IDF综合两者,提取真正有区分度的关键词
10.2 学习路线
基础阶段 → 应用阶段 → 进阶阶段 ↓ ↓ ↓理解原理 关键词提取 结合深度学习代码实现 搜索引擎 词向量对比
10.3 参考资料