CRF++ 的测试结果统计

crf++ 是一个开源工具,是自然语言处理的一把利器。它可以编译为 crf_learn 和 crf_test 两个 bin 文件。测试的结果是将预测的结果和真实的结果进行比对。可惜这东西比对完也不给个统计，真教人不爽。幸亏，有人做了个 perl 工具 conlleval 可以用来分析测试结果。

有个说明文档可以见这儿。

FIX: 若官方链接挂了, 可参考此处: conlleval.pl

将下载下来的 txt 文档,改名为 conlleval.pl 或者任何你喜欢的。然后 chmod+x 它,使其可以被执行.

使用的时候将crf_test的文件重定位到文件output.txt中

conlleval.pl < output.txt

将测试结果重定向到.pl文件的输入,它就会分析输入内容,给出统计结果.

有时候，一个错误出现了

conlleval: unexpected number of features in line XXX XX XX

何哉？查看源代码:

if (@features < 2) {
die "conlleval: unexpected number of features in line $line\n";
}

为啥feature不够数量呢？

再看前文，说默认是用空格为分隔符。但实际上crf++使用的是tab做分隔符

所以这些4列被认为是1列。

fix 如下:

conlleval -d "\t" < output.txt

注意此处的-d后参数。试验证明，此处输入一个制表符也是可以的，但是shell输入制表符真是个蛋疼的事情，所以可以用’\t’代替。

正确的结果长得是如下的样子的

processed 19172 tokens with 9715 phrases; found: 9308 phrases; correct: 7755.
accuracy: 88.95%; precision: 83.32%; recall: 79.83%; FB1: 81.53
ADJP: precision: 58.11%; recall: 25.00%; FB1: 34.96 74
ADVP: precision: 65.44%; recall: 53.29%; FB1: 58.75 272
CONJP: precision: 0.00%; recall: 0.00%; FB1: 0.00 0
INTJ: precision: 0.00%; recall: 0.00%; FB1: 0.00 0
NP: precision: 81.50%; recall: 79.54%; FB1: 80.51 4957
PP: precision: 88.96%; recall: 95.27%; FB1: 92.01 2129
PRT: precision: 0.00%; recall: 0.00%; FB1: 0.00 0
SBAR: precision: 84.62%; recall: 34.38%; FB1: 48.89 78
VP: precision: 85.32%; recall: 80.61%; FB1: 82.90 1798