Spacy v3.0.5 en_core_web_sm 重赋默认分词器后行为异常原因
重赋值分词器后出现静默失效的根本成因
- 核心认知偏差:手动执行
nlp.tokenizer = spacy.tokenizer.Tokenizer(nlp.vocab)创建的分词器,并非en_core_web_sm自带的原生默认分词器。
spaCy加载预训练英文模型时绑定的原生分词器,是经过定制配置的实例:它在初始化阶段加载了全套英文专属分词规则,包括撇号收缩词拆分规则(如don't拆为do和n't、you're拆为you和're)、前缀/后缀/中缀切分正则、特殊豁免词表等。你手动创建的裸Tokenizer实例,只具备最基础的空格切词能力,没有加载任何英文定制分词规则,和原生分词器的行为完全不同。 - 静默失效的触发逻辑:spaCy的管道组件(如词形还原器)完全依赖分词器输出的词元边界开展后续处理。你替换的裸分词器会把
don't这类带撇号的收缩词当成单个完整词元传给下游组件,而词形还原器的匹配规则是针对“拆分后的独立词元”设计的——当它收到和预期格式不匹配的整串输入时,不会主动抛出格式校验错误,也不会主动补做词元拆分,只会直接把原字符串作为对应词元的lemma_值返回,最终表现为分词、词形还原功能全部失效,且无任何报错。 - 常见误解来源:很多开发者默认“绑定同一个vocab的Tokenizer实例,行为就和模型原生分词器一致”,但实际上模型原生分词器的规则配置,是存储在对应语言的Defaults类、模型元数据中的,脱离这些配置单独初始化的Tokenizer实例,根本不具备和原生版本一致的处理能力。
正确替换参考:如果需要重新挂载和原生行为完全一致的分词器,不要手动初始化裸Tokenizer实例,应当调用模型默认的分词器工厂方法
nlp.Defaults.create_tokenizer(nlp)生成,该方法会自动加载对应语言的全套分词规则,生成的实例和模型初始加载的分词器行为完全对齐。
内容的提问来源于stack exchange,提问作者gustavz
相关产品推荐
相关产品推荐

