Java 开源中文分词器 Ansj 作者孙健专访
在线演示:http://ansj.sdapp.cn/demo/seg.jsp
官网地址:http://www.ansj.org/
Github地址:https://github.com/ansjsun/ansj_seg
我们本期采访了Ansj的作者孙健,请他为大家详细介绍一下这个分词工具。
先来个自我介绍吧!
介绍一下Ansj!
上面是客套话,先说明一下Ansj命名的由来吧。本来开始打算叫totoro分词(同事帮忙起的名),最后发现好多厕所中卫生洁具都叫“TOTO” ^_^
正好我注册了Ansj.org域名,于是乎,就叫这个名字吧。
你认为中文分词的难点是什么?
1. 中文歧义的识别
比较出名的一句话“结婚的和尚未结婚的”,如果使用正向最大匹配,容易分成“结婚/的/和尚/未/结婚的”,于是有的学者试图倒过来识别,逆向匹配会大于正向。但是碰到这句“结合成分子时”,采用逆向最大匹配,则会分为“结合/成分/子时”,更有甚者像“咬了猎人的狗”这种语意不明的词语,就更不容易正确分词了。这是中文分词的软肋。下面是些典型的歧义句:
- 交叉歧义(多种切分交织在一起):内塔内亚胡说的/确实/在理
- 组合歧义(不同情况下切分不同):这个人/手上有痣、我们公司人手
- 真歧义(几种切分都可以):乒乓球拍/卖/完了、乒乓球/拍卖/完了
2. 实体名识别
这个是中文分词遇到的最大的难点,也是最最紧迫的。实体名识别包括人名识别、地名识别、机构名识别,还包括有监督识别和无监督识别。有监督的还好,无监督基本是无解的,比如“王大力发球”是“王大力”还是“大力发球”,一般人都难以识别。
3. 新词热词发现
目前常用的新词发现还是一个比较有研究性的课题,虽然有些论文在准确率很高,但是大多是封闭测试,这意味着结果很难应用到实际工程中。目前Ansj采用的新词发现方式比较简单,采用了高频词的匹配方式,不使用规则,用统计重复串识别新词,根据词性去掉干扰词,虽然有一定的效果,但还是差强人意。
4. 颗粒度问题
这个就是一个规则探讨的问题了,比如“北京大学”是“北京”+“大学”还是“北京大学”,人各有志,就连同一个人不同时间的标注也有可能是有区别的,虽然这个问题严格上来说不属于技术问题,但是对分词结果的评测却有着很大的关系,Ansj采用“能识别就识别”的策略方针,所以在真正R值的时候偏低,总之一句话,适合学术的不一定适合工业,反之亦然。
简单介绍一下Ansj分词用到的算法,其分词原理是什么?
该算法实现分词有以下几个步骤:
- 全切分,原子切分;
- N最短路径的粗切分,根据隐马尔科夫模型和viterbi算法,达到最优路径的规划;
- 人名识别;
- 系统词典补充;
- 用户自定义词典的补充;
- 词性标注(可选)
Ansj分词的准确率大概是多少?
- P(准确率):0.984887218571267
- R(召回率):0.9626488103178712
- F(综合指标F值):0.9736410471396494
在歧义、未登录词问题上,Ansj表现怎样?
至于未登录词的识别,目前重点做了中文人名的识别,效果还算满意,识别方式用的“字体+前后监督”的方式,也算是目前我所知道的效果最好的一种识别方式了。
Ansj的性能如何?
核心词典利用双数组规划,每秒钟能达到千万级别的粗分。在我的MacBookAir上面,分词速度大约在300w/字/秒,在酷睿i5+4G内存组装机器上,更是达到了400w+/字/秒的速度。
如何添加自定义词典?
从硬盘加载用户自定义词典的方法:
用户自定义词典默认路径:项目目录/library/userLibrary/userLibrary.dic
格式为:[自定义词] [词性] [词频],如:csdn创新院 userDefine 1000,中间用TAB键隔开
原分词结果:[csdn, 创新, 院, 是, 一个, 好, 公司]
增加词典后:[csdn创新院, 是, 一个, 好, 公司]
详细内容见:用户自定义词典的添加
用户自定义词典的动态添加删除方法见:用户自定义词典的动态添加删除Demo
你在开发过程中,遇到哪些困难?
你认为Ansj还需要在哪些方面进行完善?
虽然已经着手开始进行中,但是进展一直不快。有兴趣的同学可以多提意见,可以通过Github参与到该项目中,让我们做一个真正的Java版的高准确率分词。
Github地址:https://github.com/ansjsun/ansj_seg
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2014-07-03 20:50:48
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!