Code d'évaluation pour diverses mesures automatisées non supervisées pour NLG (génération de langage naturel). Il prend en entrée un fichier d'hypothèse, et un ou plusieurs références aux fichiers et sort les valeurs des métriques. Les lignes entre ces fichiers doivent correspondre au même exemple.
Installez Java 1.8.0 (ou supérieur).
Installez les dépendances Python, exécutez:
pip install git+https://github.com/Maluuba/nlg-eval.git@masterSi vous utilisez la Sierra High MacOS ou supérieure, exécutez-le pour autoriser le multithreading:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YESConfiguration simple (téléchargez les données requises (modèles par exemple, intégres) et fichiers de code externe), exécuter:
nlg-eval --setup Si vous le configurez à partir du code source ou si vous êtes sous Windows et que vous n'utilisez pas de terminal bash, vous pourriez obtenir des erreurs sur nlg-eval qui ne sont pas trouvées. Vous devrez trouver le script nlg-eval . Voir ici pour plus de détails.
# If you don't like the default path (~/.cache/nlgeval) for the downloaded data,
# then specify a path where you want the files to be downloaded.
# The value for the data path is stored in ~/.config/nlgeval/rc.json and can be overwritten by
# setting the NLGEVAL_DATA environment variable.
nlg-eval --setup ${data_path}(Ces exemples ont été fabriqués avec Git Bash sur Windows)
Tous les fichiers de données auraient dû être téléchargés, vous devriez voir des tailles comme:
$ ls -l ~/.cache/nlgeval/
total 6003048
-rw-r--r-- 1 ... 289340074 Sep 12 2018 bi_skip.npz
-rw-r--r-- 1 ... 689 Sep 12 2018 bi_skip.npz.pkl
-rw-r--r-- 1 ... 2342138474 Sep 12 2018 btable.npy
-rw-r--r-- 1 ... 7996547 Sep 12 2018 dictionary.txt
-rw-r--r-- 1 ... 21494787 Jan 22 2019 glove.6B.300d.model.bin
-rw-r--r-- 1 ... 480000128 Jan 22 2019 glove.6B.300d.model.bin.vectors.npy
-rw-r--r-- 1 ... 663989216 Sep 12 2018 uni_skip.npz
-rw-r--r-- 1 ... 693 Sep 12 2018 uni_skip.npz.pkl
-rw-r--r-- 1 ... 2342138474 Sep 12 2018 utable.npy
Vous pouvez également vérifier certaines sommes de contrôle:
$ cd ~/.cache/nlgeval/
$ md5sum *
9a15429d694a0e035f9ee1efcb1406f3 *bi_skip.npz
c9b86840e1dedb05837735d8bf94cee2 *bi_skip.npz.pkl
022b5b15f53a84c785e3153a2c383df6 *btable.npy
26d8a3e6458500013723b380a4b4b55e *dictionary.txt
f561ab0b379e23cbf827a054f0e7c28e *glove.6B.300d.model.bin
be5553e91156471fe35a46f7dcdfc44e *glove.6B.300d.model.bin.vectors.npy
8eb7c6948001740c3111d71a2fa446c1 *uni_skip.npz
e1a0ead377877ff3ea5388bb11cfe8d7 *uni_skip.npz.pkl
5871cc62fc01b79788c79c219b175617 *utable.npy
$ sha256sum *
8ab7965d2db5d146a907956d103badfa723b57e0acffb75e10198ba9f124edb0 *bi_skip.npz
d7e81430fcdcbc60b36b92b3f879200919c75d3015505ee76ae3b206634a0eb6 *bi_skip.npz.pkl
4a4ed9d7560bb87f91f241739a8f80d8f2ba787a871da96e1119e913ccd61c53 *btable.npy
4dc5622978a30cddea8c975c871ea8b6382423efb107d27248ed7b6cfa490c7c *dictionary.txt
10c731626e1874effc4b1a08d156482aa602f7f2ca971ae2a2f2cd5d70998397 *glove.6B.300d.model.bin
20dfb1f44719e2d934bfee5d39a6ffb4f248bae2a00a0d59f953ab7d0a39c879 *glove.6B.300d.model.bin.vectors.npy
7f40ff16ff5c54ce9b02bd1a3eb24db3e6adaf7712a7a714f160af3a158899c8 *uni_skip.npz
d58740d46cba28417cbc026af577f530c603d81ac9de43ffd098f207c7dc4411 *uni_skip.npz.pkl
790951d4b08e843e3bca0563570f4134ffd17b6bd4ab8d237d2e5ae15e4febb3 *utable.npy
Si vous vous assurez que la configuration a réussi, vous pouvez exécuter les tests:
pip install pytest
pytestCela peut prendre quelques minutes et vous pourriez voir des avertissements, mais ils devraient passer.
Une fois la configuration terminée, les mesures peuvent être évaluées avec une API Python ou dans la ligne de commande.
Des exemples de l'API Python peuvent être trouvés dans test_nlgeval.py.
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
Lorsque chaque ligne du fichier d'hypothèse est une phrase générée et que les lignes correspondantes à travers les fichiers de référence sont des phrases de référence de vérité au sol pour l'hypothèse correspondante.
from nlgeval import compute_metrics
metrics_dict = compute_metrics ( hypothesis = 'examples/hyp.txt' ,
references = [ 'examples/ref1.txt' , 'examples/ref2.txt' ]) from nlgeval import compute_individual_metrics
metrics_dict = compute_individual_metrics ( references , hypothesis ) Lorsque references sont une liste des chaînes de texte de référence de vérité au sol et hypothesis est la chaîne de texte d'hypothèse.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_individual_metrics ( references , hypothesis ) Lorsque references sont une liste des chaînes de texte de référence de vérité au sol et hypothesis est la chaîne de texte d'hypothèse.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_metrics ( references , hypothesis ) Lorsque references sont une liste de listes de chaînes de texte de référence de vérité au sol et hypothesis est une liste des chaînes de texte d'hypothèse. Chaque liste intérieure dans references est un ensemble de références pour l'hypothèse (une liste de chaînes de référence uniques pour chaque phrase dans hypothesis dans le même ordre).
Si vous utilisez ce code dans le cadre de toute recherche publiée, veuillez citer l'article suivant:
Shikhar Sharma, Layla El Asri, Hannes Schulz et Jeremie Zumer. "Pertinence des mesures non supervisées dans le dialogue axé sur les tâches pour évaluer la génération du langage naturel" Arxiv Preprint Arxiv: 1706.09799 (2017)
@article { sharma2017nlgeval ,
author = { Sharma, Shikhar and El Asri, Layla and Schulz, Hannes and Zumer, Jeremie } ,
title = { Relevance of Unsupervised Metrics in Task-Oriented Dialogue for Evaluating Natural Language Generation } ,
journal = { CoRR } ,
volume = { abs/1706.09799 } ,
year = { 2017 } ,
url = { http://arxiv.org/abs/1706.09799 }
}En cours d'exécution
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
donner
Bleu_1: 0.550000
Bleu_2: 0.428174
Bleu_3: 0.284043
Bleu_4: 0.201143
METEOR: 0.295797
ROUGE_L: 0.522104
CIDEr: 1.242192
SPICE: 0.312331
SkipThoughtsCosineSimilarity: 0.626149
EmbeddingAverageCosineSimilarity: 0.884690
VectorExtremaCosineSimilarity: 0.568696
GreedyMatchingScore: 0.784205
Si vous avez des problèmes avec Meteor, vous pouvez essayer de réduire la variable mem dans Meteor.py
Le cidre par défaut (avec des paramètres IDF définis sur le mode "Corpus") calcule les valeurs IDF en utilisant les phrases de référence fournies. Ainsi, le score de cidre pour un ensemble de données de référence avec seulement 1 image (ou exemple pour NLG) sera nul. Lorsque vous évaluez à l'aide d'une (ou quelques) images, définissez la FDI sur "Coco-Val-DF" à la place, qui utilise IDF à partir de l'ensemble de données MSCOCO VAILDATION pour des résultats fiables. Cela n'a pas été adapté dans ce code. Pour ce cas d'utilisation, appliquez des patchs de VRAMA91 / Coco-Caption.
Pour monter un répertoire de données déjà préparé dans un conteneur Docker ou les partager entre les utilisateurs, vous pouvez définir la variable d'environnement NLGEVAL_DATA pour permettre à NLG-Eval de savoir où trouver ses modèles et ses données. Par exemple
NLGEVAL_DATA=~/workspace/nlg-eval/nlgeval/data
Cette variable remplace la valeur fournie lors de la configuration (stockée dans ~/.config/nlgeval/rc.json )
Ce projet a adopté le code de conduite open source Microsoft. Pour plus d'informations, consultez le code de conduite FAQ ou contactez [email protected] avec toute question ou commentaire supplémentaire.
Voir Licence.Md.