Código de evaluación para varias métricas automatizadas no supervisadas para NLG (generación de lenguaje natural). Se necesita como entrada un archivo de hipótesis, y uno o más referencias de archivos y valores de métricos de salida. Las filas a través de estos archivos deben corresponder al mismo ejemplo.
Instale Java 1.8.0 (o superior).
Instale las dependencias de Python, ejecute:
pip install git+https://github.com/Maluuba/nlg-eval.git@masterSi está utilizando MacOS High Sierra o superior, ejecute esto para permitir múltiples lecturas:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YESConfiguración simple (descargue los datos requeridos (modelos por ejemplo, incrustaciones) y archivos de código externo), ejecute:
nlg-eval --setup Si está configurando esto desde el código fuente o está en Windows y no usa un terminal de bash, entonces puede obtener errores sobre nlg-eval que no se encuentra. Deberá encontrar el script nlg-eval . Vea aquí para más detalles.
# 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}(Estos ejemplos se hicieron con Git Bash en Windows)
Todos los archivos de datos deberían haberse descargado, debe ver tamaños como:
$ 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
También puede verificar algunas suma de verificación:
$ 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 se asegura de que la configuración fuera exitosa, puede ejecutar las pruebas:
pip install pytest
pytestPuede tomar unos minutos y es posible que vea advertencias, pero deben pasar.
Una vez que se ha completado la configuración, las métricas se pueden evaluar con una API de Python o en la línea de comando.
Se pueden encontrar ejemplos de la API de Python en test_nlgeval.py.
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
Cuando cada línea en el archivo de hipótesis es una oración generada y las líneas correspondientes a través de los archivos de referencia son oraciones de referencia de verdad de tierra para la hipótesis correspondiente.
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 ) Donde references es una lista de cadenas de texto de referencia de verdad en tierra y hypothesis es la cadena de texto de hipótesis.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_individual_metrics ( references , hypothesis ) Donde references es una lista de cadenas de texto de referencia de verdad en tierra y hypothesis es la cadena de texto de hipótesis.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_metrics ( references , hypothesis ) Donde references es una lista de listas de cadenas de texto de referencia de verdad en tierra y hypothesis es una lista de cadenas de texto de hipótesis. Cada lista interna en references es un conjunto de referencias para la hipótesis (una lista de cadenas de referencia individuales para cada oración en hypothesis en el mismo orden).
Si usa este código como parte de cualquier investigación publicada, cite el siguiente documento:
Shikhar Sharma, Layla El Asri, Hannes Schulz y Jeremie Zumer. "Relevancia de las métricas no supervisadas en el diálogo orientado a las tareas para evaluar la generación del lenguaje natural" 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 }
}Correr
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
da
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 tiene problemas con Meteor, puede intentar reducir la variable mem en Meteor.py
La sidra de forma predeterminada (con el parámetro IDF establecido en el modo "Corpus") calcula los valores de IDF utilizando las oraciones de referencia proporcionadas. Por lo tanto, la puntuación de sidra para un conjunto de datos de referencia con solo 1 imagen (o ejemplo para NLG) será cero. Al evaluar el uso de una (o pocas) imágenes, establezca IDF en "Coco-Val-DF" en su lugar, que usa IDF del conjunto de datos de Vaildation MSCOCO para obtener resultados confiables. Esto no se ha adaptado en este código. Para este caso de uso, aplique parches de VRAMA91/COCO-Caption.
Para montar un directorio de datos ya preparado a un contenedor Docker o compartirlo entre los usuarios, puede establecer la variable de entorno NLGEVAL_DATA para que NLG-EVAL sepa dónde encontrar sus modelos y datos. P.ej
NLGEVAL_DATA=~/workspace/nlg-eval/nlgeval/data
Esta variable anula el valor proporcionado durante la configuración (almacenado en ~/.config/nlgeval/rc.json )
Este proyecto ha adoptado el Código de Conducta Open Open Microsoft. Para obtener más información, consulte el Código de Conducta Preguntas frecuentes o comuníquese con [email protected] con cualquier pregunta o comentario adicional.
Ver licencia. MD.