CRF++ 运行与安装

1,CRF++的指南,以及下载

英文版官网,使用手册的感觉。http://crfpp.googlecode.com/svn/trunk/doc/index.html

下载地址http://code.google.com/p/crfpp/downloads/list

 

 

2,CRF++-0.58.zip

我下载的是CRF++0.58.zip的版本,解压。

doc文件夹为官网地址;example为给的4个例子。

实际需要的:crf_learn.exe;crf_test.exe;libcrfpp.dll三个文件

 

可以先拿example中的某个例子,做一下测试。例如:example中chunking文件夹,其中原有4个文件:exec.sh;template;test.data;train.data。

template为特征模版;test.data为测试数据;train.data为训练数据。关于它们具体格式和内容,待会详细介绍。

 

可以选择example里的某个例子做测试,比如选chunking。将crf_learn.exe;crf_test.exe;libcrfpp.dll三个文件复制到到,含有exec.sh;template;test.data;train.data的文件夹(chunking)里。

cmd

cd进入该文件夹

crf_learn template train.data model   训练数据
crf_test -m model test.data > output.txt   测试数据

perl conlleval.pl < output.txt   评估效果

 

3,训练

 命令行:
% crf_learn template train.data model
这个训练过程的时间、迭代次数等信息会输出到控制台上(感觉上是crf_learn程序的输出信息到标准输出流上了),如果想保存这些信息,我们可以将这些标准输出流到文件上,命令格式如下:
% crf_learn template_file train_file model_file >> train_info_file

有四个主要的参数可以调整:
-a CRF-L2 or CRF-L1
规范化算法选择。默认是CRF-L2。一般来说L2算法效果要比L1算法稍微好一点,虽然L1算法中非零特征的数值要比L2中大幅度的小。
-c float
这个参数设置CRF的hyper-parameter。c的数值越大,CRF拟合训练数据的程度越高。这个参数可以调整过度拟合和不拟合之间的平衡度。这个参数可以通过交叉验证等方法寻找较优的参数。
-f NUM
这个参数设置特征的cut-off threshold。CRF++使用训练数据中至少NUM次出现的特征。默认值为1。当使用CRF++到大规模数据时,只出现一次的特征可能会有几百万,这个选项就会在这样的情况下起到作用。
-p NUM
如果电脑有多个CPU,那么那么可以通过多线程提升训练速度。NUM是线程数量。

带两个参数的命令行例子:
% crf_learn -f 3 -c 1.5 template_file train_file model_file

 

 

4,测试

 命令行:
% crf_test -m model test.data
有两个参数-v和-n都是显示一些信息的,-v可以显示预测标签的概率值,-n可以显示不同可能序列的概率值,对于准确率,召回率,运行效率,没有影响,这里不说明了。
与crf_learn类似,输出的结果放到了标准输出流上,而这个输出结果是最重要的预测结果信息(测试文件的内容+预测标注),同样可以使用重定向,将结果保存下来,命令行如下。
% crf_test -m model_file test_files > result_file

 

 

5,评估

若训练过程:% crf_test -m model test.data > output.txt

训练的结果在output.txt里。评估的就是这个文件,即待预测标签与预测标签的对比。

%conlleval.pl < output.txt

.pl后缀为Perl文件,所以需要安装Perl

conlleval.pl为http://www.cnts.ua.ac.be/conll2000/chunking/conlleval.txt 将这个贴到txt,然后重命名为conlleval。我当时这么做的。

特别注意:output.txt在CRF++输出中空格为TAB键,需要全部替换为真正空格键。conlleval.pl识别的是空格键。

 

 

6,train.data和test.data的格式

我做的实验关于中文。

每行的格式为:分词后的词 词性标注 标签

中间是空格隔开;空行表示句子的边界;分词后的词和词性标注是NLPIR(原ICTCLAS)生成的结果;标签O表示不是目标值,PLACE表示目标值,若一个词被分开了,则B-PALCE为第一个词,I-PLACE为接着的词

 

一定要严格按格式要求来,否则会报错。

另外,标签不能全部一样,否则会报这么错误:

The line search routine mcsrch failed: error code:0

routine stops with unexpected error

CRF_L2 execute error


 

下面是一个训练样本的例子:


训练文件由若干个句子组成(可以理解为若干个训练样例),不同句子之间通过换行符分隔,上图中显示出的有两个句子。每个句子可以有若干组标签,最后一组标签是标注,上图中有三列,即第一列和第二列都是已知的数据,第三列是要预测的标注,以上面例子为例是,根据第一列的词语和和第二列的词性,预测第三列的标注。

 

 

7,template格式

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。后面的数字用于区分特征,当然这些数字不是一定要连续。


 

 

参考:http://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html

http://blog.youkuaiyun.com/zhoubl668/article/details/7024026


CRF++使用见《CRF++的简单使用》

一、实验环境

a)         软件:windows XP pro sp3,visual studio 2008 & Dotnet2.0, CRF++, perl

b)         硬件: CPU: cm420,内存:2G ddr533, 160G 8M sata 富士通

二、实验过程

下面未经特别说明,都是按照作业要求将训练语料分成7:3进行训练和评测所得的结果。

a)         直接应用CRF

                         i.              所给定的语料格式非常符合条件随机场的要求,故直接使用条件随机场进行训练测试。(本次试验的文件在包test1.rar中)

1.         转换文档编码为UTF8(CRF++在使用UTF16时会报错)

2.         制定模板,如下:

#Unigram

U00:%x[-2,0]

U01:%x[-1,0]

U02:%x[0,0]

U03:%x[1,0]

U04:%x[2,0]

U10:%x[-1,0]/%x[0,0]

U11:%x[0,0]/%x[1,0]

3.         使用CRF++学习特征(相关信息如下)

a)         命令:crf_learn template_file train_file model

其中template_file是模板文件,train_file是训练语料,都需要事先准备好;model是CRF++根据模板和训练语料生成的文件,用于解码。

                                                                   i.              template_file文件

1.         模板的基本格式为%x[row,col],它用于确定输入数据中的一个token

其中,row确定与当前的token的相对行数。col用于确定绝对列数。(如下图:)

 

col 0

col 1

col 2

 

row -2

Ens

I-LOC

 

row -1

Bn

N

 

row 0

En

N

当前行

row 1

Bns

B-PER

 

row 2

Mns

I-PER

 

 

模板

指代的特征

U00:%x[-2,0]

U01:%x[-1,0]

U02:%x[0,0]

U03:%x[1,0]

U04:%x[2,0]

U10:%x[-1,0]/%x[0,0]

总/统

U11:%x[0,0]/%x[1,0]

统/阿

 

2.         特征模板的类型

a)        第一种以字母U开头,为Unigram template。当模板前加上U之后,CRF会自动生成一个特征函数集合。

一个模型生成的特征函数的个数总数为L*N,其中L是输出的类别数,N是根据给定的template扩展出的独立串(unique string )的数目。

b)         第二种特征模板以B开头,即Bigram template

它用于描述Bigram特征。系统将自动产生当前输出token与前一个输出token的组合。产生的可区分的特征的总数是L*L*N,其中L是输出类别数,N是这个模板产生的unique features数。

c)         两种模板的区别

注意:Unigram/Bigram是指输出token的Unigram/Bigrams,而不是特征!

unigram:|output tag|×|从模板中扩展的所有可能串|

bigram: |output tag| × |output tag| × |从模板中扩展的所有可能串|

b)         iter=88 terr=0.01365 serr=0.23876 obj=67066.17413 diff=0.00006

其中:iter是迭代次数;terr是词错误率;serr是句错误率;obj是当前对象值,当它收敛时,迭代结束;diff是与上一对象的差。

4.         Done!2706.41 s,用时间2706.41s(在电脑1上)。

5.         对测试语料进行测试

a)         命令:crf_test -m model_file test_file > result_file

其中 model_file是刚才生成的model文件,test_file是待测试语料,“>result_file”是重定向语句,指将屏幕输出直接输出到文件result_file中。

b)         CRF++的解码速度是很快的,尤其是直接写入文件时。但是因为特征选取的问题,正确率、召回率都不高。

c)         结果使用conlleval.pl程序测评。(其代码在提交包根目录中)

测评的命令为:perl conlleval.pl < output.txt,其中output.txt为待评测文件,需要perl解释器支持。详细结果如下:

LOC:

precision:

63.67%;

recall:

72.93%;

FB1:

67.98

5623

382251.5

ORG:

precision:

21.26%;

recall:

35.90%;

FB1:

26.71

4491

119954.6

PER:

precision:

65.90%;

recall:

65.06%;

FB1:

65.47

2554

167210.4

     

宏平均

53.38667

微平均:

52.84311

 

                       ii.              因为刚才特征选取地特别少,故猜想多加入有效特征可以提高结果,于是把模板定义如下:(本次试验的相关数据文件在包test2.rar中)

1.         模板2:

#Unigram

U00:%x[-2,0]

U01:%x[-1,0]

U02:%x[0,0]

U03:%x[1,0]

U04:%x[2,0]

U5:%x[-2,0]/%x[-1,0]

U6:%x[-1,0]/%x[0,0]

U7:%x[0,0]/%x[1,0]

U8:%x[1,0]/%x[2,0]

2.         相关的实验数据如下:

a)         训练过程:

iter=94 terr=0.00571 serr=0.12313 obj=53321.45523 diff=0.00000

Done!2915.53 s

b)         测试结果:

LOC:

precision:

66.86%;

recall:

74.31%;

FB1:

70.39

5456

384047.8

ORG:

precision:

26.95%;

recall:

41.02%;

FB1:

32.53

4048

131681.4

PER:

precision:

68.29%;

recall:

65.67%;

FB1:

66.96

2488

166596.5

     

宏平均

56.62667

微平均:

56.89841

的确有所进步,但是还是明显显低。

a)         制定规则,改进结果

                         i.              对结果进行分析(详见各包中以error开头的文件),可以发现错误主要有以下几种:

1.         同一实体内不同字间的类型不同,则以字类数较多者为准

a)         个数相同时,多数情况下为LOC

2.         实体开头的字必定为B-???格式

3.         实体的开始和结尾都有特定的特征可以遵循(如停用词、动词等作为分界等)

4.         固定实体后跟实体应为B-???格式(如省名后)

5.         实体间间隔较小时可能合并为同一实体

6.         ……

                       ii.              根据以上特点对结果进行优化,计划依次试验各个规则。但因时间因素,只检测了四五种,其中较有效果的是前两种(即规则1和2),两者结合可以把结果成绩提高12%左右。在test2的结果上加以更正,得到的结果如下:

LOC:

precision:

79.40%;

recall:

76.43%;

FB1:

77.89

4966

386801.7

ORG:

precision:

53.86%;

recall:

52.63%;

FB1:

53.24

3457

184050.7

PER:

precision:

80.88%;

recall:

67.09%;

FB1:

73.34

2327

170662.2

     

宏平均

68.15667

微平均:

68.9781

虽然F值有很大提高,但是还是太不理想

c)         先分词并标注词性信息,再用CRF学习规则

                         i.              看来单从字的角度着眼已然不够,于是试图利用分词和词性标注信息。因为题目未给出相应信息,故用分词标注信息先进行分词标注(分词标注工具见附件包根目录)。

                       ii.              分词标注后,字的特征如下所示:

词性及分词标记

实体标记

Sw

N

Bns

B-LOC

Ens

I-LOC

Bd

N

Ed

N

                      iii.              于是针对其建立模板:

                      iv.              以此模板进行训练,得到模型后进行测试,最后用conlleval测得结果如下:

iter=226 terr=0.00935 serr=0.17661 act=2913330 obj=42785.69115 diff=0.00009

Done!4502.97 s

LOC:

precision:

82.05%;

recall:

89.97%;

FB1:

85.83

20309

1743121

ORG:

precision:

48.36%;

recall:

65.12%;

FB1:

55.5

13818

766899

PER:

precision:

91.52%;

recall:

93.15%;

FB1:

92.33

9189

848420.4

     

宏平均

77.88667

微平均:

77.53349

                       v.              对此结果再以用前面建立的规则优化,最终得到结果如下:

LOC:

precision:

90.34%;

recall:

90.37%;

FB1:

90.36

18878

1705816

ORG:

precision:

70.47%;

recall:

71.54%;

FB1:

71

12474

885654

PER:

precision:

94.85%;

recall:

92.70%;

FB1:

93.76

8954

839527

     

宏平均

85.04

微平均:

85.12373

在此基础上对Test_utf16.ner进行训练,最终得到finalAnswer.txt

实验结果对照

编号

使用策略

结果

方法改进

性能提升

 

1

单字CRF(1)

约53%

 

 

 

2

单字CRF(1)

约56.7%

使用更多的特征信息

约3.7%

特征对于结果有较大影响,但因硬件条件和时间原因未能引入更多的特征加以佐证。

3

单字CRF+规则

约68.5%

人工添加规则,对结果进行优化

约11.8%

规则可以弥补机器学习方法的不足,依次(并改变规则的顺序)尝试各种规则。

4

分词+词性标注+CRF

约77.7%

采用了不同方法

约9.2%

引入词的概念显然

5

分词+词性标注+CRF+规则

85.1%

在4基础上引入规则

约7.4%

机器学习方法的某些弊端不随条件的变化而变化

6

 

 

 

 

 

、未来的工作

a)         尝试更多的规则,尽量减少机器学习方法的弊端;

b)         尝试把分词和词性信息作为不同的属性,看看对结果有什么影响;

c)         改进分词及词性标注的正确率,以便收到更好的命名实体识别的效果。

五、注意事项

a)         编码格式可能造成某些文件无法正常处理,当出现格式错误时要留心一下;

b)         各个程序所需要的分隔符不尽相同,主要是空格和制表符,在遇到问题时注意看是不是分隔符不符合程序要求;

c)         实验过程中开发的一些实用小工具并未提供说明书,但这些小工具界面简洁,使用方便,应该很容易掌握。

 

 

Felomeng.BackFormation

用于在标准格式和分词标注格式之间转换,还附带将两种标记合并、将分词标注信息删除两个功能

Felomeng.ErrorExtractor

错误提取工具,可以方便地从结果(带答案)中提取错误,以便于实验分析

Felomeng.NERRules

本来有四个功能,因为实验中验证了前三个功能效果不佳,固主要功能就是改善结果(对机器学习方法的结果进行规则化改进)。

 

 

 

后记:其实结果和使用的训练测试数据的选择很有关系,本人采用的是前70%训练,后30%测试。后经改进选取方法,正确率可以达92%以上,有兴趣的可以改变一下训练语料和测试语料的提取方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值