我开发的中文分词程序,开源发布 ,其实哪个中文分词的整体架构是比较糟糕的。架构是否优秀决定了很多构思无法实现,思考了比较久,最近准备开发第二版,抛弃以前的架构,重新实现。下面是一些设计和构思。计划是两周时间开发完成beta版(如果因为工作关系,也有可能放弃),主要是希望和大家交流下设计思想,我觉得构思很重要,想得实现不了,可以慢慢研究,想不到才是头大的问题,希望能和大家一起交流下:
新版中文分词构想(面向搜索):
分解流程:
1,分段,根据基本的分隔符号对文本进行分段,比如,。;!!,; \r\n等分解文本
2,分字符区,即分解成纯粹的 中文文本区 ,数字区 ,综合字符区(包括英文,数字或者其他符号),分割符号区
3,对中文文本区调用中文分词算法,对数字区区按空格分词,对综合字符区调用英文分词算法,分割符号区保留
4,对初步分解的单字中文进行中文姓名识别。
5,结合前后词,对单字中文和数字做日期识别分析
6,未登陆词分析与识别
算法构想:
1,中文分词算法
匹配模式:正向最大化,反向最大化,概率最大化
也会考虑参考SharpICTCLAS系统的NShortpath分词算法(不过目前还没看懂,迟钝的很)
2,中文姓名识别算法
主要根据中文姓,加上初步分解出的单字中文进行分析:基于词库分析单字中文作为名的概率。
3,日期识别算法
将分解出的单字中文结合前后字符,判断是否为以下格式之一:
数字+年+数字+月+数字+日
数字+年+数字+月
数字+月+数字+日
数字+月
数字+日
4,新词识别(未登陆词识别)
1,将分解出的单字中文判断排除常用单词(StopWords)外,作为单字出现的概率。所以需要一个单字字库,包括单字出现概率的信息。
当然也可以将现有词库对词进行分解成单字概率分布模型库(具体如何设计还没考虑好),提出来和大家交流下:
单字出现在第一个字符概率 出现在中间的概率 出现在尾部的概率
2,将上叙分析的新词进行概率分析,比如在全文中出现超过N次(比如2次,次数越大,作为一个词的可能性越高),以提高新词识别的准确度;
不过如此大动作的分析,性能估计有很大问题。
5,英文分词算法
1,将全部字符处理为半角字符。
2,将全部字符处理为小写字符。
3,识别各种英文字符格式,比如电子邮件格式,网址格式等等。(用正则表达式)
4,处理英文形式问题:比如将所有英文复数形式转换成单数形式。将各种简写形式处理为同一形式等等(这部分有兴趣可以参考dotlucene和snowball.net对英文处理的方式,这个部分我也没有深入研究过。)