web-dev-qa-db-fra.com

Évaluation dans un modèle NER Spacy

J'essaie d'évaluer un modèle NER formé créé à l'aide de lib de spacy . Normalement, pour ce type de problèmes, vous pouvez utiliser le score f1 (un rapport entre la précision et le rappel). Je n'ai pas pu trouver dans la documentation une fonction de précision pour un modèle NER formé.

Je ne sais pas si c'est correct mais j'essaye de le faire de la manière suivante (exemple) et en utilisant f1_score de sklearn:

from sklearn.metrics import f1_score
import spacy
from spacy.gold import GoldParse


nlp = spacy.load("en") #load NER model
test_text = "my name is John" # text to test accuracy
doc_to_test = nlp(test_text) # transform the text to spacy doc format

# we create a golden doc where we know the tagged entity for the text to be tested
doc_gold_text= nlp.make_doc(test_text)
entity_offsets_of_gold_text = [(11, 15,"PERSON")]
gold = GoldParse(doc_gold_text, entities=entity_offsets_of_gold_text)

# bring the data in a format acceptable for sklearn f1 function
y_true = ["PERSON" if "PERSON" in x else 'O' for x in gold.ner]
y_predicted = [x.ent_type_ if x.ent_type_ !='' else 'O' for x in doc_to_test]
f1_score(y_true, y_predicted, average='macro')`[1]
> 1.0

Toutes les pensées ou les idées sont utiles.

16
Mpizos Dimitris

Pour ceux qui ont la même question dans le lien suivant:

spaCy/scorer.py

vous pouvez trouver différentes métriques, notamment: fscore, rappel et précision. Un exemple utilisant scorer:

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

def evaluate(ner_model, examples):
    scorer = Scorer()
    for input_, annot in examples:
        doc_gold_text = ner_model.make_doc(input_)
        gold = GoldParse(doc_gold_text, entities=annot)
        pred_value = ner_model(input_)
        scorer.score(pred_value, gold)
    return scorer.scores

# example run

examples = [
    ('Who is Shaka Khan?',
     [(7, 17, 'PERSON')]),
    ('I like London and Berlin.',
     [(7, 13, 'LOC'), (18, 24, 'LOC')])
]

ner_model = spacy.load(ner_model_path) # for spaCy's pretrained use 'en_core_web_sm'
results = evaluate(ner_model, examples)

input_ est le texte (ex. "mon nom est John") et annot est les annotations (ex. [(11,16, "PEOPLE")]]

Le scorer.scores renvoie plusieurs scores. L'exemple est tiré de exemple spaCy dans github (le lien ne fonctionne plus)

20
Mpizos Dimitris