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
来自的你,很高兴你能看到这儿。若本文对你有所用处,或者内容有什么不足之处,敬请毫不犹豫给个回复。谢谢!