Código de avaliação para várias métricas automatizadas não supervisionadas para NLG (geração de linguagem natural). É preciso como entrada um arquivo de hipótese e um ou mais arquivos de referência e produz valores de métricas. As linhas nesses arquivos devem corresponder ao mesmo exemplo.
Instale o Java 1.8.0 (ou superior).
Instale as dependências do Python, execute:
pip install git+https://github.com/Maluuba/nlg-eval.git@masterSe você estiver usando o MacOS High Sierra ou superior, execute isso para permitir o Multithreading:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YESConfiguração simples (download de dados necessários (por exemplo, modelos, incorporados) e arquivos de código externo), execute:
nlg-eval --setup Se você estiver configurando isso a partir do código-fonte ou estiver no Windows e não estiver usando um terminal Bash, poderá obter erros sobre nlg-eval não ser encontrado. Você precisará encontrar o script nlg-eval . Veja aqui para obter detalhes.
# 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}(Esses exemplos foram feitos com o Git Bash nas janelas)
Todos os arquivos de dados deveriam ter sido baixados, você deve ver tamanhos 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
Você também pode verificar algumas somas de cheques:
$ 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
Se você garantir que a configuração tenha sido bem -sucedida, pode executar os testes:
pip install pytest
pytestPode levar alguns minutos e você pode ver avisos, mas eles devem passar.
Depois que a configuração é concluída, as métricas podem ser avaliadas com uma API Python ou na linha de comando.
Exemplos da API Python podem ser encontrados em test_nlgeval.py.
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
Quando cada linha no arquivo de hipótese é uma frase gerada e as linhas correspondentes nos arquivos de referência são frases de referência da verdade no fundamento para a hipótese correspondente.
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 ) Onde references é uma lista de seqüências de texto e hypothesis de texto de referência de verdade é a string de texto da hipótese.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_individual_metrics ( references , hypothesis ) Onde references é uma lista de seqüências de texto e hypothesis de texto de referência de verdade é a string de texto da hipótese.
from nlgeval import NLGEval
nlgeval = NLGEval () # loads the models
metrics_dict = nlgeval . compute_metrics ( references , hypothesis ) Onde references é uma lista de listas de seqüências de texto de referência da verdade e hypothesis é uma lista de sequências de texto de hipótese. Cada lista interna em references é um conjunto de referências para a hipótese (uma lista de seqüências de referência únicas para cada frase em hypothesis na mesma ordem).
Se você usar este código como parte de qualquer pesquisa publicada, cite o seguinte artigo:
Shikhar Sharma, Layla El Asri, Hannes Schulz e Jeremie Zumer. "Relevância de métricas não supervisionadas no diálogo orientado a tarefas para avaliar a geração de linguagem natural" Arxiv pré-impressão 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 }
}Correndo
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
dá
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
Se você tiver problemas com o Meteor, pode tentar diminuir a variável mem em meteor.py
Cidra por padrão (com parâmetros IDF definido como modo "corpus") calcula valores de IDF usando as frases de referência fornecidas. Assim, a pontuação da sidra para um conjunto de dados de referência com apenas 1 imagem (ou exemplo para NLG) será zero. Ao avaliar o uso de uma (ou poucas) imagens, defina o IDF como "Coco-val-DF", que usa o IDF do conjunto de dados do MSCOCO Vaildation para obter resultados confiáveis. Isso não foi adaptado neste código. Para este caso de uso, aplique patches do Vrama91/Coco-Caption.
Para montar um diretório de dados já preparado para um contêiner do Docker ou compartilhá-lo entre os usuários, você pode definir a variável de ambiente NLGEVAL_DATA para informar o NLG-EVAL onde encontrar seus modelos e dados. Por exemplo
NLGEVAL_DATA=~/workspace/nlg-eval/nlgeval/data
Essa variável substitui o valor fornecido durante a configuração (armazenado em ~/.config/nlgeval/rc.json )
Este projeto adotou o Código de Conduta Open Microsoft. Para obter mais informações, consulte o Código de Conduta Perguntas frequentes ou entre em contato com [email protected] com quaisquer perguntas ou comentários adicionais.
Veja License.md.