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
相关产品推荐
相关产品推荐

