crf++实现中文分词简单例子 (Windows crf++0.58 python3)
学习自然语言处理的同学都知道,条件随机场(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)的更多相关文章
- 基于CRF的中文分词
http://biancheng.dnbcw.info/java/341268.html CRF简介 Conditional Random Field:条件随机场,一种机器学习技术(模型) CRF由J ...
- 【中文分词】条件随机场CRF
之前介绍的MMEM存在着label bias问题,因此Lafferty et al. [1] 提出了CRF (Conditional Random Field). BTW:比较有意思的是,这篇文章的二 ...
- CRF++进行中文分词实例
工具包:https://taku910.github.io/crfpp/#tips 语料:http://sighan.cs.uchicago.edu/bakeoff2005/ 安装: 1)下载linu ...
- (转)全文检索技术学习(三)——Lucene支持中文分词
http://blog.csdn.net/yerenyuan_pku/article/details/72591778 分析器(Analyzer)的执行过程 如下图是语汇单元的生成过程: 从一个Re ...
- (五)Lucene——中文分词器
1. 什么是中文分词器 对于英文,是安装空格.标点符号进行分词 对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词. 比如:“我的中国人”,分词:我.的.中国.中国人.国人. 2 ...
- NLP舞动之中文分词浅析(一)
一.简介 针对现有中文分词在垂直领域应用时,存在准确率不高的问题,本文对其进行了简要分析,对中文分词面临的分词歧义及未登录词等难点进行了介绍,最后对当前中文分词实现的算法原理(基于词表. ...
- Python环境下NIPIR(ICTCLAS2014)中文分词系统使用攻略
一.安装 官方链接:http://pynlpir.readthedocs.org/en/latest/installation.html 官方网页中介绍了几种安装方法,大家根据个人需要,自行参考!我采 ...
- 轻量级的中文分词工具包 - IK Analyzer
IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用 ...
- Elasticsearch安装ik中文分词插件(四)
一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Lu ...
随机推荐
- Python Django install Error
Exception:Traceback (most recent call last): File "/home/djangogirls/myvenv/lib/python3.6/site ...
- ubuntu16.04 解决boot空间不足
1. dpkg --get-selections |grep linux-image #查看已安装内核版本号 2. uname -a #查看现运行版本 3. sudo apt-get purge 版本 ...
- thinkphp5.0如何隐藏index.php入口文件
隐藏入口文件 public/index.php 同级的.htaccess文件 [ Apache ] 方法1: <IfModule mod_rewrite.c> Options +Follo ...
- DateGridView控件与mysql交互
private void dgv() { //Ip+端口+数据库名+用户名+密码 string connectStr = "server=127.0.0.1;port=3306;databa ...
- Spring Boot 框架的依赖管理
Spring Boot为完成不同需求的Spring应用构建,提供了多种不同的依赖管理模板,每种模板均为一系列已完成的依赖的管理.例如在我们的入门程序中,需要构建web项目,我们只需添加spring-b ...
- Codeforces1113F. Sasha and Interesting Fact from Graph Theory(组合数学 计数 广义Cayley定理)
题目链接:传送门 思路: 计数.树的结构和边权的计数可以分开讨论. ①假设从a到b的路径上有e条边,那么路径上就有e-1个点.构造这条路径上的点有$A_{n-2}^{e-1}$种方案: ②这条路径的权 ...
- Keuskal算法模板
int cmp(const int i, const int j) { return w[i]<w[j]; }///间接比较函数,w[i]表示边i权值 int find_set(int x) { ...
- 对spring框架的理解
spring框架的两大核心理念就是IOC和AOP,在面试的时候经常会被问到你对spring的理解.下面大致的说一下我对spring的理解. 一.IoC 1.1.什么是IoC 众所周知,IoC就是控制反 ...
- OO第二次博客作业(第二单元总结)
在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...
- Java入门练习之四则运算
Java入门练习之四则运算 项目目的 制作一个Java控制台程序,让他可以随机生成四则运算,并针对用户的输入判断对错. 项目分析 该项目本质上是一个四则运算出题器,可以创建一个Question类,其中 ...