我一直在尝试使用#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
答案 0 :(得分:4)
要向实体识别器提供培训示例,您首先需要创建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)