Spacy NER - обучить модель, имеющую только набор сущностей - PullRequest
1 голос
/ 10 января 2020

У меня есть база данных с коллекцией тысяч продуктов, и мы работаем над модулем 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')]})
]

Я изо всех сил пытаюсь найти способ просто передать коллекцию со всеми нашими продуктами для выполнения простора подготовка. Это возможно? Есть ли лучшее решение или подход?

1 Ответ

1 голос
/ 11 января 2020

Создатели spaCy заявили, что вам понадобится 5000 примеров, чтобы увидеть какие-то результаты. 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)
...