2017-07-28 3 views
0

J'utilise plusieurs outils NER pour extraire les Entités Named présentes dans un corpus et je veux tester leur précision en utilisant le module NLTK Python.Comment calculer la précision du système NER?

Certains des outils que j'ai utilisés sont:

Pour obtenir le la précision du système, NLTK accuracy La fonction prend deux arguments: l'ensemble de données correctement annoté (contenant tous les jetons du corpus avec leur classification (PERSON, LOCATION, ORGANIZATION ou 'O' [qui représente que le jeton n'est pas une entité nommée]) et la sortie du Système NER.

Ceci est correct lorsque le NER retourne une liste de tous les jetons avec leur classification. Cependant, certains outils, tels que MeaningCloud, ne renvoient que la classification pour les entités nommées reconnues dans le corpus. Cela rend l'exactitude impossible à obtenir (pour l'obtenir, la liste complète des mots doit être retournée pour que la comparaison entre les deux annotations soit faisable).

Quelle est l'approche ici alors? Que pourrais-je faire pour obtenir l'exactitude dans de tels cas?

Répondre

0

Vous devez créer une liste de balises pour tous les jetons dont la valeur par défaut est 'O'. Si vous regardez MeaningCloud, il semblerait que variant_list inclut les emplacements dans la chaîne d'origine où le jeton a été détecté. Vous pouvez donc l'utiliser pour mapper des étiquettes sur des jetons.

Certains pseudo-code:

def get_label(token, meaningcloud_data): 
    variants = ...[get from meaningcloud_data somehow]... 
    for variant in variant: 
     if token.start_char >= variant.inip and token.end_char <= variant.endp: 
      return variant.label 
    return False 

meaningcloud = get_meaningcloud_data(text) 
labels = [] 
for token in tokens: 
    # default to 'O' 
    labels.push(get_label(token, meaningcloud) or 'O') 

Notez que dans NLTK la norme tokenizer - word_tokenize - ne sauvegarde pas les positions de jeton, de sorte que vous ne pouvez pas reconstruire le document original, sauf si vous êtes absolument sûr des conventions d'espacement . Cela dit NLTK a des moyens de tokenizing et d'obtenir des positions, voir here pour quelques détails.