关闭

【中文分词】亲手开发一款中文分词器--前言

306人阅读 评论(0) 收藏 举报
分类:

我曾亲手写过一个中文分词器,分别使用java和c#实现了两个版本。实现原理类似,精度相近,并且java版本发布在了我的个人网站上,这里附上地址。http://august-charter-92912.appspot.com/nlp,注意了,这是Google App Engine上的,所以看到谷歌,你懂的,需要访问,请发功。


一、简介

所谓分词,就是将一个完整的句子按正确的意思将每一个词语提取出来的操作。分词是自然语言处理的第一个关卡,是让计算机处理人类语言的基础。但是计算机是无法识别人类语言中词汇这一概念的,更何况如何去识别理解词语了。所以如何通过有效的手段来进行分词是一个重要节点性问题。


对于英文分词来讲,由于英文词汇间由空格隔开,因此无需程序从句子中去提取词汇。这一点上英文比中文容易多了。英文分词更多的重心是放在如何将各种时态的词汇映射到同一种形式上,以方便计算机理解。这里提供一种英文分词方案,基于词干分词(参考文章《stemming segmentation,基于词干分词》)。对于中文这种词与词之间没有任何间隔的语言来讲,比如日语,韩语等,如何确定一个句子中包含有哪些词语才是重点,时态什么的,反而不是问题了。


首先中文分词有一个很根本的问题,什么是词?其实尚且人类都没有一个准确的定义。不同的人对于同一个词语的认可度是不近相同的,比如:“看一看”,其实分开为“看,一,看”三个词也没有太大问题,又比如“听到”,分解开为“听,到”好像也可以,因此人类都无法准确定义词这一概念,这就使得计算机分词特别困难。同时,句子的歧义也是制约分词准确性的一大因素,比如:“努力的人才能够成功”,其中“人才”需要分开看待,此处不为一个词,但是“公司需要寻找优秀的人才”,此处很明显“人才“必须合并起来。还有一个更绝的例子:”原子组合成分子“,其中”组合成分子“五个字两两组合都能够成为一个词,但是很明显我们应该得到”组合,成,分子“才是正确的结果。最后,还有一种词语是影响分词精度的最严重因素——未登录词,就是诸如人名,地名,专有名词等特殊词语组合,他们无从在字典中查询但是却合法,这类词语需要分词器重点考虑,比如”威廉姆斯“,”集成电路“,”最大熵“,”神马“等等。


二、方法介绍

中文分词发展出了大概三种基本方法,字典匹配分词,统计学习分词,理解分词。我实现的是一个统计学习分词器,所以我之后的文章会重点讨论它。


字典匹配分词有正向最大匹配,逆向最大匹配等。我罗列不完,因为没有花太多时间研究。这里提供两个开源项目供大家下载:IKAnalyzer,下载1下载2

IKAnalyzer是一个java开发的轻量级中文分词工具包,采用正向迭代最细粒度切分算法,号称具有83万字/秒的处理速度。具体信息去链接中看,这里略过。

另外一个是复旦大学计算机学院维护的开元分词工具包,FudanNLP,具体连接可以去Git上搜索。也是一款好用的开源分词器,基于字典匹配分词。


对于理解分词,我从来没有研究过其中的奥秘,但是目前来看,其分词精度还无法与统计学习相提并论。


最后来说说统计学习分词。统计学习分词的原理是使用一个标准的中文语料库通过统计学习的方式来训练分词器,使分词器能够在对大规模数据进行整理的过程中,记录下词语的特性。常用的训练模型有隐马尔科夫(HMM),条件随机场(CRF),最大熵(MEM)等。本博客中有一篇国外论文的译文,《隐马尔科夫模型详解》,可以帮助你系统地学习马尔科夫随机过程。


我的这个中文分词器使用的是一阶隐马尔科夫模型,所以希望继续阅读下去请首先简单学习一下隐马尔科夫模型。分词语料库来自微软亚洲研究院,这里提供下载链接,编程语言为java。准备好了就开始下一篇文章《【中文分词】亲手开发一款中文分词器——原理》,重点讨论我的分词器的原理和代码实现。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7075次
    • 积分:262
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条