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

Python 培训自己的模型并使用spacy添加新实体,python,named-entity-recognition,spacy,Python,Named Entity Recognition,Spacy,我一直在尝试使用与#887使用的方法相同的方法来训练模型,只是为了测试用例。 我有一个问题,在spacy中导入训练语料库的最佳格式是什么。我有一个文本文件,其中包含需要新实体进行标记的实体列表。 让我解释一下我的情况,我遵循update.training脚本,如下所示: nlp = spacy.load('en_core_web_md', entity=False, parser=False) ner= EntityRecognizer(nlp.vocab, entity_types=['FI

我一直在尝试使用与#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()
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
...
我将我的培训数据添加为实体_偏移:

train_data = [
    ('Monetary contracts are financial instruments between parties', [(23, 44, 'FINANCE')])
]
对于一个示例和新的实体标记来说,这很好。显然,我希望能够添加多个示例。想法是创建一个带有标记句子的文本文件,问题是spacy需要什么格式的训练数据,我应该保留实体_与示例的偏移量(这对于1000个句子来说是一项非常繁琐的任务),还是有其他方法来准备文件,如:

financial instruments   FINANCE
contracts   FINANCE
Product OBJ
of O
Microsoft ORG
etc ...
如何使用上述方法在spcay中传递语料库?我是否必须使用新创建的模型,或者我可以将新实体添加到旧模型中,如何实现这一点

更新 我设法导入了一个包含培训数据的文件,这些数据将被上述培训方法识别。 列表如下所示:

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()
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版本:1.7.3 平台:Windows-7-6.1.7601-SP1 Python版本:3.6.0
已安装型号:en,en_core_web_md

要向实体识别器提供培训示例,首先需要创建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)

spacy的制造者已经声明,您需要5000个示例才能看到某种结果。Spacy 2在500-1000时稍微低一点,但您的里程数会有所不同。