一句话定义:OOV(Out-of-Vocabulary,词表外词)指的是在某个模型的词表(vocabulary)里找不到对应条目的词或字符——它说的是“这套词表没收录”,而不是“这个说法在语言里不存在”。
要理解 OOV,先看模型怎么“认字”。文本进模型之前,要先过分词器(tokenizer):把句子切成一个个 token,再查词表换成数字 ID。词表就是模型的认字本,规模通常在几万条量级。查得到,就有 ID;查不到,就是 OOV。
打个比方:老式功能机的通讯录只认常用字,你输入一个生僻字就显示方块。字本身当然存在,只是这台机器没给它留位置。换一台手机,同一个字可能就正常显示了——所以 OOV 是“相对于某个词表”的属性,不是词的固有属性。同一个词,对 A 模型是 OOV,对 B 模型可能不是。
这正是子词分词(subword tokenization)要解决的问题。BPE、WordPiece、SentencePiece 这类方法的思路是:与其为每个完整单词留一条记录,不如收录高频片段,遇到没见过的词就拆开拼。比如 tokenization 会被切成 token + ization 这样的常见片段;再退一步,还能到字符级甚至字节级(byte-level),理论上任何字符串都能被编码,OOV 率可以压到接近零。
但“能编码”不等于“能理解”。一个罕见专名被切成七八个碎片,模型看到的是一串语义稀薄的片段,效果自然打折。所以 OOV 的真正痛点不是报错,而是表示质量下降。
几个容易混淆的概念:
| 概念 | 说的是什么 | 关注点 |
|---|---|---|
| OOV | 词表里没有这个条目 | 分词器与词表覆盖 |
| 罕见词 | 语料里出现次数很少 | 数据分布 |
| 新词 | 新造词、专名、拼写变体 | 语言本身在变 |
罕见词可以不是 OOV(只要子词拼得出来),OOV 也不一定是新词(冷门专业术语对通用词表就是 OOV)。
对从业者的实际意义:词表大小是个权衡——词表大,嵌入参数多、低频词表示稀疏;词表小,序列变长、推理更贵。做垂直领域(法律、医疗、代码)时,通用分词器常把专业词切得稀碎,值得评估领域内继续训练分词器或扩充词表。上线后监控“每千字平均 token 数”是个便宜又灵敏的信号:数值突然升高,往往意味着来了词表没覆盖的输入。
对普通人:模型数错字符串里的字母、写错你公司名或产品型号,很多时候就是分词切碎导致的。给小众专名时多给一点上下文或解释,通常能明显改善结果。
