Как проанализировать NER, обученный с использованием Spacy? - PullRequest
0 голосов
/ 28 января 2019

Это простой код, который взят из учебной документации (более или менее).Как только я обучаю модель NER, используя приведенный ниже обучающий код, я использую nlp(sentence).ents внутри цикла for, чтобы получить именованные сущности.Как видите, я использовал пустую модель spacy.blank('en'), потому что я добавляю новые объекты.Но никакие объекты не обнаружены в тестовом наборе.

import spacy
import random
from spacy.util import compounding
from spacy.util import minibatch
def get_batches(train_data, model_type):
    max_batch_sizes = {'tagger': 32, 'parser': 16, 'ner': 16, 'textcat': 64}
    max_batch_size = max_batch_sizes[model_type]
    if len(train_data) < 1000:
        max_batch_size /= 2
    if len(train_data) < 500:
        max_batch_size /= 2
    batch_size = compounding(1, max_batch_size, 1.001)
    batches = minibatch(train_data, size=batch_size)
    return batches

nlp = spacy.blank('en')
nlp.vocab.vectors.name = 'blank_vector'
optimizer = nlp.begin_training()
for i in range(20):
    random.shuffle(TRAIN_DATA)
    batches = get_batches(TRAIN_DATA, 'ner')
    for batch in batches:
        texts, annotations = zip(*batch)
        nlp.update(texts, annotations, drop=0.5, sgd=optimizer)
#     for text, annotations in TRAIN_DATA:
#         nlp.update([text], [annotations], drop=0.5, sgd=optimizer)
nlp.to_disk('model')

Как можно проанализировать модель, созданную в просторном режиме? Я пытался понять некоторые изэто, глядя на model, который был создан nlp.to_disk('model').Но, к сожалению, я не знал, как добавить необходимую информацию, которая мне нужна.

Мои требования: Учитывайте проценты, например, [20%, 0,5% и т. Д.], И суммы в долларах, например, [$ 100, 100долларов и т. д.] такие случаи будут восприняты как ДЕНЬГИ, ПРОЦЕНТ предварительно обученным NER, но они нужны мне для обнаружения объектов, основанных на использовании, таких как ['HOME_LOAN_INTEREST_RATE', 'CAR_LOAN_INTEREST_RATE' и т. д.].Теперь моя проблема все еще может заключаться в том, что все суммы в долларах отсутствуют в словаре.Если это так, то как мне решить эту проблему?

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 января 2019

Функция update имеет параметр losses, который можно использовать для определения потери модели в каждой итерации.

Кроме того, причина, по которой моя модель NER не нашла теги, которые были в моем наборе данных, заключалась в том, что операция NER (возможно) вообще не выполнялась, поскольку я не нашел папку ner внутри созданной модели.Чтобы это исправить, мы должны создать нечто, называемое труба.

if "ner" not in nlp.pipe_names:
    ner = nlp.create_pipe("ner")
    nlp.add_pipe(ner, last=True)
# otherwise, get it so we can add labels
else:
    ner = nlp.get_pipe("ner")

# add labels
for _, annotations in TRAIN_DATA:
    for ent in annotations.get("entities"):
        ner.add_label(ent[2])

# get names of other pipes to disable them during training
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "ner"]

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

with nlp.disable_pipes(*other_pipes):
    nlp.vocab.vectors.name = 'blank_vector'
    optimizer = nlp.begin_training()
    for i in range(10):
        random.shuffle(TRAIN_DATA)
        losses = {}
        batches = get_batches(TRAIN_DATA, 'ner')
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(texts, annotations, losses=losses, drop=0.1, sgd=optimizer)
            print('Losses:', losses)
nlp.to_disk('model')

Буду читать дальшедокументация, чтобы узнать об оптимизаторах и функциях потерь.Но не стесняйтесь добавлять другой ответ / редактировать это, чтобы обеспечить лучшее объяснение.

...