Почему мой бомбардир SpaCy v3 возвращает 0 для точности, отзыва и f1?

#spacy #named-entity-recognition #precision-recall #spacy-3

Вопрос:

У меня есть следующий код (миграция из SpaCy v2), в котором я хотел бы рассчитать точность, отзыв и оценку f1 для данной модели:

 nlp = spacy.load("my_model")
scorer = Scorer(nlp)
examples = []
for text, annotations in TEST_DATA:
    examples.append(Example.from_dict(nlp.make_doc(text), annotations))
results = scorer.score(examples)
print(
    "Precision {:0.4f}tRecall {:0.4f}tF-score {:0.4f}".format(results['ents_p'], results['ents_r'], results['ents_f'])
)
 

Самое странное, что я пытаюсь понять, это почему он всегда возвращается

 Precision 0.0000    Recall 0.0000   F-score 0.0000
 

Мой набор TEST_DATA находится в той же форме, что и набор TRAIN_DATA, который я использовал для обучения той же модели. Вот как это выглядит:

 [
    (
        'Line 106 – for dilution times, the units should be specified', {'entities': [(51, 60, 'ACTION'), (41, 47, 'MODAL'), (11, 40, 'CONTENT'), (0, 8, 'LOCATION')]}
    ),
    (
        'It should be indicated what test was applied  to verify the normality of distribution.', {'entities': [(13, 22, 'ACTION'), (28, 85, 'CONTENT'), (3, 9, 'MODAL')]}
    )
]
 

Ответ №1:

Оценщик не запускает конвейер для прогнозируемых документов, поэтому вы оцениваете пустые документы в своих тестовых наборах.

Вместо этого рекомендуется использовать nlp.evaluate :

 scores = nlp.evaluate(examples)
 

Если вы по какой-то причине хотите вызвать оценщика напрямую, другой альтернативой является запуск конвейера на прогнозируемых документах ( nlp вместо nlp.make_doc ), поэтому:

 example = Example.from_dict(nlp(text), annots)
 

Комментарии:

1. Большое спасибо за ответ, это работает и сейчас 🙂 Побочный вопрос: есть ли способ разделить оценки на ЛАБАЛЫ, чтобы установить одну оценку на ЭТИКЕТКУ?

2. Посмотрите на ents_per_type ?

3. Спасибо, теперь все хорошо. Очень ценю вашу помощь