经典文本预处理
在模型学会直接读原始文本之前,工程师靠手工清洗:切分、转小写、去停用词、把词还原到词干。
在一台机器能统计词频、或把词喂给模型之前,总得有人先决定「词」到底是什么。这个决定曾经是一整条手写规则组成的流水线,而弄懂它,也就解释了现代 tokenizer 为什么长成今天这样。
经典预处理只有一个目标:把凌乱的人类文本变成一份干净、统一、统计模型能处理的单位列表。每一步都在拿掉一些信息,换取剩下的部分更好统计。
切分:把文本拆成单位
第一步是把一个字符串切成 token。最朴素的做法按空白切:
"The cats aren't hungry." → ["The", "cats", "aren't", "hungry."]
问题一眼就能看出来。hungry. 带着一个句号。aren't 其实是两个意思,are 和 not。经典 tokenizer 只能一层层加规则:剥掉标点、拆开缩写、处理连字符。而每种语言破坏规则的方式都不一样。中文词与词之间根本没有空格,得单独配一套分词算法。
正是这种脆弱,让现代系统放弃了词级切分,转向子词切分——切分的单位从数据里学出来,而不是硬编码进去。
归一化:把变体合并
有了 token 之后,要让它们统一,这样只有细微拼写差别的形式就能算作同一个东西。
- 转小写。
The和the变成同一个 token。便宜,通常有用,但它抹掉了公司Apple和水果apple的区别。 - 去掉重音符号和标点。
café变成cafe。 - 处理数字。 常常把所有数字换成一个
<NUM>占位符,因为具体取值对主题分类来说很少有关系。
每一步归一化都会缩小词表,把相关的形式归到一起。它同时也丢掉了信息,而这笔交易值不值,完全取决于任务。情感分析可能不在乎大小写;代码搜索引擎在乎得要命。
去停用词
有些词无处不在,却几乎不携带主题信号:the、is、at、and、of。这些是停用词,经典流水线会照一张固定的清单把它们删掉。
"the cat sat on the mat" → ["cat", "sat", "mat"]
逻辑很实际。在词袋模型里,the 可能是每篇文档里出现最多的 token,把真正能区分文档的词给淹没了。删掉它能锐化信号,还能缩小数据。
但问题在于:停用词承载的东西比人们以为的多。「To be or not to be」几乎全是停用词。像 not 这样的否定词会彻底翻转含义,可很多停用词表把它删了。现代模型保留每一个 token,正是因为这些小词在做实实在在的语法工作。
词干提取与词形还原
run、running、ran 和 runs 是同一个意思的四件戏服。把它们当成四个不同的 token,等于把一个概念的证据拆散到四个计数里。有两种技术把它们合并起来。
词干提取用粗糙的规则砍掉词尾。1980 年的 Porter 词干提取器是经典之作。它快,而且笨:
running → run, studies → studi, argument → argument
注意 studi 不是一个真实的词。词干提取不在乎;它只需要一致性,让「study」的每一种形式都映射到同一个词干。
词形还原是讲究的那一版。它用词典和词性信息,把每个词映射到它真正的原形,也就是 lemma:
studies → study, better → good, was → be
词形还原更慢,需要语言学资源,但它产出的是真实的词,还能处理词干提取会弄坏的不规则形式。
为什么今天还值得了解
上面每一步,都是人在事先决定模型被允许看到哪些信息。这正是经典 NLP 的标志性特征:手工做特征工程。 预处理是领域专长安身的地方,一份更好的停用词表或词干提取器,能可测量地提升一个系统。
现代语言模型把这件事倒了过来。它们保留大小写、标点和停用词,因为模型自己会学哪些区别在哪些语境下重要。预处理坍缩成了唯一一个学出来的步骤:子词切分。过去十几条手工调校的规则,变成了一个数据驱动的算法。
理解那套旧流水线不是怀旧。它让你看清每一个设计选择当初是为了什么,于是当现代 tokenizer 把 The 和 the 区分开时,你清楚地知道它拒绝的是哪一条旧假设,以及为什么。
要点回顾
- 经典预处理通过一串手写规则,把原始文本变成干净、可计数的单位。
- 切分把文本拆开;归一化(转小写、剥标点)合并那些细微的变体。
- 去停用词删掉高频低信号的词,但有删掉
not这类有意义词的风险。 - 词干提取粗暴地砍词尾;词形还原映射到词典里的真正原形。
- 每一步都是拿信息换统一,而这笔交易取决于任务。现代模型基本放弃了这套做法,因为它们自己会学这些区别。
下一篇: 词袋模型与 N-gram——最早有人把这些清洗过的 token 变成数字的办法。