NLP 传统分词与大模型 Tokenization 的本质区别
从分词到 Token:NLP 传统分词与大模型 Tokenization 的本质区别
同样是"把文本切成小块",传统分词和大模型 tokenization 走的是两条完全不同的路。
引子
如果你用过 jieba 分词,也用过 ChatGPT,你可能会有一个疑问:它们都在"切文本",到底有什么不同?
答案是:目标不同,一切就不同。
传统分词追求的是语言学正确性——切出来的每一块都应该是一个有意义的词。而大模型的 tokenization 追求的是编码效率——用尽可能少的 token 表示尽可能多的文本,同时保持词表规模可控。
这篇文章会从原理、方法、效果三个层面拆解两者的区别。
一、传统 NLP 分词:让人看懂文本结构
要解决什么问题?
英文有天然的空格作为词边界,但中文没有。"南京市长江大桥"到底是"南京市 / 长江大桥"还是"南京 / 市长 / 江大桥"?这就是中文分词要解决的核心问题——找到正确的词边界。
主流方法
基于词典的方法:维护一个大词典,用最大匹配等策略扫描文本。简单快速,但碰到新词就无能为力。
基于统计的方法:把分词建模为序列标注问题,用 HMM、CRF 等模型学习字与字之间的转移概率。jieba 分词就是这类方法的代表,它结合了词典和 HMM 来处理未登录词。
基于深度学习的方法:用 BiLSTM+CRF 等模型做序列标注,效果更好,但计算成本也更高。
一个例子
输入:"我在北京大学学习自然语言处理"
输出:["我", "在", "北京大学", "学习", "自然语言处理"]
每个切分结果都是一个语言学意义上的词,人类读起来完全自然。
痛点
- 歧义:同一个字符串可能有多种合理切分
- 未登录词:新词、专有名词、网络用语难以覆盖
- 领域依赖:通用词典在医学、法律等专业领域表现不佳
- 语言专属:中文分词器不能用于日文,反之亦然
二、大模型 Tokenization:让模型高效吃进文本
要解决什么问题?
大模型需要把任意文本转换成一个整数序列作为输入。如果以字符为单位,序列太长,计算成本爆炸;如果以词为单位,词表太大,且无法处理拼写错误和新词。
Tokenization 的目标是在序列长度和词表大小之间找到最优平衡点。
主流算法
BPE(Byte Pair Encoding):GPT 系列的选择。从字符级别开始,反复合并语料中最高频的相邻 token 对,直到词表达到预设大小。本质上是一种数据压缩算法。
WordPiece:BERT 的选择。与 BPE 类似,但合并策略不同——它选择合并后能最大化语言模型似然的 token 对,而非单纯看频率。
Unigram:SentencePiece 支持的方法。反向操作——从一个大词表开始,逐步移除对整体编码效率影响最小的 token,直到词表缩减到目标大小。
SentencePiece:不是一种算法,而是一个框架。它直接在原始文本上训练(不依赖预分词),支持 BPE 和 Unigram,天然适合多语言场景。
一个例子
输入:"unhappiness"
BPE 风格:["un", "happi", "ness"]
词表中没有 "unhappiness" 这个完整的词,但子词组合可以表示它。
输入:"自然语言处理"
可能的结果:["自然", "语言", "处", "理"]
"自然"和"语言"在训练语料中频率够高,被保留为完整 token;
"处理"频率不够,被拆成了两个单字 token。
注意:切出来的片段不一定是"词",甚至不一定有独立含义。这完全没问题——模型不需要每个 token 都有语言学意义。
三、核心区别一览
| 维度 | 传统分词 | 大模型 Tokenization |
|---|---|---|
| 目标 | 语言学正确的词边界 | 高效压缩文本为模型输入 |
| 基本单位 | 词 | 子词(subword) |
| 方法论 | 词典 + 规则 + 序列标注 | BPE / WordPiece / Unigram |
| 未登录词处理 | 困难,需要特殊策略 | 天然支持,拆成更小单元即可 |
| 语言依赖性 | 强,通常需要语言专属工具 | 弱,统一框架处理多语言 |
| 词表规模 | 可能很大(数十万) | 固定且可控(32k ~ 150k) |
| 输出可读性 | 高 | 较低,可能出现碎片 |
| 错误容忍度 | 低,切错影响下游任务 | 高,模型通过上下文学习语义 |
四、一个有趣的现象:为什么中文更费 token?
如果你用过 OpenAI 的 Tokenizer 工具,你会发现同样语义的内容,中文消耗的 token 数通常是英文的 1.5 到 2 倍。
原因很直接:GPT 系列模型的训练语料以英文为主,英文的常见词和子词在 BPE 合并过程中被充分压缩,一个 token 可以表示一个完整的常见单词。而中文字符出现频率相对低,很多词无法被合并为单个 token,只能拆成单字甚至字节级别的 token。
这也是为什么针对中文优化的模型(如 ChatGLM、Qwen)会专门扩充中文 token 的词表——让常见中文词也能被一个 token 表示,从而降低序列长度,提升推理效率。
五、它们之间有交集吗?
有。在一些大模型的 tokenizer 实现中,会先做一轮"预分词"(pre-tokenization),用正则或简单规则把文本粗切成块,然后再对每个块做 BPE。这一步的作用类似传统分词,但目的不是语言学正确性,而是防止 BPE 跨越不合理的边界(比如把空格和单词合并成一个 token)。
另外,一些中文大模型会在 tokenizer 训练前先用分词工具处理语料,让 BPE 更容易学到有意义的中文子词。这算是传统分词技术在大模型时代的一种延续。
总结
传统分词和大模型 tokenization 看似做着相同的事,实则服务于完全不同的目标:
- 传统分词:为人类和下游 NLP 任务提供语言学结构
- 大模型 tokenization:为模型提供高效、紧凑、可泛化的输入编码
理解这个区别,你就能明白为什么大模型不需要专门的"分词"步骤,为什么中文比英文更费 token,以及为什么 tokenizer 的设计对模型性能有着深远的影响。
下次当你看到 GPT 把"人工智能"切成 ["人工", "智", "能"] 的时候,不要觉得它"切错了"——它只是在用自己的方式理解这个世界。