枣品质决策系统对枣信息进行分词预处理大学本科毕业论文_第1页
枣品质决策系统对枣信息进行分词预处理大学本科毕业论文_第2页
枣品质决策系统对枣信息进行分词预处理大学本科毕业论文_第3页
枣品质决策系统对枣信息进行分词预处理大学本科毕业论文_第4页
枣品质决策系统对枣信息进行分词预处理大学本科毕业论文_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要枣因其营养价值高,易种植,耐存活且在不同地域拥有不同特色而成为许多地方特别是山区高原致富之道,但由于技术方面的欠缺使得果农无法用专业知识去评估自己手中果实的品质和正确价值导向,由此带来一系列问题,信息消息的滞后导致农户盲目种植,产品积压,销售停滞。因此就要找到相关途径,知己之道,才能让枣农更快发展富裕起来。由此需求设计了《枣品质决策系统》,它是依托当前信息的网络化、快速化,使用网络评估果实品质,给出相关建议等服务为前提的综合信息评估服务系统的设计。通过短信接收果农给出的枣信息的初始描述,进行划句分词,得到相应的属性,并反馈给果农及专家。通过《枣品质决策系统》进行果实评估给出建议,方便即果农专家进行相关工作,又减少成本。缩短果农与专家的距离。在此项目中选择了JavaWeb作为开发语言,用到了面向对象的开发思想和中文分词技术。在接口设计上,实现了数据封装和信息隐藏。关键字:枣品质评估、JavaWeb、中文分词。

AbstractDatesbecauseofitshighnutritionalvalue,easytogrow,resistancetosurviveandindifferentregionshavedifferentcharacteristicsandbecomerichinmanyplaces,especiallyinmountainousplateau,butduetothelackoftechnologymakethefruitcannotuseprofessionalknowledgetoevaluatethequalityoftheirownhandsthefruitandthecorrectvalueguidance,leadingtoaseriesofproblems,informationmessagesdelayleadtofarmersplantingblindly,productbacklog,salesstalled.Sowillfindrelevantway,bosomfriend,togetthemostrichfasterdevelopment.Thusdemand"jujubequalitydecisionsystemisdesigned,itisrelyingonthecurrentinformationnetwork,rapidness,usingthenetworkevaluatingfruitquality,andprovideadviceandotherservicesastheprerequisiteofcomprehensiveassessmentinformationservicesystemdesign.Throughthedescriptionoftheinitialdateinformationispresentedinshortmessagereceivingfruit,iszonedwordsegmentation,togetthecorrespondingattribute,andgivefeedbacktothefarmersandexperts.Throughthejujubequalitydecision-makingsystemtoevaluatefruitrecommendations,namelyfruitexpertsforarelatedwork,andreducecosts.Shortenthedistanceofgrowersandexperts.InthisprojectweselectJavaWebasadevelopmentlanguage,usetheobject-orienteddevelopmentthoughtandthedesignconceptoftheMVCdesignpattern.Intheinterfacedesign,realizedthedataencapsulationandinformationhiding.Keywords:Jujubequalityassessment,JavaWeb,ChineseWordSegmentation.目录1.引言 31.1背景和意义 31.1.1背景 31.1.2意义 31.2国内的现状 31.3本文的重点 52.技术支持 62.1开发工具和环境 62.1.1开发环境 62.1.2开发软件 62.1.3系统环境配置 62.2JSP技术 62.2.1JSP介绍 62.2.2JSP技术开放的技术 72.2.3JSP的技术优势 72.3Servlet技术 82.4Tomcat服务器 82.4中文分词技术 93.需求分析与概要设计 113.1需求分析 113.1.1设计思想 113.1.2功能需求 113.2概要设计 113.2.1系统总体分析 113.2.2系统模块划分 113.2.3按模块分总体设计 123.2.4按各模块间关系 134.详细设计及实现 144.1设计说明 144.2数据结构设计 144.2.1数据库的选择 144.2.2数据结构 144.3中文分词流程 164.3.2基础模块流程 164.3.2模块流程图 174.3.3算法流程图 184.4中文分词实现 194.4.1系统设计模式 194.4.2词典设计 204.4.3分词设计 224.4.5后台包及设计 244.4.6异常处理 244.4.7出现的问题以及解决方法 245结论 255.1技术特点 255.2缺点及不足 255.4总结 25致谢 26参考文献 271.引言本系统是面向专家和农户,基于中小型数据库数据挖掘工具。它基于语言开发,不但操作简单,界面友好,易于操作,实用性强;同时还能够跨平台运行。1.1背景和意义1.1.1背景枣本身的功能价值赋予的,枣的补血、美容、保健、营养、抗癌、抗疲劳、镇静、护发、降脂、降糖、养生等等效果符合现代人追求的时尚要素国务院总理温家宝3月5日在十二届全国人大一次会议上作政府工作报告时提出,要促进农业稳定发展和农民持续增收。坚持把解决好“三农”问题作为各项工作的重中之重。党的十六大以来,党中央明确要把解决好“三农”问题放在全党工作重中之重的位置,着力统筹城乡经济社会发展,加快形成城乡发展一体化新格局。党的十八大从中国特色社会主义事业总体布局出发,推出了“促进工业化、信息化、城镇化、农业现代化同步发展”,明确“城乡发展一体化”是解决“三农”问题的根本途径。随着计算机技术和网络技术的迅速崛起,计算机日渐深刻的在改变着人们的生产生活方式。而互联网已日益成为收集提供信息的最佳渠道,并逐步进入科学种植决策领域。1.1.2意义枣树的种植区域地理环境和人文环境特征赋予的,枣树的种植不仅仅有它的经济意义,更有重要的环境意义和社会价值,枣树种植的区域主要分布在我过干旱、半干旱、风沙荒漠化和土地盐碱化的区域,枣树的种植可以极大的改善这些区域的生态环境,符合人类与自然和谐相处的命题,同时这些区域主要为中国经济发展相对滞后的区域,是我国改善这些区域人民生活环境、提高他们生活水平,增加收入来源的重要抓手,对于缩小区域经济差异,促进经济和谐发展有着重要意义。1.2国内的现状随着计算机网络的飞速普及,人们已经进入了信息时代。在这个信息社会里,信息的重要性与日俱增,无论是个人,企业,乃至政府都需要获取大量有用的信息。谁掌握了信息,谁就能在竞争中处于有利位置。在这种环境下,搜索引擎技术逐渐成为技术人员的开发热点,而其中最为重要的技术就是分词技术。分词技术属于自然语言理解技术的范畴,是语义理解的首要环节,它是能将语句中的词语正确切分开的一种技术。它是文本分类,信息检索,机器翻译,自动标引,文本的语音输入输出等领域的基础。而由于中文本身的复杂性及其书写习惯,使中文分词技术成为了分词技术中的难点。近年来人们对中文分词技术有了一定的研究提出了多种多样的中文分词算法。目前的中文分词算法主要分为三大类:基于词典的方法,基于统计的方法和基于规则的方法。由于中文分词的三种基本算法,都有其各自的优缺点,所以为了能够达到更好的分词效果,人们开始有目的的把分词的几种基本算法以及其他知识结合起来,这就形成了现在日新月异的混合型分词算法。(1)吴建胜等提出的基于自动机的分词方法,这种算法的基本思想是:在数据结构方面,把词典组织成自动机形式,在匹配算法上采用最大向前匹配算法,把二者有机的结合到一起,以达到更好的分词效果。(2)赵伟等提出的一种规则与统计相结合的汉语分词方法,这种分词算法的基本思想是:基于一个标注好了的语料库,并且结合了规则和语料库统计两种分词方法。(3)张长利等提出的一种基于后缀数组的无词典分词方法,这种分词算法的基本思想是:通过后缀数组和利用散列表获得汉字的结合模式,通过置信度筛选词,能够快速准确地抽取文档中的中、高频词,适用于对词条频度敏感、对计算速度要求高的中文信息处理。(4)孙晓等提出的基于动态规划的最小代价路径汉语自动分词方法,这种分词算法的基本思想是:基于最长次长匹配的方法建立汉语切分路径有向图,将汉语自动分词转换为在有向图中选择正确的切分路径,其中有向图中的节点代价对应单词频度,而边代价对应所连接的两个单词的接续频度;运用改进后Dijkstra最小代价路径算法,求出有向图中路径代价最小的切分路径作为切分结果。混合型分词算法多种多样,所结合的知识点也有很多,可以结合数据结构知识来形成新的词典机制;也可以结合标记语料库的方法更好的完善分词算法。显而易见,混合型分词算法在大多数方面要优于基本型分词算法。它将成为今后分词算法研究中的一个热点。由于中文词与词之间不象西文那样有明显的分隔符,所以构成了中文在自动切分上的极大困难。在现有的中文自动分词方法中,基于词典的分词方法占有主导地位。而中文分词的主要困难不在于词典中词条的匹配,而是在于切分歧义消解和未登录词语的识别。在中文分词过程中,这两大难题一直没有完全突破。(1)歧义处理歧义是指同样的一句话,可能有两种或者更多的切分方法。目前主要分为交集型歧义、组合型歧义和真歧义三种。其中交集型歧义字段数量庞大,处理方法多样;组合型歧义字段数量较少,处理起来相对较难;而真歧义字段数量更为稀少,且很难处理。分词歧义处理之所以是中文分词的困难之一原因在于歧义分为多种类型,针对不同的歧义类型应采取不同的解决方法。除了需要依靠上、下文语义信息;增加语义、语用知识等外部条件外,还存在难以消解的真歧义,增加了歧义切分的难度。同时未登录词中也存在着歧义切分的问题,这也增加了歧义切分的难度。所以歧义处理是影响分词系统切分精度的重要因素,是自动分词系统设计中的一个最困难也是最核心的问题。(2)未登录词识别新词,专业术语称为未登录词。也就是那些在字典中都没有收录过词。未登录词可以分为专名和非专名两大类。其中专名包括中国人名、外国译名、地名等,而非专名包括新词、简称、方言词语、文言词语、行业用词等。无论是专名还是非专名的未登录词都很难处理,因为其数量庞大,又没有相应的规范,而且随着社会生活的变迁,使未登录词的数量大大增加,这又为未登录词的识别增加了难度。因此,未登录词识别是中文分词的另一大难点。1.3本文的重点叙述如何使用中文分词技术实现对枣信息的划分,并得出相应的属性。2.技术支持2.1开发工具和环境2.1.1开发环境主机操作系统:WINDOWS2007、windowsXP2.1.2开发软件JDK1.6级以上版本集成开发环境:Myeclipse数据库:SQLSEVVER2008. Web应用服务器:Tomcat6.0级以上版本2.1.3系统环境配置使用进java环境下开发程序,必须在电脑中安装jdk和tomcat,并配置系统环境变量,一边程序正常运行。系统所处环境变量设置如下:Setjava_homec:\JDK1.6.0SetCatalina_homeD:\Apache-tomcat-6.0.18SetCLASSPATH%java_home%\lib;%java_home%\lib\tools.jar;C:\ProgramFiles(x86)\SetsqlpathMicrosoftSQLServer\jdbcdriver\sqljdbc_3.0\chs\sqljdbc.jar.;%java_home%lib\tool.jar;%java_home%\lib\dt.jar;%catalina_home%\lib\jsp-api.jar;%catalina_home%lib\servlet-api.jar;2.2JSP技术2.2.1JSP介绍JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与JavaServlet一样,是在服务器端执行的,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。2.2.2JSP技术开放的技术1、平台和服务器的独立性JSP技术只要写入后编译一次,之后,可以运行在任何具有支持Java开发环境中运行的。2、Jsp开放的原代码JSP技术是由SUN应用JAVA团队性过程开发。Apache,Sun和许多其他公司个人公开成立一个强大的咨询机构以便任何企业公司和个人都能得到免费的代码和信息。3、技术开发方面JSP和ASP从技术方面都能使编程人员实现通添加网页的组件制作交互式的动态内容和应用程序的WEB节点实现超链接网页。而ASP只支持组件对象模型COM,但是JSP能提供的组件都是基于JavabeansTM技术或JSP标签库等技术。2.2.3JSP的技术优势(1)只要编译一次,就能在其他环境中运行。比其他语言优秀更。(2)用JSP做的系统的可以再跨平台运行。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP等语言的局限性是显而易见的。(3)强大的嵌入性。很多jar文件就可以运行Servlet/JSP,比如servlet-api.jar、catalina.jar等,可以处理很多对象信息比如application对象还有response对象,显示了一个巨大的适应性。(4)开发工具强大。有Java和tomcat等强大的开发工具,因为Java开发工具强大可以看出jsp据用强大的生命力,强大的后台语言技术开发工具支持。动态HTML页动态HTML页MySql服务器Tomcat服务JSPJavaBean实体类图图2-1jsp模式图2.3Servlet技术Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。2.4Tomcat服务器Tomcat服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(businesslogic)。Tomcat服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamicresponse)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServerPages)脚本,servlets,ASP(ActiveServerPages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。Web服务器的代理模型(delegationmodel)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求(request)的程序(译者注:服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transactionprocessing),数据库连接(databaseconnectivity)和消息(messaging)等功能。2.4中文分词技术中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解。其处理过程就是分词算法。现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。1、基于字符串匹配的分词方法这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:1)正向最大匹配法(由左到右的方向);2)逆向最大匹配法(由右到左的方向);3)最少切分(使每一句中切出的词数最小)。还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。2、基于理解的分词方法这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。3、基于统计的分词方法从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。3.需求分析与概要设计3.1需求分析3.1.1用户必须登录进入相关角色才能使用相关权限的功能。词典库中必须有一定的类别及属性词条,作为初始库。分词过程中通过查询词典文件来分词,将分词结果与属性表进行匹配以找到相关的属性,并显示在页面。3.1.功能划分:词典库的初始化。接收前台中用户输入的信息。利用中文分词算法对信息处理,得到单独的词条。对每个词条进行分析,得出对应的属性。将分析结果反馈给用户,并扩充词典库。3.2概要设计3.2.1系统总体分析总体分析如图1—4:数据库数据库JavaBeanServletJsp,Javascript,AJAX图图3-1系统总分析图3.2.2系统模块划分模块一,决策树生成模块。(由张金磊完成) 负责用JDBC桥接数据库,使用ID3算法生成ID3型决策树,根据输入属性完成品质评估,样本数据管理,属性评估。前台页面设计。数据库表设计。用户增删改查。 模块二,分词模块,显示模块。(由臧进进完成) 负责根据输入的对于果实的通俗描述语句,分出相应属性词语,并将新描述词填入词库。 模块三,数据导入模块,基础模块。(由富兆慧完成) 负责完成单条数据录入数据和用excel表批量导入数据库。3.2.枣品质决策系统枣品质决策系统基础模块决策树模块数据导入模块分词模块显示模块获取数据结构数据存储提供相关接口决策树生成品质评估决策树评估单条数据导入批量数据导入语句划分智能加入新词接收用户操作显示评估信息显示相关数据图3-2总体设计图3.2.4按各模块间关系接收用户操作接收用户操作显示评估信息显示相关数据语句划分智能填词决策树生成品质评估决策树评估批量数据导入单条数据导入获取数据结构数据存储提供相关接口显示模块分词模块决策树模块数据导入模块基础模块图3-3各模块间关系4.详细设计及实现4.1设计说明本模块主要是实现通过短信获得果农描述的枣信息,利用中文分词技术,对信息进行划分,最终得到对应的属性,并以短信形式返回给果农,并为系统进行枣品质估计做准备。由于时间有限,接受果农短信这一功能并未实现,而是直接输入枣信息。最终得到的结果页只是展示到网页上。4.2数据结构设计由于数据库内部结构复杂并且关系紧密,因此设计一个合理的数据结构,用来存储数据库内部表与表、字段与表、字段与字段之间的关系和信息是很有必要的。4.2.1数据库的选择在开发这个系统上,通用性是我们考虑的一个重要因素,因为主要用于服务器运行web系统,所以选择sql数据库。在匹配上比较适合系统。4.2.2数据结构根据系统面对用户,数据库设计以下结构:数据库信息结构:数据库名称(fruit)数据库表信息结构:1.user表createtableusers( user_idintidentity(1,1)notnullprimarykey, user_namevarchar(16)notnull, passwordvarchar(20)notnull, emailvarchar(40), phonevarchar(20), remarksvarchar(50), limitintnotnullcheck(limit>=0andlimit<=2))用户数据表记录用户相关数据,用户名,密码(md5加密),电子邮件,权限(管理员0,专家1,用户2)。2.Oldinfor表:createtableoldinfor( id_1intidentity(1,1)notnullprimarykey, infor_1varchar(200))用户输入的原始数据,编号,内容(最多200字符)3.Newinfor表:createtablenewinfor( id_2intidentity(1,1)notnullprimarykey,foreignkey(id_2)referencesoldinfor(id_1), infor_2varchar(200))进行划分后的信息。编号,内容(最多200字符),引用外键oldinfor表的id_1。4.datainfor表createtabledatainfor(idintidentity(1,1)primarykeynotnull,typevarchar(20),attrubutevarchar(20),valueint)该表的功能相当于查询表,当得到字符串后,与该表匹配,得到相应的属性,类别。表内容:编号,类别,属性,对应值。表内容如下:图图4-1枣属性图4.3中文分词流程4.3.2用户输入枣描述信息加载分词的词典利用分词函数得到字符串将字符串与枣属性表进行匹配根据匹配结果得到对应的属性输出结果。4.3.2模块流程登录登录否是否注册否是否注册注册是注册是果实评估果实评估进行分词进行分词查询词典查询词典否否是否含词条是否含词条扩充词典扩充词典是是与属性表匹配与属性表匹配输出结果输出结果图图4-2模块流程图开始4.3.3算法流程图开始去当前字符串前m个字符作为匹配字段去当前字符串前m个字符作为匹配字段·查找字典,进行匹配查找字典,进行匹配成功?成功?否否匹配字段右去一个词匹配字段右去一个词是是否否匹配字段为0?匹配字段为0?是是切分出该字,在字符串中去除m个字符切分出该字,在字符串中去除m个字符否否结尾结尾是是结束结束图图4-3算法流程图4.4中文分词实现4.4.1系统设计模式面向对象编程是近来程序开发的主流,和以往的面向过程编程相比,它更具有可维护性和可扩展性。无论是从程序设计还是到程序开发,都展现出了面向过程无法比拟的优点。首先,它从人类认识世界的角度出发,提出了“万物皆对象”的思想。其次,对象具有的继承、封装和多态的特征,为程序的开发和维护带来了很大的便利。再次,面向对象的设计重点放在了对象和对象接口设计上,从而摆脱了以往面向过程的把主要精力放在如何实现的细节上。从面向对象的思想出发,我们开发数据库查询和分析工具的基础模块,在开发基础模块之前我们要把握好以下几点:模块封装性要好:一个模块分解是否成功的标志是看该模块自身的数据和细节封装的程度的大小。一个好的模块,可以把所有的实现细节隐藏起来,提供各外部的API与自己的具体实现区分开来。这样各个模块之间就只通过API进程通信,而不考虑具体的实现细节。模块扩展性要好:系统的最大特点就是要做到通用性,要想实现通用性,这就要求我们全面支持所有的数据库,当有新的数据库出现时,我们应该做到在不更改源代码的基础上实现功能的扩展。要求我们严格遵守开闭原则,即对扩展开放,对修改关闭。设计明确的接口:由于其他模块的开发不是有我来完成的,因此,为其他模块提供一个简单明了且不变动的接口也是软件开发的关键。系统维护性要好:由于系统开发出来之后,功能不会全部实现,有可能以后需要别人来维护系统,因此系统在开发过程中要生成完整的文档,以供系统维护。中文分词模块如下:IKSegmentation主分析器IKSegmentation主分析器量词处理子单元字母处理子单量词处理子单元字母处理子单元中文处理子单元中文处理子单元词典配置管理模块词典检索算法单元词典配置管理模块词典检索算法单元词典加载管理词典加载管理词典文件词典文件图图4-3中文分词模块4.4.2词典初始化词典采用Dictionary类的静态方法进行词典初始化,只有当Dictionary类被实际调用时,才会开始载入词典,这将延长首次分词操作的时间。该方法提供了一个在应用加载阶段就初始化字典的手段 publicstaticDictionaryinitial(Configurationcfg){ if(singleton==null){ synchronized(Dictionary.class){ if(singleton==null){ singleton=newDictionary(cfg); returnsingleton; }}} returnsingleton;}2.加载主词典及扩展词典建立一个主词典实例_MainDict=newDictSegment((char)0);读取主词典文件InputStreais=this.getClass().getClassLoader().getResourceAsStream(cfg.getMainDictionary());加载扩展词典this.loadExtDict();3.词典树分段(表示词典树的一个分枝)Hitmatch(char[]charArray,intbegin,intlength,HitsearchHit){ if(searchHit==null){ searchHit=newHit();//如果hit为空,新建 searchHit.setBegin(begin); //设置hit的起始文本位置 }else{ searchHit.setUnmatch();//否则要将HIT状态重置 } searchHit.setEnd(begin); //设置hit的当前处理位置 CharacterkeyChar=newCharacter(charArray[begin]); DictSegmentds=null; //引用实例变量为本地变量,避免查询时遇到更新的同步问题 DictSegment[]segmentArray=this.childrenArray; Map<Character,DictSegment>segmentMap=this.childrenMap; //STEP1在节点中查找keyChar对应的DictSegment if(segmentArray!=null){ //在数组中查找 DictSegmentkeySegment=newDictSegment(keyChar); intposition=Arrays.binarySearch(segmentArray,0,this.storeSize,keySegment); if(position>=0){ ds=segmentArray[position]; } }elseif(segmentMap!=null){ //在map中查找 ds=(DictSegment)segmentMap.get(keyChar); } //STEP2找到DictSegment,判断词的匹配状态,是否继续递归,还是返回结果 if(ds!=null){ if(length>1){ //词未匹配完,继续往下搜索 returnds.match(charArray,begin+1,length-1,searchHit); }elseif(length==1){ //搜索最后一个char if(ds.nodeState==1){ //添加HIT状态为完全匹配 searchHit.setMatch(); } if(ds.hasNextNode()){ //添加HIT状态为前缀匹配 searchHit.setPrefix(); //记录当前位置的DictSegment searchHit.setMatchedDictSegment(ds); } returnsearchHit; } } //STEP3没有找到DictSegment,将HIT设置为不匹配 returnsearchHit; }4.hit一次词典匹配的命中Hit不匹配privatestaticfinalintUNMATCH=0x00000000;Hit完全匹配privatestaticfinalintMATCH=0x00000001;Hit前缀匹配privatestaticfinalintPREFIX=0x00000010;4.4.3分词设计1.初始化初始化词典单例Dictionary.initial(this.cfg);初始化分词上下文this.context=newAnalyzeContext(this.cfg);加载子分词器this.segmenters=this.loadSegmenters();2.分词,获取下一个词元 *@returnLexeme词元对象 publicsynchronizedLexemenext()throwsIOException{ Lexemel=null; while((l=context.getNextLexeme())==null){从reader中读取数据,填充buffer,如果reader是分次读入buffer的,那么buffer要进行移位处理,移位处理上次读入的但未处理的数据 intavailable=context.fillBuffer(this.input); if(available<=0){ context.reset();returnnull;//reader已经读完 }else{ context.initCursor();//初始化指针 do{ //遍历子分词器 for(ISegmentersegmenter:segmenters){ segmenter.analyze(context); } //字符缓冲区接近读完,需要读入新的字符 if(context.needRefillBuffer()){ break; } }while(context.moveCursor());//向前移动指针 //重置子分词器,为下轮循环进行初始化 for(ISegmentersegmenter:segmenters){segmenter.reset(); } } //将分词结果输出到结果集,并处理未切分的单个CJK字符 context.outputToResult(); context.markBufferOffset(); //记录本次分词的缓冲区位移 } returnl;}3.中文子分词 publicvoidanalyze(AnalyzeContextcontext){ if(CharacterUtil.CHAR_USELESS!=context.getCurrentCharType()){ if(!this.tmpHits.isEmpty()){//优先处理tmpHits中的hit //处理词段队列 Hit[]tmpArray=this.tmpHits.toArray(newHit[this.tmpHits.size()]); for(Hithit:tmpArray){ hit=Dictionary.getSingleton().matchWithHit(context.getSegmentBuff(),context.getCursor(),hit); if(hit.isMatch()){ //输出当前的词LexemenewLexeme=newLexeme(context.getBufferOffset(),hit.getBegin(),context.getCursor()-hit.getBegin()+1,Lexeme.TYPE_CNWORD); context.addLexeme(newLexeme); if(!hit.isPrefix()){//不是词前缀,hit不需要继续匹配,移除 this.tmpHits.remove(hit);} }elseif(hit.isUnmatch()){ this.tmpHits.remove(hit);//hit不是词,移除}}} //再对当前指针位置的字符进行单字匹配HitsingleCharHit=Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(),context.getCursor(),1); if(singleCharHit.isMatch()){//首字成词 //输出当前的词 LexemenewLexeme=newLexeme(context.getBufferOffset(),context.getCursor(),1,Lexeme.TYPE_CNWORD); context.addLexeme(newLexeme); if(singleCharHit.isPrefix

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论