Le calcul de précision et de rappel dans la reconnaissance d'entités nommées

StackOverflow https://stackoverflow.com/questions/1783653

  •  21-09-2019
  •  | 
  •  

Question

Maintenant, je vais rendre compte des résultats de reconnaissance d'entités nommées. Une chose que je trouve un peu déroutant est que ma compréhension de précision et de rappel était que l'on résume tout simplement vrais positifs, vrais négatifs, faux positifs et de faux négatifs sur toutes les classes.

Mais cela semble peu plausible maintenant que je pense à ce que chaque erreur de classification donnerait lieu simultanément à un faux positif et un faux négatif (par exemple un jeton qui aurait dû être étiquetés comme « A », mais a été étiqueté comme « B » est un faux négatif pour « A » et de faux positifs pour « B »). Ainsi, le nombre des faux positifs et des faux négatifs sur toutes les classes seraient les mêmes qui signifie que la précision est (toujours!) Égal à rappeler. Cela ne peut simplement pas être vrai si il y a une erreur dans mon raisonnement et je me demande où il est. Il est certainement quelque chose tout à fait évident et direct, mais il me échappe en ce moment.

Était-ce utile?

La solution

La précision de manière et le rappel est généralement calculé (ce que je l'utilise dans mes papiers) est de mesurer les entités les uns contre les autres. En supposant la vérité du terrain est la suivante (sans differentiaton à quel type d'entités qu'ils sont)

[Microsoft Corp.] CEO [Steve Ballmer] announced the release of [Windows 7] today

a 3 entités.

Supposant votre extraction proprement dite a les éléments suivants

[Microsoft Corp.] [CEO] [Steve] Ballmer announced the release of Windows 7 [today]

Vous avez une correspondance exacte pour Microsoft Corp, faux positifs pour CEO et today, un faux négatif pour Windows 7 et un match pour Steve sous-chaîne

Nous calculons la précision et le rappel en définissant d'abord les critères correspondant. Par exemple, doivent-ils être une correspondance exacte? Est-ce un match si elles se chevauchent du tout? Est-ce que les types d'entité d'importance? En général, nous voulons offrir une précision et un rappel pour plusieurs de ces critères.

Correspondance exacte: True Positifs = 1 (Microsoft Corp., la seule correspondance exacte), Faux Positifs = 3 (CEO, today et Steve, ce qui est une correspondance exacte), Faux Négatifs = 2 (Steve Ballmer et Windows 7)

Precision = True Positives / (True Positives + False Positives) = 1/(1+3) = 0.25
Recall = True Positives / (True Positives + False Negatives) = 1/(1+2) = 0.33

Tous Overlap OK: True Positifs = 2 (Microsoft Corp. et Steve qui chevauche Steve Ballmer), Faux Positifs = 2 (CEO et today), Faux Négatifs = 1 (Windows 7)

Precision = True Positives / (True Positives + False Positives) = 2/(2+2) = 0.55
Recall = True Positives / (True Positives + False Negatives) = 2/(2+1) = 0.66

Le lecteur est alors laissé à déduire que la « vraie performance » (la précision et de rappeler qu'un vérificateur humain impartial donnerait quand le droit d'utiliser le jugement humain de décider qui chevauchent les écarts sont importants, et qui ne sont pas) se situe entre les deux.

Il est souvent utile de signaler le F1 mesure, ce qui est la moyenne harmonique de précision et de rappel, et qui donne une idée de la « performance » lorsque vous avez à troquer la précision contre le rappel.

Autres conseils

Dans le CoNLL-2003 tâche NER , l'évaluation était basée sur correctement marqué entités, non jetons, comme décrit dans le document href="https://www.clips.uantwerpen.be/conll2003/pdf/14247tjo.pdf" au CoNLL 2003 Shared Task : Indépendant de la langue nommée «Entité de reconnaissance. Une entité est correctement marquée si le système identifie une entité du type correct avec le début correct et point final dans le document. Je préfère cette approche en matière d'évaluation, car il est plus proche d'une mesure de la performance sur la tâche réelle; un utilisateur du système NER se soucie des entités, et non pas des jetons individuels.

Cependant, le problème que vous avez décrit existe encore. Si vous marquez une entité de type ORG avec le type LOC vous encourez un faux positif pour LOC et un faux négatif pour ORG. Il y a une discussion intéressante sur le problème dans ce post .

Comme mentionné précédemment, il existe différentes façons de mesurer la performance de NER. Il est possible d'évaluer séparément comment les entités précisément sont détectées en termes de position dans le texte, et en fonction de leur classe (personne, lieu, organisation, etc.). Ou de combiner les deux aspects dans une seule mesure.

Vous trouverez une belle revue dans la thèse suivante: D. Nadeau, semi-entités nommées sous la direction de reconnaissance: Apprendre à reconnaître 100 types d'entités avec peu de supervision (2007) . Jetez un coup d'oeil à la section 2.6. Evaluation des NER .

Il n'y a pas de réponse simple droit à cette question. Il existe une variété de différentes façons de compter les erreurs. Les compétitions CUM utilisé un, d'autres personnes ont utilisé d'autres.

Cependant, pour vous aider avec votre confusion immédiate:

Vous avez un ensemble de balises, non? Quelque chose comme NONE, PERSONNE, ANIMAL, LÉGUMES?

Si un jeton doit être une personne, et vous taguer NONE, alors c'est un faux positif pour NONE et un faux négatif pour personne. Si un jeton doit être NONE et vous tagger personne, il est l'inverse.

Vous obtenez un score pour chaque type d'entité.

Vous pouvez également regrouper les scores.

Pour être clair, ce sont les définitions:

Précision = TP / (TP + FP) = Quelle partie de ce que vous avez trouvé est la vérité terre?

Rappel = TP / (TP + FN) = Quelle partie de la vérité au sol avez-vous récupérer?

ne sera pas nécessairement toujours égal, puisque le nombre de faux négatifs sera égal pas nécessairement le nombre de faux positifs.

Si je comprends bien votre problème, vous affectez chaque jeton à l'un des plus de deux étiquettes possibles. Pour la précision et le rappel au sens, vous devez avoir un binaire classificateur . Donc, vous pouvez utiliser la précision et rappeler si vous formulerait le classificateur comme si un jeton est dans le groupe « A » ou non, puis répétez l'opération pour chaque groupe. Dans ce cas, un classement manqué compterait deux fois un faux négatif pour un groupe et un faux positif pour un autre.

Si vous faites un classement comme celui-ci où il n'est pas binaire (assigner chaque jeton à un groupe), il pourrait être utile au lieu de regarder paires de jetons. Formulez votre problème « sont des jetons X et Y dans le même groupe de classification? ». Cela vous permet de calculer la précision et le rappel sur toutes les paires de noeuds. Ce n'est pas le cas échéant, si vos groupes de classification sont étiquetés ou ont des significations associées. Par exemple, si vos groupes de classification sont des « fruits » et « légumes », et vous classez les « pommes » et « oranges » comme « légumes », alors cet algorithme marquerait comme un vrai positif même si le mauvais groupe a été affecté. Mais si vos groupes sont unlabled, par exemple « A » et « B », alors si les pommes et les oranges ont tous deux été classés comme « A », par la suite on peut dire que « A » correspond à « Fruits ».

Si vous formez un modèle NER spacy alors leur API scorer.py qui vous donne la précision, le rappel et le rappel de votre NER.

Le code et la sortie serait dans ce format: -

17

Pour ceux ayant une même question dans le lien suivant:

Spacy / scorer.py 'Python' '

Importer spacy

de GoldParse d'importation spacy.gold

de Scorer d'importation spacy.scorer

évaluer def (ner_model, exemples):

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

exemple run

Exemples = [     ( 'Qui est Shaka Khan?',      [(7, 17, 'personne')]),     ( «J'aime Londres et Berlin. »,      [(7, 13, 'LOC'), (18, 24, 'LOC')]) ]

ner_model = spacy.load (ner_model_path) # pour une utilisation de Spacy pré-entraîné 'de en_core_web_sm' résultats = évaluer (ner_model, exemples) « » » Sortie sera au format comme: - { 'UAS': 0.0, 'las': 0.0, ents_p : 43,75, ents_r : 35,59322033898305, ents_f : 39,252336448598136, 'tags_acc': 0.0, 'token_acc': 100,0} texte fort

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top