中文分词与停用词:让模型先读懂文本边界

理解中文分词为什么重要,停用词应该怎么用,以及在文本分类项目里如何把句子切成可建模的词。

学习路线:文本分类项目(35~42) · 第 36 课
第 36 课一段中文句子被切分成词语,再过滤掉停用词,留下更适合建模的关键词。
Learning Path

文本分类项目(35~42)

重新拆解中文文本分类链路,从编码清洗、分词、向量化、评估、保存一路做到演示页面。

学完本阶段你能做到:从一份原始中文文本出发,独立完成清洗、分词、向量化、训练、评估、保存和演示页面,并能解释每个环节为什么这么做。

推荐读法:如果已经吃透第 19-20 课,可按薄弱环节跳读;否则建议顺序阅读。

查看完整阶段 · 8 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「中文分词与停用词:让模型先读懂文本边界」解决的核心问题
  • 知道它在「文本分类项目(35~42)」中的位置
  • 把 分类与回归、机器学习、监督学习 这些关键词联系起来

前置知识

  • 建议先读完上一篇:计算机怎样读取中文文本:编码、清洗与标准化
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。
  • 【监督学习】如果训练数据里有“题目”和“答案”,模型学会以后再给它新题目,它就尝试给出答案。 前面或后面会反复用到它。
  • 【TF-IDF】TF-IDF 会降低到处都出现的常见词权重,提高更能代表文本主题的词。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要把概念孤立背下来,要放回数据到结果的完整链路里。

课后练习

  • 用 3 句话向一个零基础朋友解释「中文分词与停用词:让模型先读懂文本边界」。
  • 打开概念库里的「分类与回归」,补一遍它和本文的关系。
  • 读下一课「词袋模型与 CountVectorizer:文本也可以做特征表」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 这个环节的输入和输出分别是什么?

项目文要先说清数据流。输入通常是原始数据或上一步结果,输出必须能被下一步稳定复用。

2. 如果训练和预测效果对不上,优先排查哪件事?

优先排查预处理是否一致,例如分词、TF-IDF 词表、标签映射、标准化器是否沿用训练阶段的同一套对象。

3. 为什么项目文章不能只看最终分数?

因为真实项目还要看数据质量、错误样本、部署入口、复用方式和失败边界。

下一步建议读「词袋模型与 CountVectorizer:文本也可以做特征表」。

上一课我们把中文文本分类项目的数据流讲清楚了。现在进入第一步真正的文本处理:中文分词

英文句子天然有空格,例如:

machine learning is useful

中文句子没有天然空格:

机器学习很有用

模型不能直接理解“这一整串字”里哪些部分是词。分词的作用就是先把句子切成更有意义的单位。

第 36 课视频 · 中文分词与停用词:让模型先读懂文本边界

什么是分词

分词就是把句子切成词。

例如:

我喜欢机器学习

可以切成:

我 / 喜欢 / 机器学习

也可能切成:

我 / 喜欢 / 机器 / 学习

这两个结果都不是完全离谱,但对模型来说含义不一样。如果“机器学习”是一个整体概念,把它切开可能会损失信息。

为什么中文分词难

中文分词难在三个地方。

第一,词边界不明显。中文没有空格,模型不知道哪里该断。

第二,存在歧义。比如:

南京市长江大桥

可以理解成“南京市 / 长江大桥”,也可能被错误切成“南京 / 市长 / 江大桥”。

第三,领域词很多。比如 AI 学习笔记里会有:

随机森林 / 交叉验证 / 梯度下降 / 文本分类

通用分词工具不一定知道这些词应该连在一起。

常用工具:jieba

入门阶段可以先用 jieba

import jieba

text = "我正在学习中文文本分类"
words = jieba.lcut(text)
print(words)

可能得到:

["我", "正在", "学习", "中文", "文本", "分类"]

jieba.lcut 会直接返回一个列表,后面可以继续做停用词过滤、词频统计、TF-IDF 特征提取。

自定义词典很重要

如果项目里有很多领域词,最好加自定义词。

jieba.add_word("随机森林")
jieba.add_word("交叉验证")
jieba.add_word("文本分类")

这样可以减少被错误切开的情况。

例如:

jieba.lcut("随机森林适合做文本分类吗")

更希望得到:

["随机森林", "适合", "做", "文本分类", "吗"]

而不是把重要概念拆得太碎。

什么是停用词

停用词是指在很多文本里频繁出现,但对分类帮助不大的词。

常见例子:

的、了、是、在、和、也、就、都、吗、吧

如果我们要判断文本主题,这些词往往贡献很小。把它们去掉,可以让特征更集中。

例如:

这个功能真的很好用

分词后:

这个 / 功能 / 真的 / 很 / 好用

去掉停用词后可能变成:

功能 / 好用

模型更容易抓住重点。

停用词不能乱删

停用词不是越多越好。有些词在某些任务里很重要。

比如情感分类中:

不好用

如果把“不”删掉,只剩下“好用”,意思就完全反了。

再比如:

没有收到验证码

“没有”对分类非常关键,不能轻易删除。

所以停用词表要根据任务调整。通用停用词表只能作为起点,不能直接无脑使用。

一个简单的处理函数

可以先写一个简单版本:

import jieba

stopwords = {"的", "了", "是", "在", "和", "也"}

def tokenize(text):
    words = jieba.lcut(text)
    words = [w.strip() for w in words if w.strip()]
    words = [w for w in words if w not in stopwords]
    return words

print(tokenize("这个功能真的很好用"))

这个函数做了三件事:

  1. 分词;
  2. 去掉空字符串;
  3. 去掉停用词。

后面做 TF-IDF 时,就可以把它接入特征提取流程。

分词结果要抽样检查

分词不是写完代码就结束。你需要抽样看结果。

重点检查:

检查点 说明
领域词有没有被切开 比如“交叉验证”“文本分类”
否定词有没有被误删 比如“不”“没有”“无法”
无意义符号有没有保留太多 比如表情、链接、乱码
单字词是否过多 过多单字可能让特征变稀碎

如果分词结果本身很差,后面的模型很难补救。

这一课先记住

中文分词解决的是“词边界”问题,停用词解决的是“无效高频词”问题。

但它们都不是固定答案。真正项目里要看数据、看任务、看错分样本,再决定怎么切、怎么删、怎么保留。

下一课我们把分词后的文本变成数字:TF-IDF。

Discussion

留言讨论