注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
自然语言处理系列四十
条件随机场(CRF)开源工具实战
目前条件随机场最流行的开源工具是CRF++。CRF++工具包最早是针对序列数据分析提出的,是一个可用于分词/连续数据标注的简单、可定制并且开源的条件随机场(CRFs)工具。CRF++是为了通用目的设计定制 ,能被用于自然语言信息处理 (NLP)的各个方面 ,诸如命名实体识别、信息提取和语块分析。下面介绍下其安装和使用。
- CRF++的安装
CRF++工具包的下载地址:http://code.google.com/p/crfpp/downloads/list(谷歌的下载地址需要翻墙),工具包包括Linux环境下的源代码和Windows下的可执行程序,用C++编写。
Linux下的安装:
编译器要求:C++编译器(gcc 3.0或更高)
下载解压后进入到第一层目录下方使用如下命令。
命令:
% ./configure
% make
% su
#make install
注:只有拥有root帐号的用户才能成功安装。(su 命令就是切换到root权限下): - CRF++的使用
1)CRF++语料格式
训练和测试文件必须包含多个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
He PRP B-NP
reckons VBZ B-VP
…
上面的例子每个token包含3列,分别为词本身、词性和Chunk标记。
注意:如果每一个token的列数不一致,系统将不能正确运行。
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的第一个字符确定。
(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的数目。
(2) 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)模板例子
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)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,这三个文件。
4)CRF++命令介绍
(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文件复制到文件夹里
使用命令:
输入“crf_evalution”按回车,然后输入参数,参数有两个:
第一个是需要评估文件的路径+文件名(如果在同一目录下只需输入文件名,如:output.txt或者c:\desktop\output.txt),
第二个参数为评估文件行数,对于给定测试语料(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
(2)CRF++操作举例
CRF++操作截图如图10.4所示。
图10.4 CRF++操作截图(图片来源于CSDN)
(3)CRF++命令参数
训练命令可选参数:
训练:…/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 显示帮助并退出
输出结果如图10.5所示。
图10.5 CRF++训练(图片来源于CSDN)
iter: 跌代次数
terr: tag错误率
serr: sentence错误率
obj: 当前对象值,该值收敛于一个固定的值则停止跌代
diff: 于上次对象值的相对差异
测试命令可选参数:
测试:…/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结果。
新词发现与短语提取
新词发现是一个非常重要的NLP课题。在处理文本对象时,非常关键的问题在于“切词”这个环节,几乎所有的后续结果都依赖第一步的切词。因此切词的准确性在很大程度上影响着后续的处理,切词结果的不同,也就影响了特征的提取,跟数据挖掘一样,特征提取的好坏特别重要,不论用什么算法,特征好数据好结果才会好。
短语提取是指从文章中提取典型的、有代表性的短语,期望能够表达文章的关键内容。关键短语抽取对于文章理解、搜索、分类、聚类都很重要。而高质量的关键短语抽取算法,还能有效助力构建知识图谱。
下一篇文章对新词发现和短语提取的算法原理进行介绍,并用开源工具代码演示其功能。敬请关注!
总结
此文章有对应的配套新书教材和视频:
【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。
全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。
本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。
【配套视频】
自然语言处理NLP原理与实战 视频教程【陈敬雷】
视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!
上一篇:自然语言处理系列三十九》条件随机场CRF算法原理
下一篇:自然语言处理系列四十一》新词发现与短语提取》新词发现算法原理