照理说这个是在公司的产出,不该放到外面的,不过鉴于在WWW上实在搜不到相关东西,就把自己搜索、请教、查看、总结的东西贴出来,希望能够有所帮助吧。

简单的说,ROUGE 这个 perl脚本本来就太老了,自身实现得也有些奇怪(为什么要用到DOM?),此外,最惨的就是作者还在MSRA好好的,但是却一点不管这个脚本的死活(好吧,我也没有资格批评人家大佬)。

PERL脚本放到Python里

由于Perl在NLP上已经(算是)被淘汰了,基于此,有许多第三方实现啦,这里列出来一些(主要是Python的):

https://github.com/google/seq2seq/blob/master/seq2seq/metrics/rouge.py  (re-implementation, use SET for multi-NGRAM)
https://github.com/tagucci/pythonrouge (the kernal copys the google/seq2seq/metrics/rouge)
https://github.com/andersjo/pyrouge (wrapper, not in pypi)
https://pypi.python.org/pypi/pyrouge/0.1.0 (wrapper, in pypi)
https://github.com/bdusell/rougescore (re-implementation, use COUNT for mult-NGRAM)
https://github.com/RxNLP/ROUGE-2.0 (re-implementation, use SET for multi-NGRAM, Java)

=> 
re-implementation 是指用原生Python实现的,wrapper是指在PERL脚本上用Python封装了一下;
use SET for multi-NGRAM 和 use COUNT for mult-NGRAM 是指当 gold 和 predict 共现的NGRAM里,某些NGRAM出现了多次,有的算的是uniq个数(SET),有的是COUNT。我看论文是COUNT,究竟如何不确定,毕竟google的seq2seq都是set,而我有没看到PERL里相关部分

直接pip装的话是 https://pypi.python.org/pypi/pyrouge/0.1.0,但是坑也很多,跑test是跑不通的。可以看 Install Rouge and Pyrouge for python 2.7 (conda virtual env) on Linux 64 ,做一点修正。此外,可以在交互式环境里看看这个包的API,还是有些功能的。此外,如果在convert_and_evaluate中指定了rouge_args参数,那么就会报什么找不到smart_xxx.txt的,这个文件在ROUGE-1.5.5的data下,可以看看perl脚本,搜一下这个文件名,可以看到其会依赖一些环境变量,设置一下环境变量就好了。

我后来问了万小军老师和谭继伟大牛,他们说一般在训练的时候自己就写一个简单的程序算一下ROUGE-N和ROUGE-L就好了(可以直接用上面的re-implementation的),真正放到论文里是(或者在整个dev集上跑结果),才有必要调一下PERL脚本来算(这个会写文件,一个summary一个文件)。

中文支持

这才是重点… 直接把结论贴出来:

<1> ROUGE perl 脚本不能直接用在中文上,需要把中文转成英文或数字。

<2> 具体的,应该把每个字都转成一个唯一对应的英文或数字,同时输出的时候符号与符号之间用空格分隔。

<3> 用ROUGE perl评价时,最好一句一段。(看到pyrouge的处理,并无其他reference)

<4> 训练中,一般自己实现一个简单的ROUGE-N或者ROUGE-L。正确的实现,应该是取COUNT (当共现的NGRAM中有多个相同的时候),可以直接使用已有的rouge re-implementation脚本。

<5> 还是要注意中英混合时的tokenize!评估时,英文是词为单位,而中文是字为单位!

已上结论参考了PERL源代码、万老师、谭的回复、以及pythonrouge仓库,具体过程不述。

有问题请report!