Есть ли способ с NER spaCy для расчета показателей для типа объекта? - PullRequest
0 голосов
/ 17 октября 2018

Есть ли способ в модели NER в spaCy извлечь метрики (точность, отзыв, оценка f1) по типу сущности?

Что-то похожее на это:

         precision    recall  f1-score   support

  B-LOC      0.810     0.784     0.797      1084
  I-LOC      0.690     0.637     0.662       325
 B-MISC      0.731     0.569     0.640       339
 I-MISC      0.699     0.589     0.639       557
  B-ORG      0.807     0.832     0.820      1400
  I-ORG      0.852     0.786     0.818      1104
  B-PER      0.850     0.884     0.867       735
  I-PER      0.893     0.943     0.917       634

в среднем / 0,809 0,787 0,796 6178

взято из: http://www.davidsbatista.net/blog/2018/05/09/Named_Entity_Evaluation/

Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

@ gdaras ответ не верный.Первый комментарий дает идею почему.Вы должны отфильтровать сущности

pred_value = nlp(input_)

Я сделал это так

pred_value.ents = [e for e in pred_value.ents if e.label_ == ent]
0 голосов
/ 09 июля 2019

Я работал над этим, и теперь он интегрирован в рамках этого запроса извлечения .

Теперь вам просто нужно позвонить Scorer().scores, и он вернет обычный диктдополнительный ключ, ents_per_type, который будет содержать метрики Precision, Recall и F1-Score для каждой сущности.

Надеюсь, это поможет!

0 голосов
/ 17 ноября 2018

Хороший вопрос.

Сначала мы должны уточнить, что spaCy использует схему аннотации BILUO вместо схемы аннотации BIO, на которую вы ссылаетесь.Из просторной документации буквы обозначают следующее:

  • B: первый токен объекта с несколькими токенами.
  • I: внутренний токенобъект с несколькими токенами.
  • L: последний токен объекта с несколькими токенами.
  • U: объект с одним токеном.
  • O: токен без объекта.

Затем, некоторые определения:

definitions

Spacy имеет встроенный класс для оценки NER.Это называется бомбардир .Scorer использует точное соответствие для оценки NER.Оценка точности возвращается как ents_p, вызов - как ents_r, а оценка F1 - как ents_f.

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

Все вместе код должен выглядеть следующим образом:

import spacy
from spacy.gold import GoldParse
from spacy.scorer import Scorer

def evaluate(nlp, examples, ent='PERSON'):
    scorer = Scorer()
    for input_, annot in examples:
        text_entities = []
        for entity in annot.get('entities'):
            if ent in entity:
                text_entities.append(entity)
        doc_gold_text = nlp.make_doc(input_)
        gold = GoldParse(doc_gold_text, entities=text_entities)
        pred_value = nlp(input_)
        scorer.score(pred_value, gold)
    return scorer.scores


examples = [
    ("Trump says he's answered Mueller's Russia inquiry questions \u2013 live",{"entities":[[0,5,"PERSON"],[25,32,"PERSON"],[35,41,"GPE"]]}),
    ("Alexander Zverev reaches ATP Finals semis then reminds Lendl who is boss",{"entities":[[0,16,"PERSON"],[55,60,"PERSON"]]}),
    ("Britain's worst landlord to take nine years to pay off string of fines",{"entities":[[0,7,"GPE"]]}),
    ("Tom Watson: people's vote more likely given weakness of May's position",{"entities":[[0,10,"PERSON"],[56,59,"PERSON"]]}),
]

nlp = spacy.load('en_core_web_sm')
results = evaluate(nlp, examples)
print(results)

Вызовите функцию оценки с помощьюправильный параметр ent для получения результатов для каждого тега.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...