《一文吃透 TF-IDF:原理、公式推导、手算例子与 Python 实战》

目录

背景:

核心定义

1. 为什么要 TF-IDF?

2. TF(Term Frequency)是什么?

定义

举例

3. IDF(Inverse Document Frequency)是什么?

定义

直觉

平滑版(更常用)

4. TF-IDF 合起来是什么?

5. 手算一个完整例子(你会彻底懂)

Step 1:统计 N

Step 2:计算 df

Step 3:算 IDF(用简单版 log(N/df))

Step 4:算 TF(以 D3 为例)

Step 5:算 TF-IDF

6. TF-IDF 的核心本质

7. TF-IDF 常见坑(必须掌握)

1)分词很重要(中文必须先分词)

2)停用词(stopwords)要过滤

3)TF 不是简单次数

4)TF-IDF 不理解语义

8.简答题

9. “练习题”

10. Python 实战:sklearn 快速上手

结语:TF-IDF 是传统 NLP 的基石


背景:

当我们处理文本任务时,经常会遇到一个核心问题:

计算机如何理解一段文字?

机器并不懂“语言”,它只能理解“数字”。所以无论是做:

  • 文本分类(垃圾邮件识别)
  • 搜索引擎(输入关键词找文章)
  • 文本相似度(两段文本是否像)
  • 关键词抽取(自动生成文章标签)
  • 推荐系统(找相似内容)

都绕不开一个关键步骤:

把文本转成可用于计算的数字特征(向量)。

而在传统 NLP 中,最经典、最稳定、最常用的特征工程方法之一,就是 TF-IDF

它不用深度学习,也不需要训练模型,却能用统计方式给每个词赋予一个“重要性评分”,从而帮助我们提取关键词、计算相似度、构建检索系统,是理解 NLP 的一个经典起点。

核心定义

TF-IDF 是一种衡量“某个词对某篇文章有多重要”的方法。

  • 如果一个词在某篇文章里出现很多次(说明这篇文章在强调它)→ TF 高
  • 如果这个词在所有文章里到处都有(比如“的”“是”“我们”)→ 说明它不稀有、不具区分度 → IDF 低
  • 反之,一个词在很多文章里都不出现,却在某篇里出现 → 说明它很能代表这篇文章 → IDF 高

所以:

TF-IDF = 词在文档中出现得多(TF) × 词在全体文档中越稀有越重要(IDF)

1. 为什么要 TF-IDF?

我们在做:

  • 关键词抽取
  • 文本分类
  • 相似度计算
  • 搜索引擎(最经典应用)
  • 文本向量化(传统 NLP 的基本操作)

时,都需要把文字变成数值特征,而 TF-IDF 就是一种经典的“词重要性”数值化方法


2. TF(Term Frequency)是什么?

定义

词频:某个词在一篇文档里出现的频率。

最常见形式:

TF(t,d) = \frac{\operatorname{count}(t,d)}{\sum_{w \in d} \operatorname{count}(w, d)}

意思就是:

词 t 在文档 d 的出现次数 / 文档总词数

举例

文档 d: "我 爱 北京 北京 天安门"

  • “北京”出现 2 次
  • 总词数 5

TF(北京,d)=2/5=0.4

3. IDF(Inverse Document Frequency)是什么?

定义

词的逆文档频率:某个词在整个语料库中出现得越少,它越能区分文档 → 越重要。

最常见形式:

IDF(t) = \log\left( \frac{N}{df(t)} \right)
  • N:语料库中文档数量
  • df(t):包含词 t 的文档数量(Document Frequency)

直觉

  • 如果所有文章都有“我们”,那它无法区分文章 → IDF 低
  • 如果只有少数文章有“量子计算”,它能强烈区分文章 → IDF 高

平滑版(更常用)

为了避免某个词从不出现导致除零:

IDF(t) = \log\left( \frac{N + 1}{df(t) + 1} \right) + 1

4. TF-IDF 合起来是什么?

TFIDF(t,d)=TF(t,d)×IDF(t)

一个词在文档里出现多(TF)且在全库里稀有(IDF) → TFIDF 高 → 关键词


5. 手算一个完整例子(你会彻底懂)

我们有 3 篇文档:

  • D1:"我 爱 北京"
  • D2:"我 爱 上海"
  • D3:"我 爱 北京 北京"

Step 1:统计 N

N = 3

Step 2:计算 df

出现在哪些文档df
D1 D2 D33
D1 D2 D33
北京D1 D32
上海D21

Step 3:算 IDF(用简单版 log(N/df))

IDF(我)=log⁡(3/3)=0

IDF(爱)=0

IDF(北京)=log(3/2)=0.176

IDF(上海)=log⁡(3/1)=1.099

Step 4:算 TF(以 D3 为例)

D3 = "我 爱 北京 北京" 总词 4

  • TF(北京, D3)=2/4=0.5

Step 5:算 TF-IDF

TFIDF(北京,D3)=0.5×0.176=0.088

在 D2:

TFIDF(上海,D2)=0.333×1.099=0.366

上海比北京更能代表 D2,因为它更稀有。


6. TF-IDF 的核心本质

它不是“词有多重要”,而是“词能不能代表这一篇,并能和其他文章区别开”。

所以:

  • “的”“是”“我们”这些词 TF 高,但 IDF 近似 0 → TF-IDF 低
  • “上海”“量子计算”这些词 TF 可能不高,但 IDF 很高 → TF-IDF 可能很高

7. TF-IDF 常见坑(必须掌握)

1)分词很重要(中文必须先分词)

TF-IDF 是基于“词”的,中文必须先分词。

一般做法:

  • jieba 分词后再喂给 TfidfVectorizer(tokenizer=...)

2)停用词(stopwords)要过滤

比如:的、是、在、了、我、你

否则这些词大量出现导致向量质量很差。

3)TF 不是简单次数

有些版本会用:

  • log(1 + count)
  • 或者归一化,避免长文档占优势

4)TF-IDF 不理解语义

它只看“词统计”,不懂:

  • 同义词(北京/京城)
  • 上下文语义
  • 多义词

所以它适合:
关键词/检索/文本相似度
不适合:
深层语义理解(需要 BERT 这类模型)


8.简答题

你应该能回答这三个问题:

  1. 为什么单用 TF 不够?
    因为高频词可能是全库共用词,不具有区分性,需要 IDF 抑制。
  2. 为什么单用 IDF 不够?
    因为一个词虽然稀有,但若在该文档没出现(TF=0)也没意义。
  3. TF-IDF 的思想是什么?
    “在某篇文档高频 + 在全库稀有” 才代表该文档。

9. “练习题”

我们有 4 篇文档:

  • D1:"猫 喜欢 吃 鱼"
  • D2:"狗 喜欢 吃 肉"
  • D3:"猫 喜欢 睡觉"
  • D4:"狗 喜欢 睡觉"

问题:
1)哪个词在整个语料库里 IDF 最大?
2)D1 的关键词可能是什么?(按 TF-IDF 最大判断)
3)为什么“喜欢”一定 TF 很高但 TF-IDF 很低?

10. Python 实战:sklearn 快速上手

from sklearn.feature_extraction.text import TfidfVectorizer docs = [     "我 爱 北京",     "我 爱 上海",     "我 爱 北京 北京" ] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(docs) print(vectorizer.get_feature_names_out()) print(X.toarray())

输出:

  • 第一行:词表(所有词)
  • 第二行:每篇文档的 TF-IDF 向量

结语:TF-IDF 是传统 NLP 的基石

虽然深度学习现在很强,但 TF-IDF 仍然在很多场景里依然实用:

  • 工程上快速实现关键词和召回
  • 数据量小但需要可解释性
  • 构建搜索系统的 baseline

它是最经典、最耐用的 NLP 基础工具之一。掌握它,就掌握了传统文本特征工程的核心。

Read more

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)

2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操) 如果你最近登录 GitHub 时被提示“启用双因素身份验证(2FA)”,别慌——这就是在你输入密码后,再增加一道“动态验证码”的安全锁。本文用TOTP.app(可下载/可在线) 带你从 0 到 1 完成 GitHub 的 2FA 配置,全程保留原图与链接,按步骤照做就能成功。 关键词:GitHub 2FA、GitHub 双因素身份验证、GitHub 启用 2FA、GitHub TOTP、GitHub 动态验证码、GitHub 账号安全、GitHub 登录保护、

By Ne0inhk
GitHub 热榜项目 - 日榜(2026-1-10)

GitHub 热榜项目 - 日榜(2026-1-10)

GitHub 热榜项目 - 日榜(2026-1-10) 生成于:2026-1-10 统计摘要 共发现热门项目: 12 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜显示AI智能体开发工具正席卷开发者社区,Claude Code、opencode等项目通过自然语言交互极大提升编码效率,Chrome DevTools MCP和UI-TARS-desktop则推动多模态智能体与开发工具深度集成,同时TailwindCSS持续领跑前端工具链,NetBird提供现代化安全网络方案,反映出开发者正积极采用AI助手优化工作流,并重点关注智能体工具链集成、实用型开发工具及基础设施安全三大趋势,这些高质量开源方案切实提升了开发体验与工程效率。 1. ChromeDevTools/chrome-devtools-mcp * 🏷️ 项目名称:ChromeDevTools/chrome-devtools-mcp * 🔗 项目地址: https://github.com/ChromeDevTools/chrome-devtools-mcp * ⭐ 当前 Star 数:

By Ne0inhk

飞书机器人通知:任务完成自动推送消息提醒用户查收结果

飞书机器人通知:任务完成自动推送消息提醒用户查收结果 在档案馆管理员老李的日常工作中,有一项重复而繁琐的任务——接收家属寄来的黑白老照片扫描件,手动上传到修复工具,等待几十分钟处理完成后,再逐一截图回复:“您的照片已修复,请查收。”这样的流程不仅效率低下,还容易因遗忘或延迟导致用户体验下降。直到他所在单位接入了一个新系统:照片一上传,AI自动修复着色,完成后飞书机器人立刻弹出一条带预览链接的消息:“【老照片修复完成】您提交的照片已成功上色!”整个过程无需人工干预。 这背后并非魔法,而是DDColor图像着色模型 + ComfyUI可视化工作流 + 飞书机器人自动化通知三者协同构建的一套“智能处理—状态感知—即时反馈”闭环系统的落地实践。这套方案正悄然改变着AI应用的传统交互模式。 从“无感运行”到“主动告知”:为什么需要自动化通知? 当前大多数AI图像处理系统仍停留在“执行即结束”的阶段。用户点击“开始”,然后盯着进度条猜测何时完成;或者干脆切换窗口去做别的事,结果忘了回来查看输出文件夹。这种被动式交互极大削弱了AI本应带来的便捷性。 更深层次的问题在于,当多个任务并行时,缺

By Ne0inhk

本地使用ComfyUI运行Stable Diffusion 3.5

本地使用 ComfyUI 运行 Stable Diffusion 3.5-FP8 你有没有试过用一张消费级显卡,在不到两分钟内生成一张细节拉满的 1024×1024 分辨率图像?现在,这已经不是幻想。随着 Stable Diffusion 3.5-FP8 的发布,开源文生图模型正式迈入“高效推理”时代——不仅画质不输原版,速度更快、显存更省,甚至能在 RTX 3060 上流畅跑起来。 而搭配 ComfyUI 这个高度模块化的前端工具,整个部署过程变得异常轻量且可控。本文将带你从零开始,一步步在本地搭建这套高性能量化系统,并避开国内用户最头疼的网络和路径问题。 硬件要求没你想的那么高 很多人一听到 SD3.5 就下意识觉得“得上专业卡”,其实那是针对未量化的大模型版本。FP8 版本通过 8-bit 浮点精度压缩,大幅降低了计算负载和内存占用。 实测表明:

By Ne0inhk