El_*_*rón 2 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=['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()
Run Code Online (Sandbox Code Playgroud)
我将训练数据添加为entity_offsets:
train_data = [
('Monetary contracts are financial instruments between parties', [(23, 44, 'FINANCE')])
]
Run Code Online (Sandbox Code Playgroud)
这对于一个示例和新的实体标签来说效果很好。显然,我希望能够添加多个示例。想法是创建一个带有标记语句的文本文件,问题是spacy需要什么样的格式来训练数据,我应该保留示例中的entity_offset(对于千个句子来说这将是非常繁琐的任务)还是有另一种方法准备文件,例如:
financial instruments FINANCE
contracts FINANCE
Product OBJ
of O
Microsoft ORG
etc ...
Run Code Online (Sandbox Code Playgroud)
以及如何使用上述方法在语料库中传递语料库?我必须使用新创建的模型还是可以将新实体添加到旧模型中,如何实现?
更新 我设法导入了包含训练数据的文件,该文件将被上述训练方法识别。该列表将如下所示:
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
...
Run Code Online (Sandbox Code Playgroud)
但是培训表现不佳,我认为这是由于培训数据少所致。我将测试语料库中的所有条目标记为FINANCE或将其全部标记为BANKING。为了获得更好的性能,我的火车数据需要多大?
我想我可能要为可能的训练数据添加更大的语料。可以用其他方式完成吗?
spacy命名实体识别器背后的算法是什么?
谢谢你的帮助。
我的环境
spaCy版本:1.7.3平台:Windows-7-6.1.7601-SP1 Python版本:3.6.0安装的模型:zh,en_core_web_md
小智 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()
Run Code Online (Sandbox Code Playgroud)
或为简化此操作,您可以尝试以下代码
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3809 次 |
| 最近记录: |