CRF++ 是著名的条件随机场开源工具,也是目前综合性能最佳的 CRF 工具。本文简要介绍其使用方法。
一、 工具包的下载:
a) http://crfpp.sourceforge.net
其中有两种,一种是 Linux 下(带源码)的,一种是 win32 的,当然是在什么平台下用就下载什么版本了。
b) http://download.csdn.net/source/1425683
两种版本打成一个包了。
二、 安装:
a) Windows 版的无须安装,直接解压即可使用;
b) Linux 版本的安装方法是:
i. 解压到某目录下
ii. 打开控制台,将当前目录切换到解压目录
iii. 依次输入命令:
./configure
make
su
make install
注:需要 root 权限才能成功安装。
三、 训练语料格式:
a) 训练语料至少应具有两列,列间由空格或制表位间隔,且所有行(空行除外)必须具有相同的列数。句子间使用空行间隔。
b) 一些合法的语料示例:
i. 有两列特征的
太 Sd N
短 Sa N
而 Bu N
已 Eu N
。 Sw N
以 Sp N
家 Bn N
乡 En N
的 Su N
ii. 只有一列特征的
太 N
短 N
而 N
已 N
。 N
以 N
家 N
乡 N
的 N
四、 特征的选取及模板的编写:
a) 特征选取的行是相对的,列是绝对的,一般选取相对行前后 m 行,选取 n-1 列(假设语料总共有 n 列),特征表示方法为: %x[ 行 , 列 ] ,行列的初始位置都为 0 。例如:
i. 以前面语料为例
“ Sw N
北 Bns B-LOC
京 Mns I-LOC
市 Ens I-LOC
首 Bn N
假设当前行为“京”字这一行,那么特征可以这样选取:
特征模板 |
意义 |
代表特征 |
%x[-2,0] |
-2 行, 0 列 |
“ |
%x[-1,0] |
-1 行, 0 列 |
北 |
%x[0,0] |
0 行, 0 列 |
京 |
%x[1,0] |
1 行, 0 列 |
市 |
%x[2,0] |
2 行, 0 列 |
首 |
%x[-2,1] |
-2 行, 1 列 |
Sw |
%x[-1,1] |
-1 行, 1 列 |
Bns |
%x[0,1] |
0 行, 1 列 |
Mns |
%x[1,1] |
1 行, 1 列 |
Ens |
%x[2,1] |
2 行, 1 列 |
Sw |
%x[-1,0]/%x[0,0] |
-1 行 0 列与 0 行 0 列的组合 |
北 / 京 |
%x[0,0]/%x[1,0] |
0 行 0 列与 1 行 0 列的组合 |
京 / 市 |
%x[-2,1]/%x[-1,1] |
-2 行 1 列与 -1 行 1 列的组合 |
Sw/ Bns |
%x[-1,1]/%x[0,1] |
-1 行 1 列与 0 行 1 列的组合 |
Bns/Mns |
%x[0,1]/%x[1,1] |
0 行 1 列与 1 行 1 列的组合 |
Mns/Ens |
%x[1,1]/%x[2,1] |
1 行 1 列与 2 行 1 列的组合 |
Ens/Sw |
%x[-2,1]/%x[-1,1]/%x[0,1] |
-2 行 1 列、 -1 行 1 列、 0 行 1 列的组合 |
Sw/Bns/Mns |
%x[-1,1]/%x[0,1]/%x[1,1] |
-1 行 1 列、 0 行 1 列、 1 行 1 列的组合 |
Bns/Mns/Ens |
%x[0,1]/%x[1,1]/%x[2,1] |
0 行 1 列、 1 行 1 列、 2 行 1 列的组合 |
Mns/Ens/Sw |
b) 模板制作:模板分为两类: Unigram 和 Bigram 。
其中 Unigram/Bigram 是指输出 token 的 Unigram/Bigrams ,而不是特征。
c) 以前面示例中的特征为特征,制作为 Unigram 模板如下:
#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,1]
U06:%x[-1,1]
U07:%x[0,1]
U08:%x[1,1]
U09:%x[2,1]
U10:%x[-1,0]/%x[0,0]
U11:%x[0,0]/%x[1,0]
U12:%x[-2,1]/%x[-1,1]
U13:%x[-1,1]/%x[0,1]
U14:%x[0,1]/%x[1,1]
U15:%x[1,1]/%x[2,1]
U16:%x[-2,1]/%x[-1,1]/%x[0,1]
U17:%x[-1,1]/%x[0,1]/%x[1,1]
U18:%x[0,1]/%x[1,1]/%x[2,1]
说明:
i. 其中 # 开头的行不起作为,为注释;
ii. 行与行之间可以有空行;
iii. Unigram 的特征前使用字母 U ,而 Bigram 的特征前使用字母 B 。后面的数字用于区分特征,当然这些数字不是一定要连续。
五、 训练方法
a) 语料的训练可以使用命令(在终端或 DOS 命令行中): crf_learn < 模板 > < 训练语料 > < 模板文件 >
其中模板和训练语料是需要事先准备好的,模板文件在训练完成后生成
注意:
1) 如果提示语料格式错误,则注意检查语料的存储编码,有些编码 CRF++ 是会读取错误的;
2) 文件路径要正确,如果文件没在当前目录,那么要使用绝对路径。
b) 训练中一些参数的说明:
ter :迭代次数
terr :标记错误率
serr :句字错误率
obj :当前对象的值。当这个值收敛到一个确定值的时候,训练完成
diff :与上一个对象值之间的相对差
六、 解码方法
a) 可以使用 crf_test -m < 模板文件 > < 测试文件 1> < 测试文件 2> ……。
b) 结果会直接输出到屏幕上面,如果想让结果保存到文件中,那么使用重定向,在上面命令后面加上一个开关“ > ”即可: crf_test -m < 模板文件 > < 测试文件 1> > < 保存位置 > 。例如: crf_test -m model test.txt > result.txt
七、 评测工具 CoNLL 2000 的用法
a) 下载:
i. http://download.csdn.net/source/1425687
ii. http://www.cnts.ua.ac.be/conll2000/chunking/output.html
b) 使用它是用来评分,所以要求 crf_test 一步使用的测试文件中本身带有答案,这样解码后生成的结果会在答案的后一列。比如原来为:
使 En N
、 Sw N
交 Bni B-ORG
通 Mni I-ORG
部 Eni I-ORG
部 Bn N
那么解码后变成:
使 En N N
、 Sw N N
交 Bni B-ORG B-ORG
通 Mni I-ORG I-ORG
部 Eni I-ORG I-ORG
部 Bn N N
CoNLL 2000 将把最后一列与倒数第二列进行对比,统计出最后各类的正确率,召回率、 F 值等。
c) 使用评测工具前要将评测文件中的所有制表位转换成空格,否则评测工具会出错。
d) 评测命令为: perl conlleval.pl < < 评测文件 >