python - Spacy NER - 训练仅具有实体集合的模型
问题描述
我有一个包含数千种产品的数据库,我们正在系统上开发一个 NLP 模块,该模块应该能够读取文本并从中识别所有产品。
问题是:我们有许多要标记的实体,但我们没有足够的样本来训练模型。所以我们所做的只是生成一些随机文本并添加这些实体,如下所示:
Training_data = [
("I'm looking for the P1.\n", {'entities': [(20, 22, 'Product')]}),
('I bought P2 last week.\n', {'entities': [(9, 11, 'Product')]}),
('P1 is better than P2.', {'entities': [(0, 2, 'Product'), (18, 20, 'Product')]})
]
我正在努力寻找一种方法来通过我们所有产品的集合来执行 spacy 培训。这可能吗?有更好的解决方案或方法吗?
解决方案
spaCy 的制造商表示,您需要 5,000 个示例才能看到某种结果。spaCy 2 在 500 - 1000 时稍微低一些,但您的里程会有所不同。
要为实体识别器提供训练示例,您首先需要创建 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)
推荐阅读
- c# - OnMouseUp 没有响应
- c# - C#,写入.txt文件,不删除上一行
- timestamp - Google App Maker - 在 onclick 方法中添加时间戳收集按钮
- java - Spring 等效于 Guice 的 requireBinding
- azure-devops - 如何将现有工作项添加到板?
- node.js - 如何从生产 nodejs 服务器进行身份验证以获取 google 电子表格 API 的令牌
- r - 我正在尝试将“.0”添加到向量中的任何单个数字上
- c++ - C++ 在命名空间中找不到函数
- python - 无法从 Firebird 数据库中读取某些表
- php - 访问 Drupal 段落中的块视图