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,模型根本没法工作。原因有几个:

  1. 数值化入口:计算机只能处理数字,tokenization 是文本到数字的第一道关卡。
  2. 处理未知词:现实数据里总有词典里没有的词。好的 tokenization 能通过子词组合来理解它。
  3. 降低维度:如果直接按单词表处理一个 10 万词的语料,向量空间会大到吓人。tokenization 能帮我们控制词汇表大小。
  4. 引入语言结构:拆的方式不同,模型学到的模式也不一样。比如“ing”结尾常表示进行时,拆成子词就能保留这种信号。

核心观点:Tokenization 决定了模型的“视野”。拆得太粗,细节丢失;拆得太细,上下文关联困难。找到合适的粒度,是调模型的第一步。

Tokenization 在 NLP 中的核心地位

我刚开始做 NLP 项目时,觉得 tokenization 只是预处理里一个不起眼的环节。后来踩了不少坑,才明白它有多关键。

举个例子。我在做一个中文情感分析时,直接按字切分。结果“好开心”和“好不开心”被模型当成了相似描述——因为“不”字被忽略了上下文。换上 BERT 用的 WordPiece tokenizer,效果立刻提升。

你们想想看,预训练模型(BERT、、T5)的核心组件是什么?——Tokenizer。模型的好坏,很大程度取决于 tokenizer 的设计。它定义了模型的输入空间。

目前主流方法可以分为三大类:

类型 代表方法 特点
单词级 按空格/标点切分 简单直接,词汇表大,OOV 问题严重
字符级 按字符切分 无 OOV,序列长,难以捕获语义
子词级 BPE, WordPiece, Unigram, SentencePiece 平衡词汇量与语义,是目前主流

小技巧:实际项目中,我建议优先使用子词级 tokenizer。特别是处理多语言或包含专业术语的数据时,它的鲁棒性明显更好。

从数据到模型:Tokenizer 的完整流程

下面这张图展示了 tokenizer 在整个 NLP 流程中的位置。它负责把原始文本变成模型能处理的数字序列。

Tokenizer 在 NLP 流程中的核心位置 原始文本 "我爱自然语言处理" Tokenization 过程 分词 → 映射ID → 添加特殊标记 序列 + 注意力掩码 [101, 6432, 2345, 791, 102, 0, 0] 词嵌入层 → 位置编码 Transformer/Mamba 等模型 下游任务:文本分类 / 翻译 / 生成

从图里能清楚看到,无论下游任务多复杂,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。到时候结合代码,你们会更清楚它们的区别和适用场景。