培训自己的模型并使用spacy添加新实体

问题描述 投票:2回答:1

我一直在尝试使用#887使用的相同方法训练模型,仅用于测试用例。我有一个问题,什么是培训语料库在spacy中导入的最佳格式。我有一个文本文件,其中包含需要新实体进行标记的实体列表。让我解释一下我的情况,我按照这样的update.training脚本:

nlp = spacy.load('en_core_web_md', entity=False, parser=False)

ner= EntityRecognizer(nlp.vocab, entity_types=['FINANCE'])

for itn in range(5):
    random.shuffle(train_data)
    for raw_text, entity_offsets in train_data:
        doc = nlp.make_doc(raw_text)
        gold = GoldParse(doc, entities=entity_offsets)

        nlp.tagger(doc)
        ner.update(doc, gold)
ner.model.end_training()

我将训练数据添加为entity_offsets:

train_data = [
    ('Monetary contracts are financial instruments between parties', [(23, 44, 'FINANCE')])
]

这适用于一个示例和新实体标记。显然我希望能够添加多个示例。想法是创建一个带有标记句子的文本文件,问题是spacy需要什么格式来训练数据,我应该从示例中保留entity_offset(对于1000个句子来说这将是一个非常繁琐的任务)还是有另一种方法准备文件,如:

financial instruments   FINANCE
contracts   FINANCE
Product OBJ
of O
Microsoft ORG
etc ...

我如何使用上述方法在spcay中传递语料库?我是否必须使用新创建的模型,或者我可以将新实体添加到旧模型中,如何实现?

更新我设法导入一个文件,其中包含可通过上述培训方法识别的训练数据。该列表将如下所示:

Financial instruments can be real or virtual documents, 0 21 FINANCE
The number of units of the financial instrument, 27 47 FINANCE
or the number of derivative contracts in the transaction, 17 37 BANKING
Date and time when the transaction was executed, 23 34 ORDER
...

但培训效果不佳,我认为这是由于培训数据较少。我将测试语料库中的所有条目标记为FINANCE,或者全部由BANKING标记。我的火车数据需要多大才能获得更好的性能?

我想我将不得不为可能的训练数据注释更大的语料库。这可以用不同的方式完成吗?

spacy Named Entity Recognizer背后的算法是什么?

谢谢你的帮助。

我的环境

spaCy版本:1.7.3平台:Windows-7-6.1.7601-SP1 Python版本:3.6.0已安装的型号:en,en_core_web_md

python named-entity-recognition spacy
1个回答
5
投票

要向实体识别器提供培训示例,您首先需要创建GoldParse类的实例。您可以以对齐格式或标记标记指定注释。

import spacy
import random
from spacy.gold import GoldParse
from spacy.language import EntityRecognizer

train_data = [
    ('Who is Chaka Khan?', [(7, 17, 'PERSON')]),
    ('I like London and Berlin.', [(7, 13, 'LOC'), (18, 24, 'LOC')])
]

nlp = spacy.load('en', entity=False, parser=False)
ner = EntityRecognizer(nlp.vocab, entity_types=['PERSON', 'LOC'])

for itn in range(5):
    random.shuffle(train_data)
    for raw_text, entity_offsets in train_data:
        doc = nlp.make_doc(raw_text)
        gold = GoldParse(doc, entities=entity_offsets)

        nlp.tagger(doc)
        ner.update(doc, gold)
ner.model.end_training()

或者为了简化这一点,您可以尝试此代码

doc = Doc(nlp.vocab, [u'rats', u'make', u'good', u'pets'])
gold = GoldParse(doc, [u'U-ANIMAL', u'O', u'O', u'O'])
ner = EntityRecognizer(nlp.vocab, entity_types=['ANIMAL'])
ner.update(doc, gold)
© www.soinside.com 2019 - 2024. All rights reserved.