中文分词毕业论文(5)

2019-04-23 19:07

石家庄经济学院本科生毕业论文

经过预处理后应该变成“你的编号是 12345 ,Welcome”。在进行预处理过程中,“你的编号是”这几个字符同属于中文字符,故不进行处理,而“1”与“是”分属于不同的的字符,则在两者之间由中文分词系统自动添加上空格,从而减少了歧义的产生。

3)中文分词模块:在经过预处理后得到的应该是连续的单个中文字组成的中文词串,在这部分用双向匹配来进行中文分词,这是整个中文分词的核心,也是设计的关键部分。对于中文分词系统来说,采取什么样的分词算法,分词算法的效率如何是评价一个系统好坏的决定因素。本系统在吸收了最大正向匹配和最大正向匹配的基础上,采用了双向匹配的分词策略,该算法的具体思想上是首先分别用最大正向匹配和最大逆向匹配进行分词,然后根据分词的结果来进行判断采取用何种分词结果。在这个模块,本系统用户可以在看到最大正向匹配和最大逆向匹配的分词结果不同时的地方,从而对分词以后进行消除歧义打下了良好的基础。

4)分词结果保存模块:本功能模块的主要功能是允许用户将分词结果以文本形式保存起来,此模块的功能相对简单,不涉及什么算法,只是为用户提供了保存结果的一个接口,在该模块用户可以自己定义要保存的文件的名称和保存路径。

4.3 中文分词结果的实现

本系统的实现环境是Eclipse,它是IBM公司出品的开源的java语言运行环境,开发语言是java,java是纯面向对象的语言,是一门很优秀的编程语言。

首先在Eclipse内新建java工程,命名为WordAutoSegment,来管理整个工程项目。

接下来我们将实现词典库的设计,在WordAutoSegment项目中添加一个新类Dictionary,用它来全面封装词典数据库中的数据和相关词典库存储的操作。根据上文3.2.1阐述的词典机制,来逐步实现词典类。

(1)在类Dictionary中有一个属性是词典的名称,对于中文分词系统来说,我们不能加载任何词典,这不可能也不现实,我们只是加载经过用户自己同意加载的词典,这类词典都有特殊的名称,这就是类Dictionary内的属性。

(2)在上文中提到,我们将词典分为不同的子字典,每一个子字典的长度是相同的,因此对于一个完整的中文分词系统来说,我们只有一个具体的大的词典的数据库,在数据库里面存在着很多的子词典,这就要求我们提过了两个方面的要求:首先,我们需要一个用来盛放子字典的容器,我们用链表来实现;其次,根据面向对象的思想,我们需要抽象出一个类来表示子字典,因此我们在工程中再添加一个新的类,名称为SubDictionary,根据上文中提到的词典机制,我们的SubDictionary分别有长度,内容等属性。无论是Dictionary还是SubDictionary当中与词典的相关操作(查询、插入等)与链表的查询、删除、插入等一致,本文不在赘述,有感兴趣的读者可查阅与链表相关的资料。 在词典简历完成后我们就可以很好的实现最大正向匹配(MM)和最大逆向匹配(RMM),在此基础上实现双向匹配。我们新建一个类命名为MaxMatchSegment,用来封装中文分词系统中出现的分词算法,在4.2中我们提到本中文分词系统有预处理模块,因此我们又创建了字符检查类CharTest,用来进行完成预处理模块所要求的功能,然后为了完成接下来我们的核心算法,我们又创建了实现了工具类Search 和Sort来对所要进行的字符串进行搜索和排序。通过以上的工作,接下来实现核心算法:

- 19 -

石家庄经济学院本科生毕业论文

(1)正向最大匹配的函数名称是segmentChnLToR,该函数接受一个参数String source,即要分词的源文件,返回结果是一个分好词的链表。具体代码实现如下: private List segmentChnLToR(String source){ String temp = \ List list = new ArrayList();//新建一个链表用来存储分词结果 int[] wordLen = dictionary.getDBWordLen();//获得字典数据库内单词长度的个数,即字典数据库内有几个子字典 int start = 0; int length = source.length();//获得分词的单词长度 int minReadLen = 0; if (wordLen.length == 0) return null;//如果没有子字典,则返回空 minReadLen = wordLen[0]; while (start < length){ minReadLen = wordLen[wordLen.length - 1]; if (minReadLen > (length - start)){ minReadLen = length - start;//如果子字典的最大长度大于要分词的长度,则取剩余的要分词的字符串为最大的长度 } while(minReadLen > 1){//用二分法查找与当前最大匹配长度相同的子字典 if (!Search.binarySearch(wordLen, minReadLen)){ minReadLen--; continue; } temp = source.substring(start, start + minReadLen);//取得要分词的字符串 if (dictionary.find(temp)){//如果找到该字符串则退出 break; }else{//如果找不到则最大长度减一 minReadLen--; } } temp = source.substring(start, start + minReadLen);//取得匹配成功后的字符串 list.add(temp);//将匹配成功的字符串添加到List start += minReadLen; } return list;//返回List }

(2)逆向最大匹配的函数名称是segmentChnRToL,该函数接受一个参数String source,即要分词的源文件,返回结果是一个分好词的链表。具体代码实现如下: private List segmentChnRToL(String source){ String temp = \ List list = new ArrayList() ; List list1 = new ArrayList();//新建两个链表,一个用来存储中间的保存结果,一个用来存放最后 的结果 int[] wordLen = dictionary.getDBWordLen();//获得字典数据库内单词长度的个数,即字

- 20 -

石家庄经济学院本科生毕业论文

典数据库内有几个子字典 int start = 0; int length = source.length(); int minReadLen = 0; if (wordLen.length == 0) return null;//说明没有字典 minReadLen = wordLen[0]; while (start < length){ minReadLen = wordLen[wordLen.length - 1];//最长的子字典 if (minReadLen > (length - start)){//如果子字典的最大长度大于要分词的长度,则取剩余的要分词的字符串为最大的长度 minReadLen = length - start; } while(minReadLen > 1){//用二分法查找与当前最大匹配长度相同的子字典 if (!Search.binarySearch(wordLen, minReadLen)){ minReadLen--; continue; } temp = source.substring(length - start - minReadLen, length - start);//取得要分词的字符串 if (dictionary.find(temp)){//如果找到该字符串则退出循环 break; }else{//找不到该字符串最大匹配长度减一 minReadLen--; } } temp = source.substring(length - start - minReadLen, length - start);//取得反向匹配的字符串 list.add(temp);//将匹配的字符串保存到临时的链表内 start += minReadLen; } for (int i = list.size() - 1; i >= 0; i--){//按分词源文件的方向将分词结果保存到链表内 temp = (String)list.get(i); list1.add(temp); } return list1;

}

(3)在实现了最大正向匹配和最大逆向匹配后我们来实现双向匹配算法:双向匹配算法的思想上文已经提到,具体代码实现如下: private String operate(TextBlock block){ String result = \ List list1 = null;//得到最大正向匹配的结果 List list2 = null;//得到最大逆向匹配的结果 //判断是否是中文字符,如果不是中文字符,则添加“/” if (block.getProperty() != CharTest.CHINESE){ result = block.getText() + \ - 21 -

石家庄经济学院本科生毕业论文

}else{ list1 = segmentChnLToR(block.getText());//从左至右拆分 list2 = segmentChnRToL(block.getText());//从右至左拆分 //比较正向和反向两个最大匹配,返回分词结果,当两个方向的分词结果一致,返回字符串, //当不一致,返回长度小的,当长度一致,返回反向的 result = compare(list1, list2); } return result;

}

在最大双向匹配的的函数实现中调用了compare()这个函数是比较最大正向和最大逆向的匹配结果,然后选择最优的,这个函数就是单纯的链表比较,因为这个比较不是本算法的重点,具体实现不在赘述。

在实现了核心算法以后,为了使用户更舒适、更方便、更人性化,我们设计了UI图形界面,如图4-2所示:

① ⑧

图 4-2 中文分词系统界面

UI图形界面说明:①----用户可以选择载入字典,也可以使用现有的字典; ②、③--用户选择输入方式,当用户点击手动输入时,③区域变为可 编辑的,用户可以在里面输入自想要分词的内容,当点击文 件输入时,会弹出对话框,当用户选择文件点击确认后,会 将文本打开显示在③区域当中;

④、⑤--当用户点击分词后,会将显示在③区域内容的文字按双向 匹配分词,分词结果会显示在区域⑤内,⑤显示分词的结果;

- 22 -

石家庄经济学院本科生毕业论文

⑥----状态显示栏,会将系统当前运行的状态显示出来;

⑦----当用户点击是的时候回弹出文件保存对话框,将用户需要保存 的内容保存起来;

⑧----当用户点击退出按钮时,系统退出。

- 23 -


中文分词毕业论文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2015-2022年中国通信设备行业分析及投资前景评估报告 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: