Python NER:添加自定义文本和标签以更新NER模型

时间:2020-07-15 22:39:04

标签: python nlp spacy named-entity-recognition ner

我使用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模型?非常感谢!

1 个答案:

答案 0 :(得分:1)

您肯定在正确的轨道上。 spaCy文档以非常清晰的指南解决了您的问题。在https://spacy.io/usage/training处进行检查。

我建议阅读全文以真正理解API,但是您最感兴趣的部分是Training the named entity recognizer。它阐明了如何添加新的训练数据来微调现有(或空白)spaCy NER模型。还有代码示例!

请注意,他们的训练数据是经过硬编码的,但是如果您是我,我会将其拉到它自己的管道中。他们还推荐了数百个观测值,以在微调中获得最大效果。