七叶笔记 » java编程 » 基于Java实现中文分词系统的示例代码

基于Java实现中文分词系统的示例代码

1.问题描述

中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。

而对于中文分词也有很多种算法,基本算法主要分为基于词典的方法、基于统计的方法和基于规则的方法。

基于词典的方法是指按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。按照扫描方向的不同包括正向匹配和逆向匹配,按照长度的不同分为最大匹配和最小匹配。在基于词典的方法中,我们采用了正向最大匹配和逆向最大匹配的方法进行分词。

而基于统计的分词方法,没有词典,主要思想是在上下文中,相邻的字同时出现的次数越多,就越可能构成一个词,因此字与字相邻出现的概率或频率能较好的反映词的可信度。主要的统计模型包括N元文法模型(N-gram),隐马尔科夫模型(Hidden Markov Model, HMM)。在基于统计的分词方法中,我们使用了隐马尔科夫模型来进行分词。

基于规则的方法,主要思想就是通过模拟人对句子的理解,达到识别词的效果,基本思想是语义分析,句法分析,利用句法信息和语义信息对文本进行分词。自动推理,并完成对未登录词的补充是其优点。但是这种方法现在发展还不成熟,需要继续发展和研究。

因此在我们的中文分词系统中,采用了基于词典的方法:正向最大匹配和逆向最大匹配,以及基于统计的方法中的隐马尔科夫(HMM)模型。

2.相关工作

现如今已经有很多的开源中分分词系统,而且效果都还不错。下面介绍几种比较常见的中文分词项目。

SCWS,Hightman开发的一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。

ICTCLAS,这是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到3M。ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。

HTTPCWS,是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展。

3.系统框架和算法设计

3.1系统整体框架

系统主要包括选择分词算法和进行数据的测试。首先需要选择进行分词的算法,包括基于HMM模型的分词算法,正向最大匹配分词算法和逆向最大匹配分词算法。选择了分词算法之后即可进行分词操作。

若选择的是基于HMM模型的分词算法,需要先进行训练集的训练,得到训练的统计数据,然后再进行数据测试。数据测试包括了文件输入测试,进行大规模数据的测试,也包括了直接输入测试,测试一句话或多句话进行简单测试。

对于正向最大匹配和逆向最大匹配则不需要进行训练集的训练,因为其是基于词典的方法,需要词典,而词典我们已经事先载入程序中了。正向最大匹配和逆向最大匹配也包括了文件输入测试和直接输入测试。

系统的整体框架如图3-1所示。

部分代码如下:

效果图展示 

到此这篇关于基于Java实现中文分词系统的示例代码的文章就介绍到这了,更多相关Java中文分词系统内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章