CRF++工具包的安装和使用介绍

1. CRF++简介

CRF是Conditional Random Fields的缩写,即条件随机域;是Lafferty于2001年,在最大熵模型和隐马尔科夫模型的基础上,提出的一种判别式概率无向图学习模型,是一种用于标注和切分有序数据的条件概率模型。CRF++工具包最早是针对序列数据分析提出的,是一个可用于分词/连续数据标注的简单、可定制并且开源的条件随机场(CRFs)工具。CRF++是为了通用目的设计定制 ,能被用于自然语言信息处理 (NLP)的各个方面 ,诸如命名实体识别、信息提取和语块分析。

2.CRF++的安装

CRF++工具包的下载地址:http://code.google.com/p/crfpp/downloads/list,工具包包括Linux环境下的源代码和Windows下的可执行程序。用C++编写。

Linux下的使用方法:

(1)安装

编译器要求:C++编译器(gcc 3.0或更高)

下载解压后进入到第一层目录下方使用如下命令。

命令:

% ./configure

% make

% su

#make install

注:只有拥有root帐号的用户才能成功安装。(su 命令就是切换到root权限下)

3.CRF++的使用

3.1CRF++语料格式

训练和测试文件必须包含多个tokens,每个token包含多个列。token的定义可根据具体的任务,如词、词性等。每个token必须写在一行,且各列之间用空格或制表格间隔。一个token的序列可构成一个sentence,sentence之间用一个空行间隔。

最后一列是CRF用于训练的正确的标注形式。

例如:
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP
account NN I-NP
deficit NN I-NP
will MD B-VP
narrow VB I-VP
to TO B-PP
only RB B-NP
# # I-NP
1.8 CD I-NP
billion CD I-NP
in IN B-PP
September NNP B-NP
. . O
He PRP B-NP
reckons VBZ B-VP

上面的例子每个token包含3列,分别为词本身、词性和Chunk标记

注意:如果每一个token的列数不一致,系统将不能正确运行。

3.2 CRF++特征模板

使用该CRF++工具的用户必须自己确定特征模板。模板文件中的每一行代表一个template。每一个template中,专门的宏%x[row,col]用于确定输入数据中的一个token。row用于确定与当前的token的相对行数。col用于确定绝对列数。

如已知下面的输入数据:

Input: Data
He PRP B-NP
reckons VBZ B-VP
the DT B-NP << 当前的token
current JJ I-NP
account NN I-NP
特征模板形式为:

templateexpanded feature
%x[0,0]the
%x[0,1]
%x[-1,0]rokens
%x[-2,1]PRP
%x[0,0]/%x[0,1]the/DT
ABC%x[0,1]123ABCthe123

模板类型
有两种模板类型,它们可由template的第一个字符确定。

3.2.1 Unigram template

第一种是Unigram template:第一个字符是U

这是用于描述unigram feature的模板。当你给出一个模板"U01:%x[0,1]",CRF会自动的生成一个特征函数集合(func1 … funcN),如:

func1 = if (output = B-NP and feature=“U01:DT”) return 1 else return
0
func2 = if (output = I-NP and feature=“U01:DT”) return 1 else return
0
func3 = if (output = O and feature=“U01:DT”) return 1
else return 0

funcXX = if (output = B-NP and feature=“U01:NN”) return 1
else return 0
funcXY = if (output = O and feature=“U01:NN”) return 1
else return 0

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

3.2.1 Bigram template

第二种类型Bigram template:第一个字符是B

这个模板用于描述bigram features。使用这个模板,系统将自动产生当前输出token与前一个输出token(bigram)的组合。产生的可区分的特征的总数是LLN,其中L是输出类别数,N是这个模板产生的unique features数。当类别数很大的时候,这种类型会产生许多可区分的特征,这将会导致训练和测试的效率都很低下。

使用标识符区分相对位置
如果用户需要区分token的相对位置时,可以使用标识符。
比如在下面的例子中,宏"%x[-2,1]“和”%x[1,1]"都代表“DT”,但是它们又是不同的“DT“。
The DT B-NP
pen NN I-NP
is VB B-VP << CURRENT TOKEN
a DT B-NP
为了区分它们,可以在模型中加入一个唯一的标识符(U01: 或 U02:),即:
U01:%x[-2,1]
U02:%x[1,1]
在这样的条件下,两种模型将被认为是不同的,因为他们将被扩展为”U01:DT“和”U02:DT”。只要你喜欢,你可以使用任何标识符,但是使用数字序号区分更很有用,因为它们只需简单的与特征数相对应。

3.2.3 模板例子
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]q
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-2,1]/%x[-1,1]
U16:%x[-1,1]/%x[0,1]
U17:%x[0,1]/%x[1,1]
U18:%x[1,1]/%x[2,1]
U20:%x[-2,1]/%x[-1,1]/%x[0,1]
U21:%x[-1,1]/%x[0,1]/%x[1,1]
U22:%x[0,1]/%x[1,1]/%x[2,1]
# Bigram
B

3.3 CRF++包介绍

CRF++解压后的包为:
在这里插入图片描述

  • doc文件夹:官方主页的内容
  • example文件夹:有四个数据包,每个数据包有四个文件:
    训练数据(test.data)、测试数据(train.data)、模板文件(template)、执行脚本文件exec.sh。
  • example文件夹:有四个任务的训练数据、测试数据和模板文件。
  • sdk文件夹:CRF++的头文件和静态链接库。
  • crf_learn.exe:CRF++的训练程序
  • crf_test.exe:CRF++的预测程序
  • libcrfpp.dll:训练程序和预测程序需要使用的静态链接库。

实际上,需要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,这三个文件。

3.4 CRF++命令介绍

3.4.1 CRF++命令

1.将crf_learn.exe;crf_test.exe;libcrfpp.dll三个文件复制到到,含有exec.sh;template;test.data;train.data的文件夹(chunking)里。

2.cmd cd进入该文件夹

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

3.perl conlleval.pl < output.txt 评估效果(此处会报错误)需要下载perl(需要复制conlleval.pl文件到文件夹里)

或者使用评估程序crf_evalutuion.exe文件,同样把crf_evalutuion.exe文件复制到文件夹里
使用命令:

  1. 输入“crf_evalution”按回车,然后输入参数,参数有两个:
  2. 第一个是需要评估文件的路径+文件名(如果在同一目录下只需输入文件名,如:output.txt或者c:\desktop\output.txt),
  3. 第二个参数为评估文件行数,对于给定测试语料(test.file.txt)来说输入小于等于 49994 就ok

4.会产生一个新的文件:model

这个训练过程的时间、迭代次数等信息就会输出到控制台上,如果想要保存这些信息,我们可以将这些标准输出 流到文件,命令格式为:

crf_learn template_file train_file model_file >> train_info_file
eg:crf_learn template train.data model >> model_out.txt

3.4.2 CRF++操作举例

在这里插入图片描述
在这里插入图片描述

3.4.3 CRF++命令参数
3.4.3.1 训练命令可选参数

训练:…/crf_learn –[可选参数] template train.data model

可选参数

-f, --freq=INT 使用属性的出现次数不少于INT(默认为1)
-m, --maxiter=INT 设置INT为LBFGS的最大跌代次数 (默认10k)
-c, --cost=FLOAT 设置FLOAT为代价参数,过大会过度拟合 (默认1.0)
-e, --eta=FLOAT 设置终止标准FLOAT(默认0.0001)
-C, --convert 将文本模式转为二进制模式
-t, --textmodel 为调试建立文本模型文件
-a,–algorithm=(CRF|MIRA) 选择训练算法, 默认为CRF-L2
-p, --thread=INT 线程数(默认1),利用多个CPU减少训练时间
-H, --shrinking-size=INT 设置INT为最适宜的跌代变量次数 (默认20)
-v, --version 显示版本号并退出
-h, --help 显示帮助并退出

输出结果查看:
在这里插入图片描述
iter: 跌代次数
terr: tag错误率
serr: sentence错误率
obj: 当前对象值,该值收敛于一个固定的值则停止跌代
diff: 于上次对象值的相对差异

3.4.3.2 测试命令可选参数

测试:…/crf_test -[可选参数] -m model test.data

-v选项:设置verbose level(默认0)。增加层次,可从CRF++获得额外的信息。

层次1:可以对每个tag使用边缘概率,对总输出使用条件概率。

…/crf_test -v1 -m model test.data| head
# 0.478113

层次2:也可以对所有的其他候选求边缘概率。
例:…/crf_test -v2 -m model test.data
# 0.478113

-n选项:使用这个选项将获得N-best结果,它根据CRF计算出的条件概率排序得到。选择了N-best结果,CRF++会自动添加一行,形为“# N prob”。N从0开始累加至N,prob表示output的条件概率, 依次降低。
如果CRF++不能找到足够的N条路径是,它将放弃列举N-best结果。

4.CRF++包百度网盘链接

百度网盘链接:
链接:https://pan.baidu.com/s/17NpeR1eEQUEU1Tnsi68Iag
提取码:540u

5.参考笔记

crf++学习笔记
CRF++使用简介(windows下非接口)
哈工大赵铁军老师的讲义

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值