2017-04-11 44 views
0

我一直在试图训练一个模型#887使用相同的方法,只是为了一个测试用例。 我有一个问题,训练语料库在空间导入的最佳格式是什么。我有一个带有实体列表的文本文件,需要用于标记的新实体。 让我解释一下我的情况,我按照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')]) 
] 

这是为一个例子,新的实体做工精细标签。很显然,我希望能够添加多个示例。这个想法是创建一个带有标记句子的文本文件,问题是训练数据需要什么样的格式,我是否应该从例子中保留entity_offset(这对于1000个句子来说是一项非常单调的任务),还是有另一种方法准备文件,如:

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

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

UPDATE 我设法导入具有将由上述训练方法被识别的训练数据的文件。 名单看​​起来就像这样:

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命名实体识别器的算法是什么?

感谢您的任何帮助。

我的环境

spaCy版本:1.7.3 平台:Windows的7-6.1.7601-SP1 Python版本:3.6.0 敷设模型:恩,en_core_web_md

+0

spacy的制造商都表示,你将需要5000个实例能够看到某种结果。 Spacy 2在500 - 1000的时候会低一点,但你的里程会有所不同。 – TheM00s3

回答

2

提供训练实例对于实体识别器,您首先需要创建一个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)