Как проанализировать NER, обученный с использованием Spacy?

Это простой код, который взят из учебной документации (более или менее). Как только я обучаю модель 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 долл. И т. такие как ['HOME_LOAN_INTEREST_RATE', 'CAR_LOAN_INTEREST_RATE' и т. д.]. Теперь моя проблема все еще может заключаться в том, что все суммы в долларах отсутствуют в словаре. Если это так, как мне решить эту проблему?

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

1 ответ

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')

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

Другие вопросы по тегам