首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将自定义NER模型添加到spaCy管道

将自定义NER模型添加到spaCy管道
EN

Stack Overflow用户
提问于 2021-01-16 23:11:10
回答 2查看 881关注 0票数 1

我使用Prodi.gy创建了一个自定义的NER模型。一旦我执行了所有的处理和验证,我就将模型保存到磁盘上。我可以使用spacy.load从磁盘实例化模型,它似乎工作得很好。我现在的问题是如何将自定义NER模型添加到spacy管道中?我想要确保我的管道中有标记器、解析器等,外加我的自定义NER模型。

似乎我应该从一个现有的模型(en_core_web_sm)中初始化一个基本的nlp,删除现有的NER,并用我的自定义NER替换它。这无疑是用户的错误,我只是从文档和试验/错误中找不出我做错了什么(或需要做什么)。

也许我的操作是错的?也许我应该尝试将标记器和解析器添加到我的自定义模型实例化中?

代码语言:javascript
运行
复制
I was able to get it to work by adding the "tagged" and "parser" from one of the en models and then modifying the meta.json file. That doesn't seem like the right approach. 

我试过了,显然是不对的:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm")
#remove existing NER
nlp.remove_pipe('ner')
print("Pipeline", nlp.pipe_names)

nlp_entity = spacy.load("custom_ner_model")

nlp.add_pipe(nlp_entity)
print("Pipeline", nlp.pipe_names)

Pipeline ['tagger', 'parser']
Pipeline ['tagger', 'parser', 'English']

然后,我试着从自定义模型构建NER,并添加它,但也不正确:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm")
#remove existing NER
nlp.remove_pipe('ner')
print("Pipeline", nlp.pipe_names)

nlp_entity = spacy.load("custom_ner_model")
ner = nlp_entity.create_pipe("ner")

nlp.add_pipe(ner,last=True)
print("Pipeline", nlp.pipe_names)

如果我尝试在管道中使用ner运行,则会出错:

代码语言:javascript
运行
复制
text = "This is a test"
doc = nlp(text)
displacy.render(doc, style="ent")

ValueError: [E109] Model for component 'ner' not initialized. Did you forget to load a model, or forget to call begin_training()?

我也得到了这个错误,这就是驱使我尝试从基本en模型添加标记器/解析器的原因

代码语言:javascript
运行
复制
ValueError: [E155] The pipeline needs to include a tagger in order to use Matcher or PhraseMatcher with the attributes POS, TAG, or LEMMA. Try using nlp() instead of nlp.make_doc() or list(nlp.pipe()) instead of list(nlp.tokenizer.pipe()).
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-18 16:26:59

在spaCy v2中:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm", disable=["ner"])
nlp_entity = spacy.load("custom_ner_model", vocab=nlp.vocab)
nlp.add_pipe(nlp_entity.get_pipe("ner"))

这里的棘手之处在于,您需要使用相同的单词来加载这两个标签,以便您的最终模型知道仅在自定义模型中使用的任何新标签的字符串。为此,您只需将第一个模型中的词汇对象提供给第二个模型的spacy.load()

对于即将推出的spaCy v3,这将更改为:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm", exclude=["ner"])
nlp_entity = spacy.load("custom_ner_model")
nlp.add_pipe("ner", source=nlp_entity)
票数 2
EN

Stack Overflow用户

发布于 2021-01-18 22:06:55

spacy人员提供了这一点作为回应,这与@aab的答案类似。

您可以使用基础模型进行训练,然后删除ner:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm")
nlp.remove_pipe("ner")
print(nlp.pipe_names)  # ['tagger', 'parser']
nlp.to_disk("./en_tagger_parser_sm")  # use that path for training

或者,您可以从基础模型中删除NER,然后将您的自定义NER添加到该基础模型中:

代码语言:javascript
运行
复制
nlp = spacy.load("en_core_web_sm")
nlp.remove_pipe("ner")
print(nlp.pipe_names)  # ['tagger', 'parser']

nlp_entity = spacy.load("custom_ner_model")
# Get the ner pipe from this model and add it to base model
ner = nlp_entity.get_pipe("ner")
nlp.add_pipe(ner)
print(nlp.pipe_names)  # ['tagger', 'parser', 'ner']

nlp.to_disk("./custom_model")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65751120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档