为何预训练spaCy管道添加至空白管道后失效,所有Token被识别为名词?
问题原因及解决办法
核心问题:多余的nlp.initialize()调用
你调用的nlp.initialize()会重置从预训练模型加载的组件参数,把它们还原到未训练的初始状态,导致组件无法正确识别词性和句法结构,只能输出默认的名词标签。
解决步骤
直接移除nlp.initialize()这一行即可,从预训练模型加载的组件本身就带有训练好的权重,不需要重新初始化。
修改后的代码:
import spacy from spacy import displacy nlp = spacy.blank("nb") wanted_pipes = ["morphologizer", "parser"] # 提前加载预训练模型,避免重复加载 pretrained_nlp = spacy.load("nb_core_news_sm") for pipe_name in wanted_pipes: if pipe_name not in nlp.pipe_names: nlp.add_pipe(pipe_name, source=pretrained_nlp) # 直接处理文本 doc = nlp("Katten heter Petrus.") # 可以打印结果验证 for token in doc: print(f"词: {token.text}, 词性: {token.pos_}, 依存关系: {token.dep_}")
额外说明
如果后续需要基于这个管道微调自定义数据,才需要调用nlp.initialize(),但此时要确保正确传入预训练权重作为初始化基础,避免参数被清空。
内容的提问来源于stack exchange,提问作者Sofie Jægtvik Benjaminsen
相关产品推荐
相关产品推荐

