1403贝叶斯算法应用——文本分类
📌 一、 课程导入(5 分钟)
回顾与连接:
- 上节课学习了词向量(如何把文本变成数字)和贝叶斯分类器的数学形式。
- 今天的任务:在 Python 中让这一切真实运行起来。
展示“成品”: 课前运行一段完整的文本分类代码,当场演示:
- 输入一句中文文本(如“双十一全场五折”)。
- 模型实时输出分类结果(垃圾/正常)及对应的概率值。
核心疑问:
- 代码只有十几行,怎么做到的?
- 背后的原理是什么?
本节课结构:
- 中文分词(
jieba)—— 让计算机“认识”中文词 - 向量化(
CountVectorizer)—— 文本 → 数字矩阵 - 训练(
MultinomialNB)—— 统计概率 - 预测与评估 —— 看效果
- 👨🏫 教师活动:在 Jupyter Notebook 中实时演示完整的文本分类代码(使用预先准备的短信数据集);让学生现场“出题”输入任意文本,模型即时返回分类结果。
- 🧑🎓 学生活动:观察代码运行过程,记录关键步骤;尝试输入不同的测试文本(如“恭喜您中奖了”、“明天下午三点开会”),观察模型输出的变化。
用“代码演示 + 实时预测”建立直观感受,让学生先看到结果再学习原理,符合“结果导向”的学习规律。现场互动环节增强参与感。
📖 二、 解决问题过程(一):中文分词与文本预处理
1. 为什么中文需要分词?
- 英文天然有空格作为分隔符(如 “I love you” → [“I”, “love”, “you”])。
- 中文文本没有空格:“我爱中国” → 需要切分为 [“我”, “爱”, “中国”]。
- 分词工具:
jieba(结巴分词),最流行的 Python 中文分词库。
2. jieba 分词基础用法
3. 文本预处理的完整流程
| 步骤 | 操作 | 示例 |
|---|---|---|
| ① 原始文本 | 用户输入的原始字符串 | “双11全场5折!免费领取优惠券” |
| ② 中文分词 | 使用 jieba 切分 | [‘双11’, ‘全场’, ‘5折’, ‘免费’, ‘领取’, ‘优惠券’] |
| ③ 去停用词 | 去掉“的”、“了”、“是”等无意义词 | 本例无停用词,保留 |
| ④ 向量化 | 转为词频向量 | [1, 1, 1, 1, 1, 1, …](长度=词典大小) |
4. 停用词(Stop Words)
- 定义:在文本中高频出现但对分类没有实际贡献的词。
- 中文停用词示例:的、了、是、在、和、与、等。
- 作用:减少特征维度,提高模型效率和准确率。
- 👨🏫 教师活动:在 Jupyter 中逐行运行 jieba 的分词示例;展示一份常见中文停用词表;说明“去停用词”的必要性。
- 🧑🎓 学生活动:在自己的环境中安装 jieba(
pip install jieba),尝试切分不同的中文句子;观察不同分词模式(精确/全/搜索引擎)的输出差异。
中文分词是中文 NLP 特有的预处理步骤。通过 jieba 的三种模式对比,让学生理解“分词粒度”对后续建模的影响。停用词过滤的引入为后续向量化降维做铺垫。
💻 三、 解决问题过程(二):向量化与贝叶斯训练
1. 完整代码演示(使用 sklearn 内置数据集)
2. 代码解析
| 步骤 | 关键代码 | 作用 |
|---|---|---|
| 分词 | jieba.lcut(text) → ' '.join() |
将中文切词后拼成空格分隔的字符串(sklearn 要求) |
| 向量化 | CountVectorizer().fit_transform() |
构建词典并生成词频矩阵 |
| 训练 | MultinomialNB(alpha=1.0).fit() |
统计每个类别下每个词的条件概率(拉普拉斯平滑) |
| 预测 | model.predict() + predict_proba() |
输出类别和各类别概率 |
3. 拉普拉斯平滑(Laplace Smoothing)
- 问题:如果测试集中出现了一个在训练集中从未见过的词,P(词|类别) = 0,导致整个后验概率为 0。
- 解决方案:在分子上加 α(通常为 1),分母上加 α × 词典大小。
- 公式:P(词_i|C) = (count(词_i, C) + α) / (total_words_C + α × V)
- 效果:避免零概率,让模型对未知词更“宽容”。
- 👨🏫 教师活动:逐行运行代码,在每个关键步骤后暂停并解释输出;展示
X_train_vec.toarray()的稀疏矩阵内容,让学生看到实际的数字表示。 - 🧑🎓 学生活动:在本地复现代码;尝试修改训练数据(增加/删减样本),观察准确率的变化;测试自己的新文本(如“今晚一起吃饭吧”),查看模型预测结果。
通过完整可运行的代码,将前两次课的所有理论概念(先验、条件概率、词向量、贝叶斯公式)一次性“兑现”为实际工作流程。让学生体验“理论→代码→结果”的完整闭环。
✍️ 四、 解决问题过程(三):实战任务——垃圾分类器
📝 五、 课堂小结(5 分钟)
flowchart LR
root["💻 贝叶斯文本分类(第三次课)"]
subgraph C1["🔧 文本预处理"]
direction TB
A1["jieba 中文分词"]
A2["去停用词(可选)"]
end
subgraph C2["📊 向量化"]
direction TB
B1["CountVectorizer"]
B2["文本 → 词频矩阵"]
end
subgraph C3["🧮 模型训练"]
direction TB
C1_node["MultinomialNB"]
C2_node["统计 P(词|类别) + 拉普拉斯平滑"]
end
subgraph C4["📈 评估与预测"]
direction TB
D1["predict / predict_proba"]
D2["准确率 / 分类报告"]
end
root --> C1
root --> C2
root --> C3
root --> C4
style root fill:#2e7d32,stroke:#1b5e20,color:#fff,stroke-width:2px,rx:8px,ry:8px
style C1 fill:#e3f2fd,stroke:#1e88e5,stroke-width:1px
style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
style C3 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px
style C4 fill:#e8f5e9,stroke:#43a047,stroke-width:1px
✏️ 随堂检测与互动练习
📮 六、 课后作业与拓展
📋 七、 板书设计
本课用到的单词
| 英文术语 | 发音(美式) | 中文释义 | 专业语境解释 |
|---|---|---|---|
| Tokenization | /ˌtoʊ.kə.naɪˈzeɪ.ʃən/ | 分词 | 将连续文本切分为独立的词单元(Token)的过程。 |
| Count Vectorizer | /kaʊnt ˈvek.tə.raɪ.zər/ | 计数向量化器 | Scikit-learn 中将文本转为词频矩阵的工具。 |
| Sparse Matrix | /spɑːrs ˈmeɪ.trɪks/ | 稀疏矩阵 | 大部分元素为 0 的矩阵,用于高效存储词频数据。 |
| Multinomial NB | /ˌmʌl.tiˈnoʊ.mi.əl ˌnaɪvˈbeɪz/ | 多项式朴素贝叶斯 | 适用于离散特征(如词频)的朴素贝叶斯变体。 |
| Laplace Smoothing | /ləˈplɑːs ˈsmuː.ðɪŋ/ | 拉普拉斯平滑 | 在概率估计中附加伪计数,避免零概率问题的技术。 |
| Pipeline | /ˈpaɪ.pˌlaɪn/ | 管道 | 将多个数据处理步骤串联为一个整体的工作流。 |
| Stop Words | /stɑːp wɜːrdz/ | 停用词 | 在文本分析中无信息量的高频词,通常在预处理时移除。 |