什么是子词(Subword)

子词Subword)概念概述

子词是介于字符(character)和完整单词(word)之间的一种语言单元,它把词拆分为更小的、在语料中高频出现的字符序列或形态学片段(如词根、前缀、后缀)。在自然语言处理NLP)中,子词被用作 token 的基本粒度,以兼顾词汇表规模与表达能力。


1. 为什么需要子词?

问题 传统词级分词的局限 子词的解决方案
词表过大 每个完整单词都需要一个独立的词向量,导致词表数十万甚至上百万,内存和计算成本高。 子词将常见的字符块复用,显著压缩词表规模(常见 16k‑32k 左右)。
未登录词(OOV) 训练时未出现的单词会被标记为 <unk>,信息丢失。 子词可以把未知词拆解为已见的子词块,使模型仍能捕捉其语义,例如 “refactoring” → “re”, “factor”, “ing”。
形态变化丰富 词形变化(复数、时态、词缀)导致大量稀疏词。 子词自然捕获词根与词缀,提升对形态变化的鲁棒性

2. 主流子词构建算法

算法 基本思路 关键特点
Byte‑Pair Encoding (BPE) 从字符层面统计相邻字符对出现频率,迭代合并最高频的对,直至达到预设词表大小。 简单高效,最早用于机器翻译;合并过程基于频率,易实现。
WordPiece 类似 BPE,但在每一步合并时考虑合并后子词的语言模型概率(最大似然),更倾向于保留语义完整性。 被 Google 的 BERTALBERT 等模型采用。
Unigram Language Model (ULM) 先设定大量候选子词,使用 EM 算法估计每个子词的出现概率,随后逐步剔除低概率子词,保留高概率子词形成词表。 兼顾频率与概率,SentencePiece 实现了该方法。

实现工具:SentencePiece、tokenizers、huggingface‑tokenizers 等库均提供上述算法的高效实现。


3. 子词在现代模型中的应用

  • BERT、GPT 系列:几乎所有大规模预训练语言模型都采用子词级 tokenization(多为 WordPiece 或 BPE),以在保持语义的同时控制词表规模。
  • 标记方式:常用 “##” 前缀标记子词是前一个 token 的续接,例如 tokenizer → token + ##izer
  • 跨语言:对中文、日文等字符集密集的语言,子词同样有效,能够捕获常见的字块或词根,提升多语言模型的统一性。

4. 子词构建流程(以 BPE 为例)

  1. 初始化词表:仅包含所有单字符和特殊结束符。
  2. 统计频率:遍历语料,统计所有相邻字符对的出现次数。
  3. 合并最高频对:将出现次数最高的字符对合并为新子词,加入词表。
  4. 迭代:重复步骤 2‑3,直至词表大小达到预设阈值(如 30k)。
  5. 编码:对新句子进行贪心匹配,优先使用最长子词进行切分。

该过程在实际实现中常配合 词频阈值、最小子词长度 等超参数进行调优,以平衡词表大小与分词质量。


5. 子词的优势与局限

优势

  • 降低 OOV 率:几乎所有词都能被拆解为已知子词。
  • 压缩词表:显著减少模型参数和存储需求。
  • 捕获形态信息:前缀、后缀等形态学特征自然保留。
  • 跨语言统一:同一子词模型可用于多语言语料,便于多语言预训练

局限

  • 与语言学概念不完全对应:子词是数据驱动的统计单元,未必等同于真实的词根或形态学单位。
  • 分词歧义:同一词在不同上下文可能被切分为不同子词序列,需要模型自行学习上下文依赖。
  • 实现复杂度:高质量子词词表的构建需要大规模语料和多轮迭代。

6. 小结

子词(Subword)是 NLP 中一种在 字符 与 完整单词 之间的折中表示方式,通过 BPE、WordPiece、Unigram LM 等算法学习高频字符块,能够 压缩词表、降低 OOV、捕获形态信息,已成为 BERT、GPT、Transformer 等现代语言模型的标准 tokenization 方案。它的出现解决了传统词级分词在大规模语料和多语言环境下的局限,为当前以及未来的语言模型提供了高效、灵活的基础单元。

来源:www.aiug.cn
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!