作者:肖波
个人博客:http://blog.csdn.net/eaglet
2007/5 南京
这段时间通过研究目前在互联网上可以搜索到的中文分词算法,感觉很难找到既快又准的分词方法,通过几天时间的研究,我终于找到了一种快速且较准确的中文分词方法。现在回过头来想想,觉得其实问题并不很复杂,对于一般应用,我觉得这个算法应该基本够用了,当然目前没有一种方法可以达到100%的分词准确度,这个算法也是一样。对于实际应用往往需要在效率和准确度上做个折中,当然对技术的追求是无止境的,我也将继续努力,争取在后续版本中进一步提高准确度,并维持现有效率。
基本技术指标
分词准确度:90%以上(只是自己统计了一下,有待专家的权威评测)
处理速度: 600KBytes/s (P4
和互联网上几个比较流行的中文分词方法的比较
和SharpICTCLAS的比较
提到中文分词,就不能不提到计算所开发的ICTCLAS 中文分词系统,这个系统采用一些语义分析的方法以提高分词的准确度。看了它的算法,感觉确实有很多值得学习的地方,只是算法相对复杂,维护时除了要维护词表还要维护词的关系,当然复杂也有复杂的好处,对于如下句子:“请把手抬高一点儿”,比较互联网上我所找到的几个算法(包括我的算法),只有ICTCLAS可以正确分词。
分词速度:
ICTCLAS 的分词速度为31.5Kbytes/s 由于没有实际去测,只能引用其代码中写的数据。这个速度比我的算法慢将近20倍。
我用了河北理工大学经管学院
准确度:
用SharpICTCLAS V1.0 版本对一些有歧异的句子进行分词,发现有的句子我的算法可以较好的处理,但SharpICTCLAS不能得到正确的结果。如“长春市长春节致词”我的算法分析为:长春/市长/春节/致词, SharpICTCLAS分析为:长春市/长/春节/致词/,这个错误可能并不是SharpICTCLAS的算法缺陷,可能只是V1.0版本提供的训练集不充分造成的,是不是算法目前我还没有仔细研究。
SharpICTCLAS 对于一些需要根据语义来分析的语句如上面提到的“请把手抬高一点儿”分析效果很好,可以把“把手”分解为把/手 而我的算法则分解为 把手。
未登录词识别能力:
感觉SharpICTCLAS对于未登录词的识别能力并不象代码注释中写的那么高,比如下面句子:
“新浪体育讯 英超赛季结束后,曼城队一直处在各种动荡之中”,SharpICTCLAS分词的结果是 “新/浪/体育/讯/英/超/赛季/结束/后/,/曼/城/队/一直/处在/各种/动荡/之中/ ”
我的算法分词结果是 “新浪/体育/讯/英超/赛季/结束/后/,/曼城队/一直/处在/各种/动荡/之中/”
总结:
SharpICTCLAS V1.0 和我的算法比较,效率明显偏低,每秒6000字节的效率是很难满足搜索引擎等大数量应用要求的,但对于有些短文本的分词,效率并不是一个重点需要考虑的问题。
分词准确度方面:基于目前SharpICTCLAS提供的训练集比较,我认为各有千秋,在网上找了几篇文章,整篇文章分词进行比较,感觉我的算法总体上比SharpICTCLAS好像还要准确一些。
和雨痕中英文分词组件的比较
雨痕中英文分词组件 (http://www.rainsts.net) 的专业版不是免费的,所以只使用了其免费的演示版本进行了比较。
分词速度:
雨痕的分词速度大概在每秒4000字节左右,这个和SharpICTCLAS差不多,比我的算法慢100倍左右。
准确度:
雨痕的分词准确度还是比较高的,但和我的算法一样存在算法的先天缺陷,对于必须通过语义才能判断的句子,无法准确分词。对于其他类型的有歧异的句子,分词能力还是不错的,我只发现类似下面的句子“于北京时间
分词结果是“于北京/ 时间/
未登录词识别能力:
还是对比如下面句子分词:
“新浪体育讯 英超赛季结束后,曼城队一直处在各种动荡之中”,雨痕分词的结果是 “新浪/ 体育/ 讯/ / 英超/ 赛季/ 结束/ 后/ ,/ 曼/ 城/ 队/ 一直/ 处在/ 各种/ 动荡/ 之中”,这个结果比SharpICTCLAS还是要准确一些,但“曼城队”被分成了三个词,这方面我的算法要稍微好一些。
总结:
雨痕中英文分词组件的效率较低,很难满足搜索引擎等大数量应用要求的。准确度方面还是比较高的,和我的算法的准确度相比基本差不多。
和 ShootSearch 分词组件的比较
ShootSearch (http://www.shootsoft.net)分词组件是一个开源的分词组件,其分词效率很高,和我的算法速度不相上下,但ShootSearch只采用了简单的最大匹配算法,分词准确度很低,前面举的几个例子都不能很好的分词,由于准确度太低,这里就不重点分析了。
KTDictSeg 分词算法介绍
我把组件名名为KTDictSeg,它是由KaiToo搜索开发的一款基于字典的简单中英文分词组件。
分词算法
谈到分词算法,目前有很多。比较常用的是正向最大匹配和反向最大匹配算法。但这两种算法对于一些存在多元歧异的句子缺乏较好的支持。以“长春市长春节致词”和“长春市长春药店”这个两个句子为例:
“长春市长春节致词”可以依次拆分为 长春、长春市、市长、长春、春节、致词 这几个词,按照正向最大匹配算法,分词结果是长春市/长/春节/致词,按照反向最大匹配算法,分词结果是长春/市长/春节/致词。
“长春市长春药店”可以依次拆分为长春、长春市、市长、长春、春药、春药店、药店 这几个词,按照正向最大匹配算法,分词结果是 长春市/长春/药店,按照反向最大匹配算法,分词结果是“长春/市长/春药店”。
可见无论是正向还是反向最大匹配,都存在产生歧异的情况。
KTDictSeg 的算法在正向匹配算法的基础上做了一些改进,用一句话描述就是找到句子中第一个未被匹配的字数最少的单词组合,如果多个组合未被匹配的字数都是最少则找到其中匹配的单词个数最少的组合。匹配顺序是从左至右。还是以上面两个句子为例:
“长春市长春节致词” 按正向最大匹配扫描顺序可以出现如下匹配的单词组合:
1) 长春/市长/春节/致词 匹配单词数4,未匹配字数0
2) 长春市/长春/致词 匹配单词数3,未匹配字数0
不难看出,第一中组合未匹配的字数最少,所以取组合1。
“长春市长春药店”按正向最大匹配扫描顺序可以出现如下匹配的单词组合:
1) 长春市/长春/药店 匹配单词数3,未匹配字数0
2) 长春市/春药店 匹配单词数2,未匹配字数1
3) 长春市/春药 匹配单词数2,未匹配字数2
4) 长春市/药店 匹配单词数2,未匹配字数2
5) 长春/市长/春药店 匹配单词数3,未匹配字数0
6) 长春/市长/春药 匹配单词数3,未匹配字数1
7) 长春/市长/药店 匹配单词数3,未匹配字数1
8) 长春/市长/药店 匹配单词数3,未匹配字数1
9) 长春/长春/药店 匹配单词数3,未匹配字数1
可见组合1和组合5 未匹配数最小,匹配单词数相等,但组合1匹配顺序靠前,所以取组合1。
未登录词识别
KTDictSeg 对未登录词的识别采用一个简单判定,即把未在字典中找到的连续的字组成一个词,这种判断是基于分词算法比较准确且词库中的词足够多的假设下做出的,由于KTDictSeg的分词算法相对比较准确且附带的词库收录了20多万条词,所以KTDictSeg对未登录词的识别也相对比较准确。
优点
KTDictSeg 的 优点是分词速度非常快,且分词准确度相对简单的最大匹配算法有很大提高,所以可以应用于一些对分词准确度要求不是非常苛刻,但对分词效率要求较高的应用环境中,比如大多数的中小型中文搜索引擎都可以使用这个分词组件。
KTDictSeg 还有一个优点就是简单,用户只需维护一个汉语词库就可以达到比较准确的分词效果,减少了用户维护的工作量和对系统的开销。
缺点
KTDictSeg 的致命缺点是无法对语义进行判断,对于一些语义相关的句子不能够做到100%识别出来,而且无论怎样调整词库,理论上都无法达到100%匹配。
开源代码
KTDictSeg 下载位置