我使用Prodi.gy创建了一个自定义的NER模型。一旦我执行了所有的处理和验证,我就将模型保存到磁盘上。我可以使用spacy.load从磁盘实例化模型,它似乎工作得很好。我现在的问题是如何将自定义NER模型添加到spacy管道中?我想要确保我的管道中有标记器、解析器等,外加我的自定义NER模型。
似乎我应该从一个现有的模型(en_core_web_sm)中初始化一个基本的nlp,删除现有的NER,并用我的自定义NER替换它。这无疑是用户的错误,我只是从文档和试验/错误中找不出我做错了什么(或需要做什么)。
也许我的操作是错的?也许我应该尝试将标记器和解析器添加到我的自定义模型实例化中?
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. 我试过了,显然是不对的:
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,并添加它,但也不正确:
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运行,则会出错:
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模型添加标记器/解析器的原因
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()).发布于 2021-01-18 16:26:59
在spaCy v2中:
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,这将更改为:
nlp = spacy.load("en_core_web_sm", exclude=["ner"])
nlp_entity = spacy.load("custom_ner_model")
nlp.add_pipe("ner", source=nlp_entity)发布于 2021-01-18 22:06:55
spacy人员提供了这一点作为回应,这与@aab的答案类似。
您可以使用基础模型进行训练,然后删除ner:
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添加到该基础模型中:
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")https://stackoverflow.com/questions/65751120
复制相似问题