什么是 Tokenization:定义、作用和意义
说起来有点意思,我当年刚接触 NLP 时,以为 Tokenization 就是把句子按空格切一切。结果第一个项目就翻车了——中文文本根本就没空格。后来我才真正明白,Tokenization 是整个自然语言处理的基石。你想想看,模型再厉害,它也只吃数字,不吃文字。那怎么把文字变成数字?第一步就是 Tokenization。
1.1 定义:到底什么是 Tokenization
用大白话说,Tokenization 就是把一段文本拆成一个个小单元。这些小单元叫作 。
每个 可以是:
- 一个词(例如:“我”、“喜欢”、“学习”)
- 一个字符(例如:“我”、“喜”、“欢”、“学”、“习”)
- 一个子词(例如:“学”、“习” -> “学习”)
- 一个标点符号(例如:“。”、“!”)
的长度和你选的 Tokenizer 有关。我个人习惯用 BPE(Byte Pair Encoding)做子词切分,它在处理英文生僻词和中文未登录词时表现很稳。但这是后话了,咱们先专注定义本身。
说白了,Tokenization 就是一句话“拆”完之后的一个个零件。
核心定义:将原始文本序列,依据某种规则(空格、字典、统计频率、预训练模型),转换为离散的 序列。每个 携带一个数字 ID。后续模型只能理解这些 ID,无法理解原始字符。
嗯,这里要注意。很多初学者以为 Tokenization 就是简单分词。其实不止。它还包括:
- 特殊 的处理([CLS]、[SEP]、[UNK]、[MASK] 等)
- 大小写统一或保留
- 标点符号单独切分
- 数字、URL、表情的特殊处理
这还没完。你想想看,一个空格切分的英文 Tokenizer,放到中文语料上就彻底废了。所以 Tokenizer 是语言相关的,没有万能方案。
1.2 作用:Tokenization 解决了什么问题
Tokenization 就像一个翻译官,把人类语言翻译成机器语言。没有它,模型就没法理解文本。那它具体解决了什么痛点?我总结出三个核心作用。
第一,统一表示。不管你是中文、英文、代码还是表情包,Tokenizer 都能把它们映射成同一个数字空间。
第二,控制维度。词汇量太大,模型学不过来。Tokenizer 把词汇量控制在 3 万到 10 万左右,既能覆盖高频词,又能处理生僻字。我记得刚开始自己训练词向量时,词表 50 多万,模型训练到一半就内存爆炸了。后来用 BPE 压缩到 5 万 ,效果稳得多。
第三,处理歧义。例如“苹果”可以是一种水果,也可以是公司名。Tokenization 本身不解决语义歧义,但它为后续模型建模上下文提供了基础。
| 维度 | 无 Tokenization | 有 Tokenization |
|---|---|---|
| 输入格式 | 原始字符串(“我爱 NLP”) | 整数序列([1, 2, 3, 4]) |
| 词汇规模 | 无限(每个字、每个词都不同) | 固定(3 万 ~ 10 万) |
| 内存占用 | 极高(需存储全量字符) | 可控(整数 ID 存储) |
| 泛化能力 | 差(未见词直接报错) | 好(子词可组合生成新词) |
这个表格应该很直观了。没有 Tokenization,你的模型连“吃”都“吃”不下数据。
1.3 意义:为什么这门课要从 Tokenization 开始
你可能觉得 Tokenization 是个小环节,不值得花一整章讲。我以前也这么想。直到有一次,我接了一个医疗文本分类项目,结果模型在“新冠肺炎”这个词上反复出错。排查了很久才发现,问题出在 Tokenizer 上——它把“新冠”拆成了“[新][冠]”,导致模型完全没理解“新冠肺炎”是一个整体。
从那以后,我养成一个习惯:调模型之前,先调 Tokenizer。
你想想看,如果连输入的数据都没拆分对,后面的模型训练、调参、部署都是白费。Tokenization 决定了:
- 词汇表大小(直接影响模型参数量)
- 序列长度(影响显存占用和推理速度)
- 未登录词的处理方式(影响 OOV 词的语义丢失)
- 不同语言的兼容性(跨语言模型的关键)
个人建议:新手不要急着调 BERT 或者 的参数,先花半小时搞清楚你用的预训练模型用了什么 Tokenizer。我见过太多人拿着 BPE 的 tokenizer 去处理中文,结果效果很差,还以为是模型问题。
Tokenization 的意义还在于:它是所有 NLP 算法共有的第一道工序。不管你是做文本分类、机器翻译、信息抽取、对话系统,还是做最新的 LLM(大语言模型),第一步永远是 Tokenization。学透了它,你后面学 embedding、attention、transformer 都会轻松很多。
为了让你更直观理解 Tokenization 在整个 NLP 流程中的位置,我画了一张图:
⚠️ 避坑指南:千万不要用英文预训练模型的 Tokenizer 直接处理中文文本。我吃过这个亏。英文 Tokenizer 会把每个中文字符当成一个 ,导致一句话的序列长度暴增 5~10 倍,模型推理极慢且效果很差。必须为中文选择或训练专用的 Tokenizer(比如用 SentencePiece 在中文语料上训练),或者直接用支持中文的预训练模型(如 BERT-base-chinese)。
小结一下
Tokenization 不是简单的“拆分文本”。它是一套完整的文本预处理系统,决定了模型理解的“最小单位”是什么。你选什么分词粒度、用什么算法、怎么处理未登录词,直接决定了后面模型的天花板。
这一章咱们把定义、作用和意义讲清楚了。从下一章开始,我会带你了解主流的 Tokenization 算法——BPE、WordPiece、Unigram、SentencePiece。每个算法我都会结合项目中的踩坑经历来讲,保证你听了一遍就能记住。
嗯,今天就到这里。先把概念消化掉,后面实操起来才顺手。