CRF++官方文档

Wesley13
• 阅读 796

前言

  CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具。在这里我们简单介绍一下windows系统下CRF++的使用。

一、工具包的下载:

CRF 的工具有两种,一种是支持Linux环境的,一种是支持Windows环境的,大家可以自行根据自己的系统进行下载。
(在此我下载的是CRF++0.58)
安装
在此先简单说一下Linux环境下的安装,后面我们主要介绍Windows环境下的使用。

解压到某一个目录下面
打开控制台,切换到解压目录
依次输入命令:
./configure
make
su
make install
注意:需要root权限才能成功安装。
在Windows下的安装很简单,其实严格来讲不能说是安装。我们解压我们下载的压缩包文件到某一个目录下面。你可能会得到如下所示的文件,(版本不同,可能会有所不同。)

doc文件夹:就是官方主页的内容
example文件夹:有四个任务的训练数据(test.data)、测试数据(train.data)和模板文件(template),还有一个执行脚本文件exec.sh。
sdk文件夹:CRF++的头文件和静态链接库。
clr_learn.exe:CRF++的训练程序
crl_test.exe:CRF++的测试程序
libcrffpp.dll:训练程序和测试程序需要使用的静态链接库。
实际上,需要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,这三个文件。

二.一个小例子

训练过程
  为了让大家尽快练练手,看到结果,我们先拿example中的某个例子做一下测试。例如:example中chunking文件夹,其中原有4个文件:exec.sh;template;test.data;train.data。将crf_learn.exe;crf_test.exe;libcrfpp.dll三个文件复制到这个文件夹(chunking)底下。
  在命令窗口中,cd到该文件夹,然后输入以下命令进行训练模型。
  crf_learn template_file train_file model_file
  eg:crf_learn template train.data model
  你可以看到控制台上打印处的信息,并会产生一个新的文件:model。这个训练过程的时间、迭代次数等信息就会输出到控制台上(感觉是crf_learn程序的输出信息到标准输出流上了),如果想要保存这些信息,我们可以将这些标准输出流到文件,命令格式为:
crf_learn template_file train_file model_file >> train_info_file
eg:crf_learn template train.data model >> model_out.txt

在这里有四个参数可以调整:
-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是线程数量。

举一个带参数的命令例子:
clr_learn -f 3 -c 1.5 tempalte train.data model##过滤掉了频数低于3的特征,并且设超参数为1.5

测试过程
输入命令进行测试数据,测试程序的命令为:
crf_test -m model_file test_file
eg: crf_test -m model test.data
同样,与crf_learn类似,输出的结果放到了标准输出流上,而这个输出结果是最重要的预测结果信息(预测文件的内容+预测标注),同样可以使用重定向,将结果保存下来,命令为:
crf_test -m model_file test_files >> result_file
eg:crf_test -m model test.data >> output.txt
你会发现生成一个新的文件output.txt,就是我们的测试结果。

在这里的参数有两个-v 和-n,都是用来显示一些信息的。-v 可以用来预测标签概率值, -n可以显示不同可能序列的概率值。对于准确率、召回率、运行效率,没有影响。
做到这里,心里应该有一丝小兴奋吧,毕竟看到了点东西嘛。

 三、训练语料格式

训练语料至少应该具有两列,列间由空格或者制表位间隔,且所有行(空行除外)必须具有相同的列数。句子间使用空行间隔。
示例:

有两列特征的:

太 Sd N
短 Sa N
而 Bu N
已 Eu N
。 Sw N

以 Sp N
家 Bn N
乡 En N
的 Su N

只有一列特征的:
太 N
短 N
而 N
已 N
。 N

以 N
家 N
乡 N
的 N

特征选取及模板的编写
特征选取的行是相对的,列数绝对的,一般选取相对行前后m行,选取n-1列(假设语料总共有n列),特征表示方法为:%x[行,列],行列的初始位置都为0。
例如:
“ Sw N
北 Bns B-LOC
京 Mns I-LOC
市 Ens I-LOC
首 Bn N
假设当前行为“京”字这一行,那么特征可以这样选取:

模板分为两类:Unigram和Bigram。其中Unigram/Bigram是指输出token的Unigram/Bigrams,而不是特征的。

以前面的示例中的特征为特征,制作模板如下:

Unigram类型 :每一行%x[#,#]生成一个CRFs中的点(state)函数:f(s,o),其中s为t时刻的标签(output),o为t时刻的上下文。

Bigram类型:每一行%x[#,#]生成CRFs中的边(Edge)函数:f(s’,s,o),其中s’为t-1时刻的标签,也就是说,Bigram类型与Unigram类型大致相同,只是还要考虑到t-1时刻的标签,如果直线一个B的话,默认生成f(s’,s).
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。后面的数字用于区分特征,当然这些数字不是一定要连续。

训练方法
语料的训练可以使用命令(在终端或DOS命令行中):crf_learn <模板> <训练语料> <模板文件>。其中模板和训练语料是需要事先准备好的,模板文件在训练完成后生成。

注意:

  1. 如果提示语料格式错误,则注意检查语料的存储编码,有些编码CRF++是会读取错误的;

2)文件路径要正确,如果文件没在当前目录,那么要使用绝对路径。
1
2
3
训练中一些参数的说明:

ter:迭代次数
terr:标记错误率
serr:句字错误率
obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成
diff:与上一个对象值之间的相对差

六、解码方法(测试)

可以使用命令:crf_test -m <模板文件> <测试文件1> <测试文件2> ……进行测试,这样会在控制台上看到测试结果。
利用上面的命令进行测试,测试结果会直接输出到屏幕上,如果你想让测试结果保存到文件里,那么在此需要使用重定向,就是在上面命令后面加上一个开关“>保存文件”即可:crf_test -m <模板文件> <测试文件1> > <保存位置>。例如:crf_test -m model test.txt > result.txt

七 结果测评(本部分暂时是转载,因为还没进行实践)

下载(注意需要先安装perl):
i. http://download.csdn.net/source/1425687

使用它是用来评分,所以要求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值等。

使用评测工具前要将评测文件中的所有制表位转换成空格,否则评测工具会出错。

评测命令为:perl conlleval.pl < <评测文件>

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这