【问题标题】:Python NER: add custom text and labels to update the NER modelPython NER:添加自定义文本和标签以更新 NER 模型
【发布时间】:2021-02-01 19:50:30
【问题描述】:

我使用 NER 实质上擦洗文本,以便将每个命名实体替换为其标签(PERSON、ORG 等)。所以“John 在 Apple 工作”会变成“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 模型?非常感谢!

【问题讨论】:

    标签: python nlp spacy named-entity-recognition


    【解决方案1】:

    您绝对是在正确的轨道上。 spaCy 文档通过非常清晰的指南解决了您的问题。查看https://spacy.io/usage/training

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

    请注意,他们的训练数据是硬编码的,但如果我是你,我会将其提取到它自己的管道中。他们还建议进行数百次观察,以获得最大的微调效果。

    【讨论】:

    • 感谢您提供此资源——我按照文档进行操作,似乎它可以工作并将新模型保存到我指定的目录中,我可以将其加载为 nlp2 = 从输出目录更新模型。但是,由于我的代码使用 ner-d 包 (pypi.org/project/ner-d),我对新模型是否适用于我的文本代码感到困惑。您对我如何让我的 ner-d 代码反映新的 spacy 模型有任何见解吗?非常感谢!
    • 我看不出使用 ner-d 包的任何充分理由——它只是另一个依赖于 spaCy 的超薄 API。你可以用一行额外的 spaCy 代码来做同样的事情。但是,如果您想坚持下去,请在完成培训后使用 spaCy 的 nlp.to_disk() 方法,然后将您的 ner.name(input_text, language='en_core_web_sm') 替换为 ner.name(input_text, language='path/to/saved/model')!希望有效,我还没有测试过:-)
    • 啊,我明白了!我这样做了,但是运行doc = ner.name(input_text, language=output_dir) 现在给了我TypeError: 'str' object is not callable——你认为这与output_dir 格式的格式有关吗? (它是目录的 PosixPath)。非常感谢!
    • @Anonymous 你知道,我真的不知道。我对包和加载/保存 spaCy 模型并不十分熟悉。似乎该模块对提供路径不满意。如果我是你,我会探索nerdspacy 的源代码,以找出加载模型的正确方法。尝试保存和加载最简单的模型,并逐步转向您的 NER 模型以弄清楚如何去做。祝你好运! (如果我的回答有帮助,请考虑投票!)
    猜你喜欢
    • 2020-01-12
    • 2021-11-09
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多