链接:https://www.zhihu.com/question/304798594/answer/567383628
这些指标都是用于在有监督的情况下评价文本生成质量的,大概做法都是比较某条候选文本(一般是机器生成的)和其他若干参考文本(一般是人类标注的)的相似性,不过适用场合略有区别:BLEU, METEOR, ROUGE 一般在翻译里用,CIDEr 一般在图像字幕生成里用。
1、BLEU 是最早提出的机器翻译评价指标,是所有文本评价指标的源头,怎么吹都不为过。这也是现在机器翻译评价的事实标准,有标准的 perl 测评脚本,这样大家用起来就不会有什么实现上的偏差;Python 实现也很多,我记得 NLTK 工具箱里就有。
BLEU 的大意是比较候选译文和参考译文里的 n-gram(实践中从 unigram 取到 4-gram) 重合程度,重合程度越高就认为译文质量越高。选不同长度的 n-gram 是因为,unigram 的准确率可以用于衡量单词翻译的准确性,更高阶的 n-gram 的准确率可以用来衡量句子的流畅性。
这是一个只看中准确率的指标,就是说更加关心候选译文里的多少 n-gram 是对的(即在参考译文里出现了),而不在乎召回率(参考译文里有哪些 n-gram 在候选译文中没出现)。不过这不算特别严重的问题,因为 BLEU 原论文建议大家的测试集里给每个句子配备 4 条参考译文,这样就可以减小语言多样性带来的影响(然而现在很多机器翻译的测试集都是只有 1 条译文,尴尬= =);另外还有 brevity penalty 来惩罚候选译文过短的情况(候选译文过短在机器翻译中往往意味着漏翻,也就是低召回率)。
但总的来说,现在还是普遍认为 BLEU 指标偏向于较短的翻译结果(brevity penalty 没有想象中那么强)。
2、METEOR 大意是说有时候翻译模型翻译的结果是对的,只是碰巧跟参考译文没对上(比如用了一个同义词),于是用 WordNet 等知识源扩充了一下同义词集,同时考虑了单词的词形(词干相同的词也认为是部分匹配的,也应该给予一定的奖励,比如说把 likes 翻译成了 like 总比翻译成别的乱七八糟的词要好吧?)。在评价句子流畅性的时候,用了 chunk 的概念(候选译文和参考译文能够对齐的、空间排列上连续的单词形成一个 chunk,这个对齐算法是一个有点复杂的启发式 beam serach),chunk 的数目越少意味着每个 chunk 的平均长度越长,也就是说候选译文和参考译文的语序越一致。最后还有召回率和准确率两者都要考虑,用 F 值作为最后的评价指标。
METEOR 的缺点也很明显,其一是只有 Java 实现,而且还是 jar 包不是 API,只能算整个测试集上的 METEOR 而不是每条语句单独测(除非你把每条语句单独写到文件里然后调 jar 包),实在是太蠢了。在 Python 统治深度学习的当下,可想而知很少有人用这个指标……不过关于这一点,我以前照着原作者的 Java 代码复现过一个 Python 版本的,后来忙毕业论文就没管,最近看一看如果代码还在的话推到 github 上吧(如果有人关心的话)。其二是有四个超参数 alpha, beta, gamma, delta,这些都是对着某个数据集调出来的(让算法的结果和人的主观评价尽可能一致,方法我记得是 grid search),参数一多听起来就不靠谱,我只想用冯诺依曼的话来吐槽:With four parameters I can fit an elephant, and with five I can make him wiggle his trunk. 其三是需要有外部知识源(WordNet 等)来进行单词对齐,所以对于 WordNet 中不包含的语言,就没法用 METEOR 来评价了。后两点作者自己倒是给了一些解决方案,但是越搞越复杂,比如说从语料里自动挖掘同义词集这样就不需要 WordNet 了(但是你挖掘到的同义词可能有错的啊,而且用训练集挖掘语言知识那不是在某种程度上等于自己评价自己,又当运动员又当裁判,作弊啊)、比如说用多种语言的人类评分数据集拟合了一下 alpha, beta 各种参数然后给出默认值说对所有语言都能用(号称 Universal Meteor,因为对任意语言都能用;但是对于某些特定语言,还是使用在数据集上调过的参数更好)等等。对此我只能说,这么一点儿破事灌这么多水,是在下输了,我怎么就不会灌水呢。
3、ROUGE 和 BLEU 几乎一模一样,区别是 BLEU 只计算准确率,而 ROUGE 只计算召回率。ROUGE 用作机器翻译评价指标的初衷是这样的:在 SMT(统计机器翻译)时代,机器翻译效果稀烂,需要同时评价翻译的准确度和流畅度;等到 NMT (神经网络机器翻译)出来以后,神经网络脑补能力极强,翻译出的结果都是通顺的,但是有时候容易瞎翻译,比如改个人名/数字啊、扔掉半句话啊这种情况很常见。于是有人说,那我们不看流畅度只看召回率(参考译文里的 n-gram 有多少出现在了候选译文中)就好了,这样就能知道 NMT 系统到底有没有漏翻(这会导致低召回率)。所以,ROUGE 只适合评价 NMT,而不适用于 SMT,因为它不管候选译文流不流畅。
4、CIDEr 我没仔细研究过,随便说一下哈,不一定对。CIDEr 是 BLEU 和向量空间模型的结合。它把每个句子看成文档,然后计算 TF-IDF 向量(只不过 term 是 n-gram 而不是单词)的余弦夹角,据此得到候选句子和参考句子的相似度,同样是不同长度的 n-gram 相似度取平均得到最终结果。优点是不同的 n-gram 随着 TF-IDF 的不同而有不同的权重,因为整个语料里更常见的 n-gram 包含了更小的信息量。图像字幕生成评价的要点是看模型有没有抓取到关键信息,比如说一幅图的内容是『白天一个人在游泳池游泳』,其中最关键的信息应该是『游泳』,生成字幕时如果包含或者漏掉了一些别的信息(比如说『白天』)其实是无关紧要的,所以需要这么一种对非关键词降权的操作。
在机器翻译中,译文应该忠实于原文,所以同一句话的多条译文应该互为转述,包含同样的信息;而同一幅图的多条字幕则不一定互为转述,因为不同的字幕可以包含不同数量的图像细节,不管描述得比较详细还是比较粗糙都是正确的字幕。