Tokenization 概述:给文本“分块”的艺术
各位好,今天我们聊聊 NLP 里最基础、也最容易被忽视的一步——tokenization。说白了,就是给文本“分块”。
你想想看,计算机不认识“我爱北京天安门”这句话。它只懂 0 和 1。我们得想办法把人类语言转化成它吃得下的数字。这个过程,第一步就是 tokenization。
什么是 Tokenization?
Tokenization,就是把一段文本拆成一个个小单元()的过程。这些单元可以是单词、子词,甚至是单个字符。
举个例子,“tokenization is fun” 可以拆成:
- 单词级:["tokenization", "is", "fun"]
- 字符级:["t", "o", "k", "e", "n", "i", "z", "a", "t", "i", "o", "n", " ", "i", "s", " ", "f", "u", "n"]
- 子词级:["", "ization", "is", "fun"]
这几种方式差别很大。单词级最直观,但遇到“tokenization”变成“tokenization”和“tokenizing”就傻眼了——它们明明有关联,却被当成两个完全不同的词。
为什么需要 Tokenization?
没有 tokenization,模型根本没法工作。原因有几个:
- 数值化入口:计算机只能处理数字,tokenization 是文本到数字的第一道关卡。
- 处理未知词:现实数据里总有词典里没有的词。好的 tokenization 能通过子词组合来理解它。
- 降低维度:如果直接按单词表处理一个 10 万词的语料,向量空间会大到吓人。tokenization 能帮我们控制词汇表大小。
- 引入语言结构:拆的方式不同,模型学到的模式也不一样。比如“ing”结尾常表示进行时,拆成子词就能保留这种信号。
核心观点:Tokenization 决定了模型的“视野”。拆得太粗,细节丢失;拆得太细,上下文关联困难。找到合适的粒度,是调模型的第一步。
Tokenization 在 NLP 中的核心地位
我刚开始做 NLP 项目时,觉得 tokenization 只是预处理里一个不起眼的环节。后来踩了不少坑,才明白它有多关键。
举个例子。我在做一个中文情感分析时,直接按字切分。结果“好开心”和“好不开心”被模型当成了相似描述——因为“不”字被忽略了上下文。换上 BERT 用的 WordPiece tokenizer,效果立刻提升。
你们想想看,预训练模型(BERT、、T5)的核心组件是什么?——Tokenizer。模型的好坏,很大程度取决于 tokenizer 的设计。它定义了模型的输入空间。
目前主流方法可以分为三大类:
| 类型 | 代表方法 | 特点 |
|---|---|---|
| 单词级 | 按空格/标点切分 | 简单直接,词汇表大,OOV 问题严重 |
| 字符级 | 按字符切分 | 无 OOV,序列长,难以捕获语义 |
| 子词级 | BPE, WordPiece, Unigram, SentencePiece | 平衡词汇量与语义,是目前主流 |
小技巧:实际项目中,我建议优先使用子词级 tokenizer。特别是处理多语言或包含专业术语的数据时,它的鲁棒性明显更好。
从数据到模型:Tokenizer 的完整流程
下面这张图展示了 tokenizer 在整个 NLP 流程中的位置。它负责把原始文本变成模型能处理的数字序列。
从图里能清楚看到,无论下游任务多复杂,Tokenizer 都是必经的第一道关卡。我个人习惯在做项目时,先把 tokenizer 的各项参数调一遍,看看分词效果——这一步能省掉后面很多 debug 时间。
踩坑提醒:我曾经在一个多语言翻译任务中偷懒,直接用了英文的 tokenizer。结果中文句子全被当成 OOV 处理。后来换用 SentencePiece 统一训练一个子词词汇表,才解决了问题。所以,务必根据数据特点选择 tokenizer。
子词 Tokenization 的直观理解
我会用例子来加深理解。假设词汇表里有 “un”、“happy”、“ness”、“”、“ization” 这几个子词。
遇到新词 “unhappiness” 时:
- 单词级 tokenizer:不认识,标记为 [UNK]
- 子词级 tokenizer:拆成 [“un”, “happi”, “ness”] 或者 [“un”, “happy”, “ness”]
你看,子词 tokenizer 不仅没有丢失信息,还保留了词根和词缀的语义。这就是它能成为主流的根本原因。
小结
Tokenization 远不止是简单切词。它是连接人类语言和机器理解的桥梁。选对 tokenizer,模型就成功了一半。
接下来的章节,我们会逐一深入子词 tokenization 的几种代表方法:BPE、WordPiece、Unigram 和 SentencePiece。到时候结合代码,你们会更清楚它们的区别和适用场景。