学习自然语言处理的同学都知道,条件随机场(crf)是个好东西。虽然它的原理确实理解起来有点困难,但是对于我们今天用到的这个crf工具crf++,用起来却是挺简单方便的。

今天只是简单试个水,参考别人的博文进行了个简单的中文分词,如有错误之处,欢迎指出。

在正式开工之前,我先介绍下条件随机场以及crf++的安装

第一部分 介绍

首先介绍下啥是条件随机场,条件随机场(CRF)是给定一组输入随机变量条件下,另一组输出随机变量的条件概率分布模型。

以一组词性标注为例,给定输入X={我,喜欢,雷峰塔},那么输出为Y={名词,动词,名词}的概率应该为最大。输入序列X又称为观测序列,输出序列Y又称为状态序列。这个状态序列构成马尔可夫随机场,所以根据观测序列,得出状态序列的概率就包括,前一个状态转化为后一状态的概率和状态变量到观测变量的概率。

回到咱们的主题中文分词,采取4-tag标注(S表示单字,B表示词首,M表示词中,E表示词尾)的话,可以为X={我喜欢雷峰塔},Y={我/S喜/B欢/E雷/B峰/M塔/E}。

而crf++是个独立工具,官网的下载地址似乎进不去,可以找找其他地方的资源。

windows版本的就下载解压就行了,Linux版本的可以参照其他博文。

训练和测试的数据下载地址,这个数据集应该是人民日报的文本。

第二部分 训练

准备好工具和数据后,就可以开工了。

首先,使用python将文本数据弄成crf++能处理的格式。

def character_tagging(input_file,output_file):
input_data = codecs.open(input_file,'r','utf-8')
output_data = codecs.open(output_file,'w','utf-8')
for line in input_data.readlines():
word_list = line.strip().split()
for word in word_list:
if len(word)==1:
output_data.write(word+'\tS\n')
else:
output_data.write(word[0]+'\tB\n')
for w in word[1:len(word)-1]:
output_data.write(w+'\tM\n')
output_data.write(word[len(word)-1]+'\tE\n')
output_data.write('\n')
input_data.close()
output_data.close()

调用character_tagging函数将下载的文本数据放进去,这些文本是已经做了分词的。源文本类似于这样:

据  新华社  北京  12月  31日  电  (  记者  罗  玉文  )  中央军委  委员  、  总政治部  主任  于  永波  日前  在  会见  全军  和  武警  部队  先进  典型  代表  时  强调  ,  全军  要  认真  贯彻  落实  江  泽民  主席  最近  的  重要  指示  精神  ,  形成  学习  邓小平理论  的  新  高潮  ,  把  这  一  学习  提高  到  十五大  所  达到  的  新  水平  ,  进一步  加强  军队  的  革命化  、  现代化  、  正规化  建设  。  

标记后,文本类似于这样:

据  S
新 B
华 M
社 E
北 B
京 E
1 B
2 M
月 E
3 B
1 M
日 E
电 S

标记后的文本数据即可用来训练了,将crf++文件夹下的crf_learn.exe、crf_test.exe、libcrfpp.dll以及example目录里seg下的template文件粘到刚刚标记好的文件所在目录下,然后在该目录下进入cmd,输入crf_learn -f 3 -c 4.0 template pku_training_tag.utf8 crf_model。

运行结果如下

该目录下生成一个crf_model的模型文件,通过该模型可以对文本进行分词了。

第三部分 测试

依然是使用python进行文本数据的处理,将待分词文本处理成一列,进入cmd,输入crf_test -m crf_module  data.utf8 > outfile,将生成分词结果,当然格式依然是4-tag格式,利用python转换成好看一点的格式。

def crf_convert(input_file,output_file):
out = codecs.open(output_file, 'w', 'utf-8')
inf = codecs.open(input_file, 'r', 'utf-8')
for line in inf.readlines():
if len(line) > 3:
if line[-3] == 'S' or line[-3] == 'E':
out.write(line[0] + ' ')
if line[-3] == 'B' or line[-3] == 'M':
out.write(line[0])
out.close()
inf.close()

这样,文本就做好分词了。

分词结果

据  新华社  北京  12月  31日  电  (  记者  罗  玉文  )  中央军委  委员  、  总政治部  主任  于  永波  日前  在  会见  全军  和  武警  部队  先进  典型  代表  时  强调  ,  全军  要  认真  贯彻  落实  江  泽民  主席  最近  的  重要  指示  精神  ,  形成  学习  邓小平理论  的  新  高潮  ,  把  这  一  学习  提高  到  十五大  所  达到  的  新  水平  ,  进一步  加强  军队  的  革命化  、  现代化  、  正规化  建设  。  

感觉和人工分词效果已经差不多了,这是训练的数据比较多的时候才产生的效果,试过训练时给少量数据,然后产生了下面的分词效果

  据  新华  社  北京  12  月3  1日  电(  记者  罗玉  文)  中央  军委  委  员  、  总政  治  部  主  任  于永  波  日  前  在  会  见全  军  和武  警部队  先  进典  型  代表  时强调  ,  全军  要  认真  贯  彻落  实江  泽  民  主  席  最近  的  重  要  指示  精神  ,  形成  学习  邓  小平  理论  的  新高  潮  ,  把  这  一  学习  提高  到  十五  大所  达到  的  新水  平  ,  进  一  步  加  强军队  的  革命  化  、  现  代  化  、  正规  化  建设  。  

可以看出,训练数据过少会导致模型效果很不佳。

同时,训练出来的模型对实体命名似乎不太友好,比如罗玉文这个人名,分词模型并没有分对,给分成了 罗/S 玉/B文/E ,这个有待改进。

crf++实现中文分词简单例子 (Windows crf++0.58 python3)的更多相关文章

  1. 基于CRF的中文分词

    http://biancheng.dnbcw.info/java/341268.html CRF简介 Conditional Random Field:条件随机场,一种机器学习技术(模型) CRF由J ...

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

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

  3. CRF++进行中文分词实例

    工具包:https://taku910.github.io/crfpp/#tips 语料:http://sighan.cs.uchicago.edu/bakeoff2005/ 安装: 1)下载linu ...

  4. (转)全文检索技术学习(三)——Lucene支持中文分词

    http://blog.csdn.net/yerenyuan_pku/article/details/72591778 分析器(Analyzer)的执行过程 如下图是语汇单元的生成过程:  从一个Re ...

  5. (五)Lucene——中文分词器

    1. 什么是中文分词器 对于英文,是安装空格.标点符号进行分词 对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词. 比如:“我的中国人”,分词:我.的.中国.中国人.国人. 2 ...

  6. NLP舞动之中文分词浅析(一)

    一.简介        针对现有中文分词在垂直领域应用时,存在准确率不高的问题,本文对其进行了简要分析,对中文分词面临的分词歧义及未登录词等难点进行了介绍,最后对当前中文分词实现的算法原理(基于词表. ...

  7. Python环境下NIPIR(ICTCLAS2014)中文分词系统使用攻略

    一.安装 官方链接:http://pynlpir.readthedocs.org/en/latest/installation.html 官方网页中介绍了几种安装方法,大家根据个人需要,自行参考!我采 ...

  8. 轻量级的中文分词工具包 - IK Analyzer

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用 ...

  9. Elasticsearch安装ik中文分词插件(四)

    一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Lu ...

随机推荐

  1. django + 阿里云云服务器网站搭建

    最近自己用django搭了一个小网站,个人的项目挂在了github上 https://github.com/LOMOoO/tpure 预计是挂在阿里云的云服务器上运行,云服务器买好了,阿里云的域名也买 ...

  2. Delphi7连接MySql数据库-DBGrid控件显示数据

    一个简单的Delphi7小程序,使用MySql数据库做简单查询,用DBGrid控件显示结果,实现过程如下: (1)在MySql中新建demouser表,插入记录用于测试. (2)在Delphi7中新建 ...

  3. C#action和func的使用

    以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...

  4. sublime text 3 ,React,html元素自动补全方法(用Emmet写法写jsx中的html)

    1. 安装emmet: Preferences -> Package Control -> Install Package -> emmet 2. 配置emmet: Preferen ...

  5. vue H5页面在微信浏览器打开软键盘关闭导致页面空缺的问题。

    methods:{ inputBlur () { // window.scroll(0, 0); setTimeout(() => { // alert(1); if (document.act ...

  6. HashMap源码解析(简单易懂)

    /* 每一个key-value存储在Node<K,V>中,HashMap由Node<K,V>[]数 组组成. */ static class Node<K,V> i ...

  7. 小妖精的完美游戏教室——buff系统

    作者:小妖精Balous,未经作者允许,任何个人与单位不得将此源代码用于商业化项目 #region buff /// <summary> /// 是否魔法免疫,魔法免疫的生物不会受到除自己 ...

  8. SpringBoot使用Druid数据库加密链接完整方案

    网上的坑 springboot 使用 Druid 数据库加密链接方案,不建议采用网上的一篇文章<springboot 结合 Druid 加密数据库密码遇到的坑!>介绍的方式来进行加密链接实 ...

  9. Eclipse 运行弹出A Java Exception has occurred.并报错Exception in thread 的解决方案

    这个问题是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行而产生的错误. 1.解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致.如果是linux版本 ...

  10. 简述at和crontab命令

    at 在指定时间执行相关命令 用法:at [option] TIME 常用选项: -l:查询等待运行作业的队列 -d:删除作业,加作业号 -q QUEVE: -c :查看具体作业任务: -f /pat ...