什么是crf

利用crf++进行实体识别的流程

  1. 确定标签体系;
  2. 确定特征模板文件;
  3. 处理训练数据文件;
  4. 模型训练。

确定标签体系

大部分情况下,标签体系越复杂准确度也越高,但相应的训练时间也会增加。因此需要根据实际情况选择合适的标签体系。

确定模板文件

特征模版是一个文本文件,其内容如下所示,其中每行表示一个特征。如下模板使用了unigram特征,并且仅以字符本身作为特征而不考虑其他特征。除当前字符外,还使用了其前后3个字,以及上下文的组合作为特征。CRF++会根据特征模版生成相关的特征函数。关于特征模版的详细解释可以查看官网文档,并且对于特征的选择和设计可以灵活配置。

#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U5:%x[-2,0]/%x[-1,0]
U6:%x[-1,0]/%x[0,0]
U7:%x[0,0]/%x[1,0]
U8:%x[1,0]/%x[2,0]

处理训练数据文件

CRF模型的训练数据是一行一个token,一句话由多行token组成,如下图所示。

训练数据及测试数据

a) 训练命令:crf_learn template_file train_file model

其中template_file是模板文件,train_file是训练语料,都需要事先准备好;model是CRF++根据模板和训练语料生成的文件,用于解码。

b) 测试命令:crf_test -m model_file test_file > result_file

其中 model_file是刚才生成的model文件,test_file是待测试语料,“>result_file”是重定向语句,指将屏幕输出直接输出到文件result_file中。

结合规则进行改进

  1. 同一实体内不同字间的类型不同,则以字类数较多者为
  2. 实体开头的字必定为B-???格式
  3. 实体的开始和结尾都有特定的特征可以遵循(如停用词、动词等作为分界等)
  4. 固定实体后跟实体应为B-???格式(如省名后)
  5. 5. 实体间间隔较小时可能合并为同一实体

结合分词及词性标注进行改进

看来单从字的角度着眼已然不够,于是试图利用分词和词性标注信息。利用工具对文本进行分词标注,每一行的token仍然是以单字为特征,中间加入词性的信息如下图所示。针对这样的信息构建新的模板,利用中间一列的信息,可以提高准确率。

大神实验结果对照表

crf++的使用方法

CRF++是著名的条件随机场开源工具,也是目前综合性能最佳的CRF工具。Windows版的无须安装,直接解压即可使用。

训练语料格式

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

如:

i. 有两列特征的

太 Sd N

短 Sa N

而 Bu N

已 Eu N

。 Sw N

以 Sp N

家 Bn N

乡 En N

的 Su N

ii. 只有一列特征的

太 N

短 N

而 N

已 N

。 N

以 N

家 N

乡 N

的 N

特征的选取及模板的编写

a) 特征选取的行是相对的,列是绝对的,一般选取相对行前后m行,选取n-1列(假设语料总共有n列),特征表示方法为:%x[行,列],行列的初始位置都为0。例如:

i. 以前面语料为例

“ Sw N

北 Bns B-LOC

京 Mns I-LOC

市 Ens I-LOC

首 Bn N

假设当前行为“京”字这一行,那么特征可以这样选取:

结合深度学习的方法

随着深度学习的兴起,RNN、LSTM、BILSTM等模型已经被证明在NLP任务上有着良好的表现。相比传统模型,RNN能够考虑长远的上下文信息,并且能够解决CRF特征选择的问题,可以将主要的精力花在网络设计和参数调优上,但RNN一般需要较大的训练数据,在小规模数据集上,CRF表现较好。在学术界,目前比较流行的做法是将BILISTM和CRF进行结合,借鉴两个模型各自的优点,来达到更好的效果。

总结

本文只是大概介绍了crf++进行实体识别的一些思路,要真正理解还需要多去实践。

References

统计学习方法.李航

CRF++的简单使用 - Felomeng的技术博客 - CSDN博客

条件随机场(CRF)识别命名实体 - Felomeng的技术博客 - CSDN博客

达观数据如何打造一个中文NER系统 - 知乎专栏

CRF++模型格式说明-码农场

什么是crf的更多相关文章

  1. 【NLP】基于自然语言处理角度谈谈CRF(二)

    基于自然语言处理角度谈谈CRF 作者:白宁超 2016年8月2日21:25:35 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  2. 【NLP】基于机器学习角度谈谈CRF(三)

    基于机器学习角度谈谈CRF 作者:白宁超 2016年8月3日08:39:14 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都 ...

  3. 【NLP】基于统计学习方法角度谈谈CRF(四)

    基于统计学习方法角度谈谈CRF 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  4. 【中文分词】条件随机场CRF

    之前介绍的MMEM存在着label bias问题,因此Lafferty et al. [1] 提出了CRF (Conditional Random Field). BTW:比较有意思的是,这篇文章的二 ...

  5. JointBoost+CRF+GraphCut做手绘草图的分割

    研究生做的稍微有点水平的就这两个项目了:一个是利用SVM做手绘草图的分类,另一个是利用JointBoost+CRF做手绘草图的分割.总结得出的经验是做研究的方法就是将别人大神的代码看懂然后改成适合自己 ...

  6. 条件随机场(CRF) - 2 - 定义和形式(转载)

    转载自:http://www.68idc.cn/help/jiabenmake/qita/20160530618218.html 参考书本: <2012.李航.统计学习方法.pdf> 书上 ...

  7. 条件随机场(CRF) - 1 - 简介(转载)

    转载自:http://www.68idc.cn/help/jiabenmake/qita/20160530618222.html 首先我们先弄懂什么是"条件随机场",然后再探索其详 ...

  8. 机器学习&数据挖掘笔记_23(PGM练习七:CRF中参数的学习)

    前言: 本次实验主要任务是学习CRF模型的参数,实验例子和PGM练习3中的一样,用CRF模型来预测多张图片所组成的单词,我们知道在graph model的推理中,使用较多的是factor,而在grap ...

  9. CRF++使用小结

    1. 简述 最近要应用CRF模型,进行序列识别.选用了CRF++工具包,具体来说是在VS2008的C#环境下,使用CRF++的windows版本.本文总结一下了解到的和CRF++工具包相关的信息. 参 ...

  10. CRF条件随机场简介

    CRF(Conditional Random Field) 条件随机场是近几年自然语言处理领域常用的算法之一,常用于句法分析.命名实体识别.词性标注等.在我看来,CRF就像一个反向的隐马尔可夫模型(H ...

随机推荐

  1. 自建yum仓库yum源

    目的:搭建自己的yum源主要是解决大批量服务器下载更新人互联网带宽占用问题及速度问题以及不能访问的问题. 服务端:  步骤如下: 一.创建一个目录,就是我们yum软件存放的目录 [root@vicwe ...

  2. Mongodb查询提示com.MongoDB.MongoException: too much data for sort() with no index

    解决办法: 查询数据量太大,添加索引即可解决问题 通过scrapy爬行完数据后,通过db.wooyun.drops.ensureIndex({"datetime":1})

  3. HTTP虚拟主机

    Ps:http-2.4版本 [root@localhost ~]# tar zxvf httpd-2.4.23.tar.gz -C /usr/src/ [root@localhost ~]# cd / ...

  4. 线程有gil锁

    gil锁作用: 遇到阻塞( 比如 recv() , accept() )就切换

  5. python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)

    阅读目录 一.Selenium介绍 二.爬虫为什么要用selenium? 三.PhantomJS介绍 四.PhantomJS安装 五.操作实战 六.在此推荐虫师博客的学习资料 selenium + p ...

  6. python 配置导入方式

    许多连接,如 from setting import redis_config pool= redis.ConnectionPool(**redis_config) r=redis.Redis(con ...

  7. 【nodejs】--express的中间件multer实现图片文件上传--【XUEBIG】

    Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件.该中间件不处理multipart/form-data数据格式以外的任何形式的数据 Tips ...

  8. python 数据结构之二分查找的递归和普通实现

    二分查找就是待查找的列表进行分半搜索 如下所示 二分查找普通实现: def erfen(alist, item): start = 0 end = len(alist) - 1 while start ...

  9. Python itertools模块详解

    这货很强大, 必须掌握 文档 链接 http://docs.python.org/2/library/itertools.html pymotw 链接 http://pymotw.com/2/iter ...

  10. git解决Could not execute editor

    我是安装k-vim后出现了这个问题,可能是vim的某些插件引起的 配置git的编辑器可解决: git config --global core.editor "/usr/bin/vim&qu ...