其他分享
首页 > 其他分享> > CRF++工具包的使用

CRF++工具包的使用

作者:互联网

  CRF学习完了,但是理论不结合实践总是无法出真知的。使用CRF进行命名实体识别有很多方法,比如CRF++工具包、sklearn包中的crfsuite套装、keras框架、tensorflow框架、pytorch框架等等,下面总结借助CRF++工具包实现的几点心得。

一、CRF++工具包的安装与配置

1.CRF++:Yet Another CRF toolkit

  CRF++是基于C++开发、可自定义特征集、基于LBFGS快速训练等等高效特征的CRF开源工具包。用于对序列数据进行分割和标记,主要用于NLP任务,例如命名实体识别、信息提取和文本分块任务。

2.安装

  截至目前更新的最新版为2013-02-13的CRF0.58版本。Windows下的安装很简单,只需要下载下来解压即可。解压包中的文件如图1所示。实际上使用的文件主要有CRF++的训练程序(crf_learn.exe)文件、CRF++的测试程序(crf_test.exe)文件和训练程序和测试程序需要使用的静态链接库(libcrfpp.dll)三个文件。

 

图表 1 CRF++0.58解压后文件目录

  以上图中各个文件夹内容:

3.命令行使用
(1)训练(encoding):crf_learn template_file train_file model_file >> train_info_file。

即训练需要准备template_file、train_file两个文件,输出model_file文件。训练有以下几个参数:

  训练时输出内容的参数:

(2)测试:crf_test -m model_file test_files >> result_file。

此处有两个参数:-v和-n。-v用来预测标签概率值,默认值为0,级别越高输出的内容越多;-n NUM显示不同可能序列的概率值。eg. crf_test -v0 -n 20 -m model test.data

二、实验

1.准备训练文件
(1)训练测试文件格式
(2)模板文件

  CRF++使用模板文件来生成特征。模板文件需要用户编写,从而指定需要生成哪些特征。文件中的每一行定义了一个特征模板,以#开头的行是注释行,空行也被认为是注释行而被剔除。有两种类型的特征模板,通过特征模板的第一个字符区分。

  给定一个Unigram特征模板U01:%x[0,1],它会生成M个特征函数,其中M为训练数据的行数(剔除空行,因为空行是sentence的分隔符)。每个特征函数为:

“““

func1 = if (output = LABEL1 and feature = “U01:xx1”) return 1 else return 0

func2 = if (output = LABEL2 and feature = “U01:xx2”) return 1 else return 0

func3 = if (output = LABEL3 and feature = “U01:xx3”) return 1 else return 0

……

funcM = if (output = LABELM and feature = “U01:xxM”) return 1 else return 0

”””

    其中LABEL1,……,LABELM是训练文件中每一行的标记,feature=“U01:xx1”,……,feature="U01:xxM"是训练文件中,每一行由U01:%x[0,1]指定的,从该行提取到的特征。

   需要注意的是,上述生成的特征函数会有大量重复,假设标记的种类一共有L个,由U01:%x[0,1]指定,从该行提取到的特征的种类一共有N个,则特征函数的种类一共有L×N个。CRF++会按照L中标记,N中特征来自动生成L×N个特征函数。

   给定一个Bigram特征模板B01:%x[0,1],它会生成M个特征函数,其中M为训练数据的行数(剔除空白行,因为空白行是sentence的分隔符)。每个特征函数为

“““

func2 = if (output = LABEL2/LABEL1 and feature="B01:xx2") return 1 else return 0

func3 = if (output = LABEL3/LABEL2 and feature="B01:xx3") return 1 else return 0

func4 = if (output = LABEL4/LABEL3 and feature="B01:xx4") return 1 else return 0

....

funcM = if (output = LABELM/LABELM_1 and feature="B01:xxM") return 1 else return 0

”””

    在Bigram中,特征函数中的output是当前的输出标记和前一个输出标记的联合,即联合的是标记而不是特征,特征的联合由宏语句来实现。其他的意义和Unigram中的相同。

  此时生成的特征函数也会有大量重复。假设标记的种类一共有L个,由B01:%x[0,1]指定的,从该行提取到的特征的种类一共有N个,则CRF++会按照L种标记,N种特征自动生成L×L×N个特征函数,训练后函数的权值反映了上一个节点的标签对当前节点的影响。

  当标记的种类L较大时,Bigram会生成非常多的特征函数,其中非常多的特征函数在样本中的返回值只有少量的1,此时,模型的训练和测试将会非常低效。

  如果某一行的内容只有一个字符B,表示:由当前的输出标记和前一个输出标记的联合生成的特征函数。

三、实践

(1)用CRF进行命名实体识别

博客:https://www.jianshu.com/p/12f2cdd86679

参考文献

[1] http://www.huaxiaozhuan.com/%E5%B7%A5%E5%85%B7/CRF/chapters/crfpp.html,CRF++使用。

[2] http://taku910.github.io/crfpp/,CRF

标签:return,训练,++,工具包,特征,CRF,模板
来源: https://www.cnblogs.com/caoer/p/14855922.html