deep-dive · 系统性解析(定位:Python 文本基础 的「聚焦版」——那篇讲全链路
字符串→编码→正则→归一化→分词→N-gram;本篇把其中对建模最关键的「清洗 / 分词 / 去停用词」单独拎出来,并以**「去停用词」**为新增重点,串成一条可开关的标准预处理流水线)
一句话:模型吃的是「干净、离散、低噪声」的 token 序列。文本预处理三件套——① 清洗(消噪声)→ ② 分词(切单元)→ ③ 去停用词(消高频虚词)——就是数据进模型前必过的三道关。本篇每站配可交互演示(见同名 HTML 版)与可直接抄的 Python 代码,并给出「什么任务该去 / 不该去」的决策表。读完你能独立拼一条可配置的中文 / 英文预处理流水线。
目录
- 0 · 导读:三件套流水线
- 1 · 为什么要做文本预处理
- 2 · 清洗 Cleaning:把噪声消掉
- 3 · 分词 Tokenization:把文本切成单元
- 4 · 去停用词 Stopwords:把高频虚词消掉(重点)
- 5 · 一条标准预处理流水线(端到端)
- 6 · 什么时候该去 / 不该去(决策表)
- 7 · 自查清单与系列导航
0 · 导读:三件套流水线
无论后面做文本分类、情感分析还是大模型微调,原始文本都不能直接喂。这三件套每一站都在回答:「这一站把什么不确定性 / 噪声消掉」。
原始文本 ──▶ ① 清洗 ──▶ ② 分词 ──▶ ③ 去停用词 ──▶ ④ (可选) N-gram / 词频
(含噪声) (消格式/标点 (切出离散 (消高频虚词 (统计共现 / 建词表)
/全半角/空白) token 单元) 无区分度词)
[核心洞见] 清洗、分词、去停用词是三个正交动作:清洗处理「字符层面的脏」,分词处理「单元的边界」,去停用词处理「单元层面的冗余」。三者顺序基本固定(先清洗再分词,分词后再去停用词——因为停用词是按「词」判断的,没切词就没法去)。顺序错了,后面全错。
自测 0.1 对一句「The 猫,吃了【鱼】!🐱」,预判它依次要过哪几关:全角→半角?去标点?分词?去停用词?哪一步若跳过会让结果变差?
1 · 为什么要做文本预处理
模型输入是「离散符号序列 + 向量」,不是一段原始字符串。原始文本里混着大量模型不需要、甚至有害的东西:
| 噪声 / 冗余类型 | 例子 | 危害 |
|---|---|---|
| 编码不一致 | UTF-8 / GBK 混用、\ufffd 乱码 |
解码报错或字符错乱 |
| 格式符号 | HTML 标签、Markdown、\n\t |
污染 token,虚高词表 |
| 标点 / 表情 | ,。!🐱 |
对很多任务是无信息噪声 |
| 全半角 / 大小写 | AI vs AI、Hello vs hello |
同一词被当两个词 |
| 词的边界不清 | 中文无空格、英文缩写 | 切不出正确单元 |
| 高频虚词 | 的 / 了 / the / and | 挤占统计权重、稀释信号 |
[中文 vs 英文差异] 英文天然有空格「大概」分隔词,难点在缩写、连字符;中文完全没有词边界,必须靠词典或模型切分——所以中文预处理里「分词」是硬门槛,英文则可以先用空格 + 正则将就。去停用词对两者都重要,但中文停用词表需要自己维护(见 §4)。
自测 1.1 为什么「大小写不统一」会让词表凭空翻倍?举一个你手机里因大小写 / 全半角导致「同一个东西被当成两个」的例子。
2 · 清洗 Cleaning:把噪声消掉
清洗目标:让「同一个意思」在字符层面长一样,并去掉无贡献的符号。四步最常用:
| 步骤 | 目的 | Python |
|---|---|---|
| Unicode 归一化 | 全角→半角、兼容等价合并 | unicodedata.normalize("NFKC", s) |
| 转小写 | 合并英文大小写 | s.lower() |
| 去标点 / 噪声 | 清 HTML / URL / emoji / 标点 | re.sub(r"[^\w\s一-龥]"," ",s) |
| 折叠空白 | 多空格→一个、去首尾 | re.sub(r"\s+"," ",s).strip() |
[NFKC 是什么]
unicodedata.normalize("NFKC", s)把全角字母数字、全角标点、上下标等「兼容等价」地转成半角标准形式。处理中文网页 / PDF 文本时几乎必做,否则「AI」和「AI」会被当成不同词。深度正则 / 编码机制见nlp-python-text-deep-dive§3–§4。
2.1 一个可开关的清洗函数
import re, unicodedata
def clean_text(s,
nfkc=True, lower=True, drop_punct=True, drop_nonzh=True, fold_ws=True):
if nfkc: s = unicodedata.normalize("NFKC", s) # 全角→半角
if lower: s = s.lower() # 小写
if drop_punct:
# 只保留:字母数字、空白、常用汉字(一-龥);其余清成空格
pat = r"[^\w\s一-龥]" if not drop_nonzh else r"[^\w\s]"
s = re

本文系统讲解NLP文本预处理核心三步:清洗(NFKC归一化、去噪)、分词(中文最大匹配/英文正则/subword粒度权衡)和去停用词(中英文词表、DF自动筛选及任务适配决策)。强调三步骤正交性与固定顺序,指出清洗消字符噪声、分词定单元边界、去停用词除语义冗余,并重点剖析去停用词在情感分析、检索、大模型等场景的适用性与风险,提供可开关、可配置的端到端流水线实现。
1145

被折叠的 条评论
为什么被折叠?



