我使用NER基本上是擦洗文本,以便将每个命名实体替换为其标签(PERSON,ORG等)。因此,“约翰在苹果公司工作”将变成“ PERSON在ORG工作”。
clause_text
是我的句子列表。我使用ner-d包来构建我的NER模型并按如下所示清理文本:
for text in clause_text:
input_text = text
doc = ner.name(input_text, language='en_core_web_sm')
text_label = [(X.text, X.label_) for X in doc]
# replace all named entities with their label (PERSON, ORG, etc)
for text, label in text_label:
input_text = input_text.replace(text, label)
scrubbed_text.append(input_text)
现在,我正在尝试添加自定义训练数据。基本上,我希望能够添加带有标签的句子并更新NER模型,使其更准确/更符合我的需求。现在我有这个:
nlp = spacy.load('en_core_web_sm')
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner)
else:
ner = nlp.get_pipe('ner')
from spacy.gold import GoldParse
from spacy.pipeline import EntityRecognizer
doc_list = []
doc = nlp('This EULA stipulates a contract for Hamilton Enterprises.')
doc_list.append(doc)
gold_list = []
gold_list.append(GoldParse(doc, [u'O', u'O', u'O', u'O', u'O', u'O', u'ORG']))
ner = EntityRecognizer(nlp.vocab, entity_types = ['ORG'])
ner.update(doc_list, gold_list)
但是当我运行它时,出现此错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-92c53f5c90b1> in <module>
9
10 ner = EntityRecognizer(nlp.vocab, entity_types = ['ORG'])
---> 11 ner.update(doc_list, gold_list)
nn_parser.pyx in spacy.syntax.nn_parser.Parser.update()
nn_parser.pyx in spacy.syntax.nn_parser.Parser.require_model()
ValueError: [E109] Model for component 'ner' not initialized. Did you forget to load a model, or forget to call begin_training()?
是否有人对如何最好地修复此代码有任何见识,或者是否有更好的方法来添加自定义条目以更新NER模型?非常感谢!
答案 0 :(得分:1)
您肯定在正确的轨道上。 spaCy文档以非常清晰的指南解决了您的问题。在https://spacy.io/usage/training处进行检查。
我建议阅读全文以真正理解API,但是您最感兴趣的部分是Training the named entity recognizer。它阐明了如何添加新的训练数据来微调现有(或空白)spaCy NER模型。还有代码示例!
请注意,他们的训练数据是经过硬编码的,但是如果您是我,我会将其拉到它自己的管道中。他们还推荐了数百个观测值,以在微调中获得最大效果。