这两天想了解一下中文分词的一些技术,因此就研究了一把,也就是了解了一些皮毛,记录下来,首先申明我是外行,请勿用专业标准来要去我。
中文分词,主要是三个流派,一是词典派,一是统计派,一是规则派。比如“我爱北京天安门”,词典派就是去查词典,词典中中有“我”,“爱”,“北京”和“天安门”,就分出来了,简单吧。词典派的算法一般是最大匹配算法,比如“毛泽东北京华烟云”,正向最大匹配就是“毛泽东 北京 华烟云”,逆向最大匹配是“毛泽 东北 京华烟云”。还可以双向“毛泽东 北 京华烟云”。还有其他算法。统计派呢,就复杂点了,中心思想就是“由字组词”,研究字组词的概率,比如“我”,单独出现的概率是“50%”,“我爱”组合出现的概率是“10%”,那么“我爱”就不是一个词。比如“北京”,“北京”在很多文章中老放在一起,那么就应该在一起,是一个地名。一个是规则派,规则派我没怎么看,好像单独出现效果不好,一般大家都不用它。
说起优劣,词典派算法简单,无非是查查查,性能也好,普通电脑,一秒几百K甚至上M都可能。词典派的一个主要问题是,词典中没有咋办,没有就没法分啊,而且互联网上大家创造力惊人,新词层出不穷。而统计派,在识别新词方面,尤其是人名、地名、机构、日期、数量词方面特别管用,你词典中能把所有人名都放进去么,而且,词典大了,有歧义啊。统计派,和RPG游戏类似,得满满来培养,就是训练,而且分词的时候性能也不大好。
分词算法,网上也挺多,如果兼顾性能、准确性,还是c++写的比较好。
中科院的ICTCLAS分词。
这是官方的源码下载站点
http://ictclas.org/Down_OpenSrc.asp
有C#版本,是吕振宇做做的,分析文章列表如下:
http://www.cnblogs.com/zhenyulu/category/85598.html
做.NET的朋友可以订阅吕老师的博客,在.NET方面很有研究。
JAVA版本的,是张新波做的,下面是分析文章:
http://blog.csdn.net/sinboy/category/207165.aspx
把文章看完,把代码看完,你就是专家了。ICTCLAS的分词,只支持GBK(GB2312)字符集,所以如果是UTF-8的,您还得自己转一下,本来我想改写成支持UTF-8的,没时间搞了。
下面是分完的结果:
---------------------------------------------------
视频/n :/w 证监会/j 发布/v 创业/vn 板/n IPO/nx 办法/n 5/m 月/n 1/m 日/q 起/f 实施/v 媒体/n 来源/n :/w 第一/m 财经/n 《/w 早市/n 导航/vn 》/w 新华/nz 网/n 北京/ns 3/m 月/n 31/m 日/q 电/n (/w 记者/n 赵/nr 晓辉/nr 、/w 陶/nr 俊洁/nr )/w 中国证监会/n 31/m 日/d 发布/v 《/w 首/d 次/a 公开/a 发行/v 股票/n 并/c 在/c 创业/nz 板/a 上/f 市/n 管理/v 暂行/b 办法/n 》/w ,/w 办法/n 自/a 5/m 月/n 1/m 日/d 起/f 实施/u 。/w 这/r 意味着/v 筹备/v 十/m 余/m 年/a 之/a 久/a 的/b 创业/nz 板/a 有望/v 于/d 5/m 月/n 1/m 日/d 起/f 正式/a 开启/v 。/w 办法/n 共/d 分/v 为/p 6/m 章/q 58/m 条/q ,/w 对/p 拟/v 到/v 创业/v 板/ng 上市/v 企业/n 的/u 发行/vn 条件/n 、/w 发行/v 程序/n 、/w 信息/n 披露/vn 、/w 监督/vn 管理/vn 和/c 法律/n 责任/n 等/u 方面/n 进行/v 了/u 详细/a 规定/n 。/w 根据/p 规定/n ,/w 到/v 创业/v 板/ng 上/f 市/n 的/u 企业/n 应当/v 是/v 依法/d 设立/v 且/c 持续/vd 经营/v 三/m 年/q 以上/f 的/u 股份/n 有限公司/n ,/w 最近/t 两/m 年/q 连续/a 盈利/n ,/w 最近/t 两/m 年/q 净利润/n 累计/v 不/d 少于/v 1000/m 万/m 元/q ,/w 且/c 持续/vd 增长/v ;/w 或者/c 最近/t 一/m 年/q 盈利/n ,/w 且/c 净利润/n 不/d 少于/v 500/m 万/m 元/q ,/w 最近/t 一/m 年/q 营业/vn 收入/n 不/d 少于/v 5000/m 万/m 元/q ,/w 最近/t 两/m 年/q 营业/vn 收入/n 增长率/n 均/d 不/d 低于/v 30%/m 。/w 企业/n 发行/v 后/f 的/u 股本/n 总额/n 不/d 少于/v 3000/m 万/m 元/q 。/w
ICTCLAS:235.109000 ms
---------------------------------------------------
写完了,又发现一个资料挺全的博客,刀剑笑的:
http://blog.csdn.net/jyz3051/category/356808.aspx?PageNumber=1
还有一个分词是,李沫南写的,libmmseg。
李沫南这个家伙,如果我没记错的话,我和他共事过,想不到研究分词,还能遇到故人。
我简单介绍一下:sphinx。sphinx是俄罗斯人写的开源的针对数据库的一款索引产品。如果想做中小规模的站内搜索,用它就没错了。特色是比Mysql的全文索引快(废话),另外纯天然的支持数据库(可以内嵌到Mysql中做为一个引擎)。想研究的朋友可以看这里:http://www.sphinxsearch.com/ 。再插一句话,本来对于sphinx我是写过一篇教程的,但是csdn服务器抽风,所以就没了,我也不写了。
还是回到分词吧,libmmseg分词方法可以看下面的博客文章,此博客也是李沫南的博客。
http://nzinfo.spaces.live.com/Blog/cns!67694E0B61E3E8D2!344.entry
下面是分完的结果
---------------------------------------------------
$ mmseg -d /home/lhb/workspace/mmseg/dict/ /home/lhb/soft/text/01.txt
/x 视频/x :/x 证监会/x 发布/x 创业/x 板/x IPO/x 办法/x /x 5/x 月/x 1/x 日/x 起/x 实施/x /x /x 媒体/x 来源/x :/x 第一/x 财经/x 《/x 早市/x 导航/x 》/x
/x /x 新华/x 网/x 北京/x 3/x 月/x 31/x 日/x 电/x (/x 记者/x 赵/x 晓/x 辉/x 、/x 陶/x 俊/x 洁/x )/x 中国/x 证监会/x 31/x 日/x 发布/x 《/x 首次/x 公开/x 发行/x 股票/x 并/x 在/x 创业/x 板/x 上市/x 管理/x 暂行/x 办法/x 》/x ,/x 办法/x 自/x 5/x 月/x 1/x 日/x 起/x 实施/x 。/x 这/x 意味着/x 筹备/x 十/x 余年/x 之/x 久/x 的/x 创业/x 板/x 有望/x 于/x 5/x 月/x 1/x 日/x 起/x 正式/x 开启/x 。/x
/x /x 办/x 法共/x 分为/x 6/x 章/x 58/x 条/x ,/x 对/x 拟/x 到/x 创业/x 板/x 上市/x 企业/x 的/x 发行/x 条件/x 、/x 发行/x 程序/x 、/x 信息/x 披露/x 、/x 监督/x 管理/x 和/x 法律/x 责任/x 等/x 方面/x 进行/x 了/x 详细/x 规定/x 。/x
/x /x 根据/x 规定/x ,/x 到/x 创业/x 板/x 上市/x 的/x 企业/x 应当/x 是/x 依法/x 设立/x 且/x 持续/x 经营/x 三/x 年/x 以上/x 的/x 股份/x 有限公司/x ,/x 最近/x 两/x 年/x 连续/x 盈利/x ,/x 最近/x 两/x 年/x 净利润/x 累计/x 不/x 少于/x 1000/x 万元/x ,/x 且/x 持续/x 增长/x ;/x 或者/x 最近/x 一/x 年/x 盈利/x ,/x 且/x 净利润/x 不/x 少于/x 500/x 万元/x ,/x 最近/x 一/x 年/x 营业/x 收入/x 不/x 少于/x 5000/x 万元/x ,/x 最近/x 两/x 年/x 营业/x 收入/x 增长率/x 均/x 不/x 低于/x 30/x %/x 。/x 企业/x 发行/x 后/x 的/x 股本/x 总额/x 不/x 少于/x 3000/x 万元/x 。/x
Word Splite took: 22 ms.
---------------------------------------------------
ICTCLAS和libmmseg的优劣,前者效果要好一些,后者速度快一些。前者效果好的原因是对于人名、地名有一些规则在里头。后者呢,这些好像没有。速度方面,后者比前者快一个数量级吧。另,前者的UTF-8支持需要额外处理。
对于统计派,也有一些资料可以参考。
赵海的主页:
http://bcmi.sjtu.edu.cn/~zhaohai/index-cn.html
赵海的博客
现在统计派都比较流行CRF(Conditon Random Field)条件随机场/域的方法,看字都认识,合起来就不知道啥意思了。
据说HMM(Hidden Markov Model 马尔可夫模型),MEMM(最大熵马尔科夫模型)过时了。关于这几个概念,可以参考:http://wshxzt.ycool.com/post.1769559.html。
工具包和使用上,下面链接:
基于CRF的中文分词
当然还有一些,上google搜CRF就可以了。
一款好的分词,估计需要用到综合的办法,词典是必须的,新词识别也是必须的,歧义消除也是必须的,因此就要博采众长,才能再性能、准确率、召回率上找到平衡。
写完这篇文章,发现了一帮哥们基于CRF++做的分词开源项目,bamboo,哈哈
http://groups.google.com/group/nlpbamboo
http://code.google.com/p/nlpbamboo/
有兴趣可以研究一下哦,那里聚了不少人。
1)下载bamboo,编译安装后,
2)下载已经训练过的模型
http://code.google.com/p/nlpbamboo/downloads/list
下载index.tar.bz2,解压到/opt/bamboo/index下
你要是想自己跑,可以下载
3)$cd /opt/bamboo/bin/