标准回答
为什么用子词
词级分词词表大、未登录词(OOV)多;字符级无 OOV 但序列太长、语义弱。子词分词在两者间折中:常见词整体成 token,罕见词拆成有意义的子词片段,既覆盖任意词又控制序列长度。
BPE(Byte-Pair Encoding)
从字符开始,统计语料中相邻符号对的频率,贪心地反复合并最高频的对,每合并一次词表加一个新符号,直到达到目标词表大小。规则简单高效,GPT/RoBERTa 等广泛使用(常用其字节级变体 byte-level BPE 彻底消除 OOV)。
WordPiece
流程类似 BPE 也是自底向上合并,但合并准则不同:不是选最高频对,而是选合并后能最大化训练语料似然(近似 freq(AB)/(freq(A)·freq(B)) 最大)的对,更偏向语言学上更「值得」的组合。BERT 系列采用,常用 ## 前缀标记词内续接子词。
Unigram Language Model
方向相反,自顶向下:先建一个较大的候选子词集合,赋予每个子词概率,构成一个一元语言模型;通过 EM 迭代估计概率,并逐步剪掉对整体似然贡献最小的子词,直到词表收敛。分词时可在多种切分中选概率最高的,天然支持采样多种切分(subword regularization)。常与 SentencePiece 一起使用(直接在原始文本上训练、无需预分词)。
常见误区
⚠️ 常见踩坑
WordPiece 不是「按最高频合并」——那是 BPE;WordPiece 按似然增益合并。Unigram 是自顶向下剪枝而非自底向上合并。SentencePiece 是工具/框架,可承载 BPE 或 Unigram,并非某种独立算法。
追问
追问 1:byte-level BPE 解决了什么问题?
普通 BPE 在字符级别操作,遇到训练时没见过的字符(生僻字、表情、多语言符号)仍可能 OOV。byte-level BPE 把文本先转成 UTF-8 字节再做 BPE,基础符号只有 256 个字节,任何字符都能由字节组合表示,从而彻底消除 OOV,GPT-2 起广泛采用。
追问 2:Unigram 的 subword regularization 有什么用?
追问 3:为什么中文等语言常用 SentencePiece?
中文没有空格分词,传统按词处理依赖分词器且易引入误差。SentencePiece 直接在原始文本(把空格也当普通符号)上训练 BPE/Unigram,无需预先分词,语言无关、可逆,方便处理中文、日文等无显式词边界的语言,也利于多语言统一建模。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。