Обучение собственной модели и добавление новых сущностей с простором

Я пытался обучить модель тем же методом, который используется в #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 из примеров (это будет очень утомительным заданием для тысяч предложений) или есть другой метод подготовить файл, например:

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

И как я могу передать корпус в spcay, используя упомянутый метод? Нужно ли использовать новую созданную модель или я могу добавить новые объекты в старую модель, как этого можно достичь?

ОБНОВЛЕНИЕ Мне удалось импортировать файл с данными обучения, которые будут распознаваться по методу обучения, описанному выше. Список будет выглядеть так:

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. Насколько большими должны быть данные моего поезда, чтобы получить лучшую производительность?

Я предполагаю, что мне придется аннотировать больший корпус для тренировочных данных. Можно ли это сделать по-другому?

Какой алгоритм стоит за просторным Named Entity Recognizer?

Спасибо за любую помощь.

Моя среда

версия spaCy: 1.7.3 Платформа: Windows-7-6.1.7601-SP1 Версия Python: 3.6.0 Установленные модели: en, en_core_web_md

1 ответ

Решение

Чтобы предоставить обучающие примеры для распознавателя сущностей, сначала необходимо создать экземпляр класса 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)
Другие вопросы по тегам