You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

spaCy v3.1特定领域词性标注模型无法返回.pos_属性如何解决

spaCy v3.x训练自定义词性标注后pos_为空的解决方法

问题根因

自定义的标签映射规则TAG_MAP没有挂载到spaCy模型的Vocab对象上,tagger组件训练后仅能输出你自定义的短标签(N/V/J)到tag_属性,但没有映射规则来填充对应的pos_属性。

具体修改步骤

  • 初始化空白模型后,先挂载自定义标签映射到Vocab对象
  • 用spaCy v3推荐的initialize()接口替换废弃的begin_training()接口
  • 挂载映射后即可正常调用tagger.add_label(tag, values),不再报错

修改后的核心代码示例

def main(lang="pt", output_dir="./output_2", n_iter=25):
    nlp = spacy.blank(lang)
    # 新增:挂载自定义标签映射
    nlp.vocab.tag_map = TAG_MAP
    tagger = nlp.add_pipe("tagger")

    for tag, values in TAG_MAP.items():
        # 现在不会报错
        tagger.add_label(tag, values)

    # 替换为v3标准初始化接口
    optimizer = nlp.initialize()   
    for i in range(n_iter):
        random.shuffle(TRAIN_DATA)
        losses = {}
        for text, annotations in TRAIN_DATA:    
            example = Example.from_dict(nlp.make_doc(text), annotations)
            nlp.update([example], sgd=optimizer, losses=losses)
        print(losses)
    
    test_text = "Eu gosto ovos passados"        

    if output_dir is not None:
        output_dir = Path(output_dir)
        if not output_dir.exists():
            output_dir.mkdir()
        nlp.to_disk(output_dir)
        print("Saved model to", output_dir)
    
        print("Loading from", output_dir)
        nlp2 = spacy.load(output_dir)
        doc = nlp2(test_text)
        print("Tags", [(t.text, t.tag_, t.pos_) for t in doc])

运行效果

修改后输出的pos_字段会正常填充对应值:

Tags [('Eu', 'N', 'NOUN'), ('gosto', 'V', 'VERB'), ('ovos', 'N', 'NOUN'), ('passados', 'J', 'ADJ')]

内容的提问来源于stack exchange,提问作者user140259

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:36:03