Как проанализировать 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')
Будет читать больше в документации, чтобы узнать об оптимизаторах и функциях потери. Но не стесняйтесь добавлять другой ответ / редактировать это, чтобы обеспечить лучшее объяснение.