首页 > 解决方案 > 向 Spacy 的 en_core_web_sm 模型添加新的命名实体?

问题描述

我正在按照此处的示例来训练新的实体类型:

https://spacy.io/usage/training#example-new-entity-type

当我不将现有模型传递给它时它工作正常,并且会正确创建一个新模型,它可以识别我的新命名实体,例如

 python.exe train-new-entity-type.py

当我将现有模型传递给它(通过之前运行一次创建)时它也可以正常工作,并且会在dir/my_model目录中正确加载模型,它仍然可以识别我的新命名实体,例如

 python.exe train-new-entity-type.py -m dir/my_model

但是,我想训练一个新的实体类型,并将其添加到 spacy 的现有模型中,以便 spacy 能够识别它自己支持的命名实体以及我的新实体类型,所以我尝试了:

 python.exe train-new-entity-type.py -m en_core_web_sm

但是,这似乎不起作用。Spacy 自己支持的命名实体已被识别,但它们不正确(与仅使用 en_core_web_sm 而不向其中添加我的新实体类型相比),并且我的新实体类型根本不再被识别。

难道我做错了什么?这可能吗(将命名实体添加到 en_core_web_sm)?

标签: pythonspacy

解决方案


阅读更新现有模型时的“灾难性遗忘”问题:https ://spacy.io/usage/training#ner

更新现有模型可能会很棘手,因此为新实体类型训练单独的模型并en_core_web_sm使用自定义名称将 NER 组件添加到管道中可能会更容易。需要注意的主要事情是,您需要确保模型加载了相同的词汇,这样您就不会遇到字符串存储问题:

import spacy
nlp = spacy.load("en_core_web_sm")
custom_nlp = spacy.load("my_model", vocab=nlp.vocab)
nlp.add_pipe(custom_nlp.get_pipe("ner"), name="my_ner", before="ner")

在管道中添加它的位置(在现有的之前/之后ner)将确定哪些实体跨度具有优先级,因为该ner组件不会修改现有的实体跨度。


推荐阅读