nlg-eval
用于NLG(自然语言生成)的各种无监督自动化指标的评估代码。它将一个假设文件和一个或多个参考文件作为输入,并输出指标的值。跨这些文件的行应对应相同的示例。
指标
- BLEU
- METEOR
- ROUGE
- CIDEr
- SPICE
- SkipThought 余弦相似度
- 嵌入平均余弦相似度
- 向量极值余弦相似度
- 贪婪匹配分数
设置
安装Java 1.8.0(或更高版本)。
安装Python依赖项,运行:
pip install git+https://github.com/Maluuba/nlg-eval.git@master
如果您使用的是macOS High Sierra或更高版本,则运行以下命令以允许多线程:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
简单设置(下载所需数据(例如模型、嵌入)和外部代码文件),运行:
nlg-eval --setup
如果您是从源代码设置这个或使用Windows而不是Bash终端,您可能会遇到找不到nlg-eval
的错误。您需要找到nlg-eval
脚本。查看此处了解详情。
自定义设置
# 如果您不喜欢默认路径(~/.cache/nlgeval)用于下载数据,
# 可以指定要下载文件的路径。
# 数据路径的值存储在~/.config/nlgeval/rc.json中,可以通过设置NLGEVAL_DATA环境变量覆盖。
nlg-eval --setup ${data_path}
验证设置(可选)###
(这些示例是在Windows上使用Git Bash做的)
所有数据文件都应该已下载,您应该会看到如下大小:
$ 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
您还可以验证一些校验和:
$ 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
如果您不确定设置成功,您可以运行测试:
pip install pytest
pytest
这可能需要几分钟,您可能会看到警告,但应该会通过。
用法
设置完成后,可以使用Python API或在命令行中评估指标。
有关Python API的示例,请参见test_nlgeval.py。
独立运行
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
在假设文件中的每一行是一个生成的句子,而参考文件中的对应行是该假设的真实参考句子。
功能性API:用于整个语料库
from nlgeval import compute_metrics
metrics_dict = compute_metrics(hypothesis='examples/hyp.txt',
references=['examples/ref1.txt', 'examples/ref2.txt'])
功能性API:仅用于一个句子
from nlgeval import compute_individual_metrics
metrics_dict = compute_individual_metrics(references, hypothesis)
其中references
是包含真实参考文本字符串的列表,hypothesis
是假设文本字符串。
面向对象的API,用于脚本中的重复调用——单个示例
from nlgeval import NLGEval
nlgeval = NLGEval() # 加载模型
metrics_dict = nlgeval.compute_individual_metrics(references, hypothesis)
其中references
是包含真实参考文本字符串的列表,hypothesis
是假设文本字符串。
面向对象的API,用于脚本中的重复调用——多个示例
from nlgeval import NLGEval
nlgeval = NLGEval() # 加载模型
metrics_dict = nlgeval.compute_metrics(references, hypothesis)
其中references
是包含真实参考文本字符串列表的列表,hypothesis
是假设文本字符串的列表。references
中的每个内部列表是hypothesis
的一个参考集合(按相同顺序,每个句子的单个参考字符串列表)。
参考文献
如果在任何已发表的研究中使用此代码,请引用以下论文:
Shikhar Sharma, Layla El Asri, Hannes Schulz, 和 Jeremie Zumer. "Relevance of Unsupervised Metrics in Task-Oriented Dialogue for Evaluating Natural Language Generation" 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}
}
示例
运行
nlg-eval --hypothesis=examples/hyp.txt --references=examples/ref1.txt --references=examples/ref2.txt
输出
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
故障排除
如果在使用Meteor时遇到问题,可以尝试在meteor.py中降低mem
变量。
重要说明
默认情况下(idf参数设置为“corpus”模式),CIDEr使用提供的参考句子计算IDF值。因此,对于仅包含1张图像(或NLG示例)的参考数据集,CIDEr分数将为零。在使用一个(或几个)图像进行评估时,将idf设置为“coco-val-df”,这使用MSCOCO验证数据集的IDF以获得可靠的结果。这未在此代码中适配。对于这种用例,请应用vrama91/coco-caption的补丁。
外部数据目录
要将已经准备好的数据目录挂载到Docker容器或在用户之间共享,可以设置NLGEVAL_DATA
环境变量,以告知nlg-eval模型和数据的位置。例如
NLGEVAL_DATA=~/workspace/nlg-eval/nlgeval/data
这个变量将覆盖设置期间提供的值(存储在~/.config/nlgeval/rc.json
中)。
Microsoft 开源行为准则
本项目采纳了Microsoft的开源行为准则。 有关更多信息,请参阅行为准则常见问题解答或 联系opencode@microsoft.com以获取任何其他问题或意见。
许可证
查看LICENSE.md。