赞
踩
完整代码 https://www.heywhale.com/home/competition/6216f74572960d0017d5e691/content/
CRF,英文全称为Conditional Random Field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。
较为简单的条件随机场是定义在线性链上的条件随机场,称为线性链条件随机场(linear chain conditional random field)。
线性链条件随机场可以用于序列标注等问题,需要解决的命名实体识别(NER)任务正好可通过序列标注方法解决。
在条件概率模型P(Y|X)中,Y是输出变量,表示标记序列(或状态序列),X是输入变量,表示需要标注的观测序列。
训练时,利用训练数据 集通过极大似然估计或正则化的极大似然估计得到条件概率模型p(Y|X);
预测时,对于给定的输入序列x,求出条件概率p(y|x)最大的输出序列y
Linear-chain CRF推导:https://lauraruis.github.io/2021/01/25/crfpt1.html
CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具,采用C++语言编写而成。其最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。
官网地址:http://taku910.github.io/crfpp/
CRF++的安装可分为Windows环境和Linux环境下的安装。关于Linux环境下的安装,可以参考文章:CRFPP/CRF++编译安装与部署 。 在Windows中CRF++不需要安装,下载解压CRF++0.58文件即可以使用
在训练之前需要将标注数据转化为CRF++训练格式文件:
分两列,第一列是字符,第二例是对应的标签,中间用\t分割。
比如标注方案采用BISO,效果如下:
模板是使用CRF++的关键,它能帮助我们自动生成一系列的特征函数,而不用我们自己生成特征函数,而特征函数正是CRF算法的核心概念之一。一个简单的模板文件如下:
在这里,我们需要好好理解下模板文件的规则。T**:%x[#,#]中的T表示模板类型,两个"#"分别表示相对的行偏移与列偏移。一共有两种模板:
crf_learn -f 3 -c 4.0 -m 100 template train.data crf_model > train.rst
其中,template为模板文件,train.data为训练语料,-t表示可以得到一个model文件和一个model.txt文件,其他可选参数说明如下:
- -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:迭代次数。当迭代次数达到maxiter时,迭代终止
-
- terr:标记错误率
-
- serr:句子错误率
-
- obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成
-
- diff:与上一个对象值之间的相对差。当此值低于eta时,训练完成
在训练完模型后,我们可以使用训练好的模型对新数据进行预测,预测命令格式如下:
crf_test -m crf_model test.data > test.rstt
-m model表示使用我们刚刚训练好的model模型,预测的数据文件为test.data> test.rstt 表示将预测后的数据写入到test.rstt 中。
sklearn-crfsuite是基于CRFsuite库的一款轻量级的CRF库。该库兼容sklearn的算法,因此可以结合sklearn库的算法设计实体识别系统。sklearn-crfsuite不仅提供了条件随机场的训练和预测方法还提供了评测方法。
安装:pip install sklearn-crfsuite
特征构造:
模型初始化
- crf_model = sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100,
- all_possible_transitions=True,verbose=True)
- crf_model.fit(X_train, y_train)
参考资料
条件随机场CRF及CRF++安装与使用https://www.biaodianfu.com/crf.html
使用CRF++实现命名实体识别(NER)https://www.cnblogs.com/jclian91/p/10795413.html
利用crf++进行实体识别利用crf++进行实体识别 - 简书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。