Skip to content

BERT 是如何处理自然语言文本中不常见词或者罕见词的? ​

  • 标签:自然语言处理(NLP)、BERT

🏛 业务架构师 ​

BERT 处理不常见词/罕见词的机制:

1. WordPiece 子词切分(核心机制):BERT 不按"整词"建词表——把词切成子词单元(如 "unhappiness" → "un" + "##happi" + "##ness"),词表约 3 万个子词。规则:高频词整词保留,低频词拆成高频子词。效果:任何词都能表示(再生僻的词也能拆成已知子词组合),彻底解决 OOV(未登录词)——传统词向量(Word2Vec)遇生词只能丢弃或 UNK; 2. [UNK] 兜底:连子词都覆盖不了的极端符号(如罕见 emoji)才落到 [UNK]——占比极小; 3. 字符级信息的间接获得:子词保留了词形线索(前缀 un- 表否定、-ness 表名词性)——模型可从子词组合推断生词语义,对形态丰富的语言(德语复合词)尤其重要; 4. 上下文推断:即使某词表示不完美(被拆得很碎),双向注意力让它结合上下文"猜"出语义——上下文是最强的消歧器。

对中文的场景说明:中文按字切分天然"子词化"(汉字本身是词表单元),OOV 问题天然轻微;但 BERT 中文版粒度是字,词语整词语义要靠模型组合——后续模型(如 RoBERTa-wwm,全词掩码)在预训练层面补强了词级语义。

业务视角:这个设计决定了 BERT 系模型"没有查不到的词"——工单黑话、产品型号、新造网络词都能处理,这是它能在企业真实语料(生词密度高)上稳定的工程基础。选 Embedding/理解模型时,"子词或字级切分"是硬性检查项。

🏗 系统架构师 ​

BERT 用 WordPiece 子词 + [UNK] 双层机制处理罕见词:

  • WordPiece 子词切分:词表 3 万(中英混合约万级),高频词整词保留,低频词切成子词单元——"unaffordable" → "un + afford + able";每词必有表示(子词组合覆盖),[UNK] 只在子词都拆不出来时出现(如生僻 unicode),实际几乎绝迹——对比词级模型(W2V)的 OOV 硬伤,这是子词化的核心价值;
  • 词内结构共享:子词让罕见词与同根高频词共享表示("glittering" 借力 "glitter")——形态学泛化:训练集没见过的派生词也能有合理向量;
  • 字符信息兜底:子词本质是"词到字符之间的中间粒度"——极端罕见词最终拆到字符级子词,信息不丢。

对中文的处理:中文按字切分(每字基本在词表内)——天然无 OOV,但牺牲词级语义("苹果"两个字分开)——中文 BERT 变体常做全词遮蔽(WWM,Whole Word Masking)补偿:遮整个词而非单字,让模型学词级语义而非字谜游戏。

架构师视角的延伸:这套子词方案(BPE/WordPiece/SentencePiece)成为整个 LLM 时代的 tokenizer 标准——OOV 问题被"子词化"永久解决,代价是 token 化的粒度不均(生僻词被拆碎占多个 token——中文生僻字、代码、小语种的 token 成本更高,这是 tokenizer 公平性/成本问题的根源)。理解这一层,就理解了"为什么同样内容不同语言 token 费用差数倍"。

💻 全栈开发专家 ​

BERT 靠 WordPiece 子词切分处理罕见词/OOV,机制拆解:

1. 子词词表(3 万词片):

  • 高频词整词保留(「play」);
  • 低频词拆成子词单元(「unhappiness」→「un ##happy ##ness」,## 表示词内延续);
  • 极端情况拆到单字符——词表有限但组合无限,理论上不存在 OOV(任何新词都能被字符级拼出来)。

2. 训练时词表怎么来:在语料上迭代合并最高频的字符对(类似 BPE 的贪心),直到词表达到目标大小——频繁片段自然进词表,罕见组合按需拆解。

3. 表示层面的好处:

  • 形态信息保留:##ness 后缀本身有语义(名词性),子词向量捕获词法规律——对未见过的派生词(「COVID-ness」这种造词)也能给出合理表示;
  • 大小写/拼写变体共享子词(tokenizer 的 lowercase/strip_accents 配置影响这个);
  • 参数效率:词表 3 万 vs 全词表几十万,embedding 矩阵小一个量级。

4. 与其他方案对比:

  • BPE(GPT 系):同样贪心合并,但基于字节、无 ## 语义标记;GPT-2 起用 byte-level BPE,真正零 OOV(任何字节序列可编码);
  • SentencePiece(T5/LLaMA):语言无关、把空格也当符号,中文友好;
  • 字符级:最彻底但序列太长(注意力平方成本),子词是「词义完整」与「序列长度」的工程平衡点。

实践坑:训练与推理必须用同一个 tokenizer 文件(版本不匹配是效果骤降的隐形杀手);中文场景注意 tokenizer 是否做了全词切分(BERT 中文按字切,词级信息靠模型层学)。