首页 > 解决方案 > 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 培训。这可能吗?有更好的解决方案或方法吗?

标签: pythonmachine-learningnlpdata-sciencespacy

解决方案


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)

推荐阅读