jsp小世界理论在网络中的应用与实现-qk论文_第1页
jsp小世界理论在网络中的应用与实现-qk论文_第2页
jsp小世界理论在网络中的应用与实现-qk论文_第3页
jsp小世界理论在网络中的应用与实现-qk论文_第4页
jsp小世界理论在网络中的应用与实现-qk论文_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

小世界理论在网络中的应用与实现计算机XXXX指导老师XXXX

摘要本文首先对小世界理论背景和意义进行了介绍,其次介绍了网络、分词等概念,再次介绍了整个系统开发流程,系统功能论述,最后对本系统进行了总结。关键词:小世界理论,网络,分词

Abstract ThispaperfirstintroducestheSixDegreesofSeparationbackgroundandsignificance,secondbytheintroductionofthenetwork,thewordsegmentationconcept,onceagainintroducesthesystemdevelopmentprocess,systemfunctionisdiscussed,andfinallyasummaryofthesystem.Keywords:Android,WeatherForecast,CellPhone,Software

目录目录摘要 2Abstract 31.前言: 61.1小世界理论概述 61.2研究现状 61.3项目研究的目的及意义 72.开发集成环境 72.1Eclipse开发环境搭建 72.1.1Eclipse整体介绍 72.1.2Eclipse环境设置介绍 82.2Struct1框架 92.2.1(Model—View—Controller)模式 92.2.2ApacheStruts框架 102.2.3JAR包 102.3Tomcat5.5与JDK1.5 112.3.1Tomcat5.5下载集成 112.3.2JDK介绍与配置 113.整个程序的实现(按照软件工程要求逐步写,配以相关函数,相关代码,界面及后台文件的截图): 113.1 程序的可行性分析 123.2 整个程序的整体架构 123.3 前台用户界面的设计 153.4 数据交互 173.5数据传递与显示 183.5 相关其他功能的实现 204.系统算法与实现 214.1网络蜘蛛 214.1.1网络蜘蛛搜索策略 214.1.2网页提取Boilerpipe简介 214.1.3代码实现 224.2新闻聚集 234.2.1新闻热点话题发掘 234.2.2新闻聚集 244.2.3代码实现 244.3中文分词 264.3.1中文分词 264.3.2TF-IDF 274.3.3代码实现 274.4RIP协议路由模拟 324.4.1RIP协议 324.4.1RIP协议模拟 334.4.1代码实现 35结论: 364.1项目过程与总结 374.2项目发展前景 374.3 项目的改进及建议 38致谢 39参考文献 40

1.前言:1.1小世界理论概述 著名的“小世界”(smallworld)理论或“六度分隔”(sixdegreesofseparation)来自2个非常有意思案例。[20][21]第一个案例发生在20世纪60年代,美国著名的社会心理学家斯坦利•米尔格拉姆(StanleyMilgram)曾经做过一个非常有趣的连锁信件实验。他在美国波士顿(Boston)和奥马哈(Omaha)两个地区任意挑选出296个人,然后给他们每人一封信,信中放了一个住在波士顿的股票经纪人的名字,这些被挑选出来的人只知道这个股票经纪人的名字、职业和大概的居住地点。米尔格拉姆在实验中要求这296人分别将这套信寄给那些自己认为比较接近那个股票经纪人的朋友,朋友收到此信后,也同样按照这种方式发给下一个人,如此一环扣一环,步步传递。实验结果让世人大跌眼镜。296封信件中居然有64封成功到达了目标人物—波士顿股票经纪人—的手中;而且,虽然从波士顿本城始发的信件比奥马哈始发的信件传递过程要来得长,但平均下来,每封成功到达的信只经过了5.2个中转过程(JeffreyTravers&StanleyMilgram,1969)。这个发现着实出乎大多数人意料。第二个案例也发生在德国一家报纸身上。若干年前德国一家报纸接受了一个挑战,要帮助法兰克福一位土耳其烤肉店的老板找到他与其最喜欢的影星马龙•白兰度的关系。没几个月该报社的员工就发现,原来,烤肉店老板是伊拉克的移民,他有个朋友住在美国加利福尼亚州;刚好,这个朋友有一位同事;这个同事的女朋友在女生联谊会上有个结拜的姐妹;这个结拜姐妹的父亲是电影《这个男人有点色》的制作人;而恰好,马龙•白兰度就是《这个男人有点色》的主演。因此,事实上,烤肉店的老板只需要经过6个人的私交,就可以与白兰度建立起联系了。上面两个案例反映的实际上是一个含义深刻、颇为典型的自然现象,这种现象在学术界概括为小世界理论。这种理论的意涵就是,你和世界上任何一个陌生人(只要不是与世隔绝)所间隔的人不会超过六个(JeffreyTravers&StanleyMilgram,1969);也就是说,最多通过六人的中介,你就可以结识任何一个人(EricaKlarreich,2003)。当然,在这里,六个人并不是绝对的,它表达的是这种意思:在现代全球化的社会中,任意两个素不相识的人,通过一定的联系方式,总是能够产生联系,之间绝对没有联系的人是不存在的。1.2研究现状目前小世界理论研究正如火如荼的进行中。首先它作为一种交叉性学科,小世界理论发展很快,已经在许多领域得到研究和应用如SARS传播、互联网控制、生物学蛋白质网络动力学研究等。具有小世界效应的动态系统模型能加快信号传播的速度,提高计算能力和计算同步性。谣言、传染病在小世界网络中传播比在规则网络中容易。其次在Internet方面的研究也得到了迅速的发展,学者在对Internet的小世界网的研究中,提到Internet具有小世界效应。网络平均距离3是随网络大小4对数增长的,它明显具有小世界效应。从结构上看,Internet的实际结构介乎于规则网络和随机网络,表明其具有小世界效应。Internet具有集团化、聚类的特征。有文献提到P2P系统是Internet节点合作组,在Internet上构成了它们自己特别目的的网络。所有与网络连接的节点共享资源(CPU、存储、信息等)并且与其它节点合作。有效地寻找和定位这些高端Internet资源,是P2P系统的关键[21]。再次小世界理论研究还在生物学领域的应用、重复囚徒困境博弈的SWN模型、NPD团队交流网络.1.3项目研究的目的及意义将小世界理论结合到网络进行研究的目的是为了验证在现实小区域网络中是否也能采用六度空间理论进行分割,找到现实网络中之间的关系,建立起适用于现实网络中基于小世界理论的概念模型、物理模型和数据模型,并在这些模型的基础上实现全世界网络关联关系的模型和应用。进行小世界理论在网络中的应用与实现的意义在于能够帮助用户迅速掌握网络信息的真实性,在网络中存在信息的实时性、准确性和相关性,由此进行网络信息的深度开发与应用,同时也可以帮助系统的决策者们抓住机遇、发现价值机会,为社会的发展带来良性循环,为科技发展提供新的动力。2.开发集成环境2.1Eclipse开发环境搭建2.1.1Eclipse整体介绍Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)[1]-[2]。虽然大多数用户很乐于将Eclipse当作Java集成开发环境(IDE)来使用,但Eclipse的目标却不仅限于此。Eclipse还包括插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。[1]这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言;例如,支持诸如C/C++、COBOL、PHP等编程语言的插件已经可用,或预计将会推出。Eclipse框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。基于Eclipse的应用程序的一个突出例子是IBMRationalSoftwareArchitect,它构成了IBMJava开发工具系列的基础。[2]从2006年起,Eclipse基金会每年都会安排同步发布(simultaneousrelease)。至今,同步发布主要在6月进行,并且会在接下来的9月及2月释放出SR1及SR2版本。图2-1Eclipse版本发布规划2.1.2Eclipse环境设置介绍Eclipse环境设置分为Workspace级和Project级。Workspace级的设置作为全局变量的设置,在Project级设置没有设置的情况下,Workspace级设置起作用,所以Workspace级设置可以看作为是系统默认设置。Project级设置是针对具体工程的设置,project设置的优先级比workspace设置高,一旦设置了project,在本project就直接被采用。但是project的设置只针对特定的project,在本project域中起作用。不能影响到workspace的设置。所以对于影响全局的设置是放置在workspace中设置,具体project的设置根据需要在project的属性中进行设置。Eclipse环境Workspace设置主要以下几点:字符集设定在工作台的window->Preferences->General->Workspace页面中设置Textfileencoding栏中点选Other:UTF-8作为工作台语言设置Server设定在工作台的window->Preferences->Server->RuntimeEnvironmer中设定服务容器,在服务运行时环境中新增一个服务器,选择ApacheTomcatV5。5,JRE选择jdk1。5配合使用;Java虚拟机编译设定在工作台的window->Preferences->Java->compiler页面中,在JDKCompliance也签中的Compilercommliancelevel:选择1。5;Java虚拟机设定在工作台的window->Preferences->Java->InstalledJREs页面中,新增jdk1。5作为运行环境中的虚拟机;Eclipse最大最小内存使用设置在Eclipse目录下eclipse。ini文件修改如下2项设置,如果默认设置为-Xms128m,-Xmx256m。本系统内存开销较大,所以修改成如下: -Xms512m -Xmx1024m2.2Struct1框架2.2.1(Model—View—Controller)模式MVC是20世纪80年代XeroxPARC为Smalltalk-80发明的一种设计模式,迄今成为一种成熟的优秀的设计模式[2]。MVC的核心是三个类对象:模型(M)应用对象、视图(V)在屏幕上的表示、控制器(C)定义用户界面对用户输入的响应方式。三类对象的关系如图1所示。Controller(控制器):控制着模型和视图之间的交互过程。它决定着向用户返回怎样的视图、检查通过界面输入的信息以及选择输入信息的模型。Model(模型):模型是真正完成任务的代码。对大多数Web应用程序来说,功能比界面感觉更重要。在模型与界面相分离的情况下,代码可以实现可管理性和可重用性。模型通常也被称为“业务逻辑”。View(视图):视图就是使用界面。视图可以作为客户向模型提供数据界面,并且承担向客户端显示来自由控制器传输过来的信息。ClientBrowserClientBrowserBusinessLogicActionModelApplicationViewJSPStruts-config.xml(1)ControllerServlet(2)(3)(4)(5)(6)(1)Post(2)Dispatch(3)Update(4)Forward(5)Extract(6)Response图2Struts运作流程图用户(User)控制器(Servlet)模型(JavaBean)视图(JSP)图1 MVC核心组件关系2.2.2ApacheStruts框架ApacheStruts框架是一个免费开发的Web层的应用架构[3]-[7]。它继承了MVC的各种特性,并且根据J2EE的特性作了相应的变化和扩展,图2是Struts实现MVC模式的工作机理(一)Controller(控制器)在Struts框架中使用以。xml为结尾配置文件(如:struts-config。xml)实现它的控制器功能,在最新的Struts1。1中可以支持多配置文件,以适应分布式的企业级的开发环境。它是Struts框架的核心部分。在Struts框架中Controller功能由ActionServlet和ActionMapping对象构成。ActionServlet是MVC设计模式的决策部分,也是Struts框架的核心。它根据ActionMapping把HTTP消息形式的用户请求转换成相应的应用程序的动作。ActionServlet还负责用相应的请求参数填充ActionForm(通常称之为FormBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问JavaBean或调用EJB,最后动作类把控制权传给后续的JSP文件,后者生成视图。(二)Model(模型)MVC系统中的Model部分从概念上可以分为两类——系统的内部状态和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象。所有的Action处理器对象都是开发者从org。apache。struts。Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象,可以通过定义属性描述客户端表单数据。开发者可以从org。apache。struts。ActionForm类派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和Request、Response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。(三)View(视图)Struts应用中的View部分是通过JSP技术实现的。Struts提供了自定义的标记库(包括HTML标签、Bean标签、Logic标签、Template标签、Title标签和Nested标签)可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,这有利于分开表现逻辑和程序逻辑,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。2.2.3JAR包Struts运行必须依赖于activation.jar、servlet-api.jar、struts.jar这三个jar包。所以将这3个jar包拷贝到工程目录下的WebContent\WEB-INF\lib目录中去。2.3Tomcat5.5与JDKTomcat5.5下载集成Tomcat是Apache

软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat5支持最新的Servlet2.4和JSP2.0规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。目前最新版本是7。0。 Tomcat官方下载地址:/,国内也有很多镜像网站供下载。2.3.2JDK介绍与配置JDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。SE(J2SE),standardedition,标准版,是我们通常用的一个版本,从JDK5.0开始,改名为JavaSE。EE(J2EE),enterpriseedition,企业版,使用这种JDK开发J2EE应用程序,从JDK5.0开始,改名为JavaEE。ME(J2ME),microedition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK5.0开始,改名为JavaME。JDK官方下载地址:/technetwork/java/javaee/index。htmlJDK配置过程:解压后放置在C:\jdk1。5目录下,然后设置环境变量。在我的电脑—>属性->高级->环境变量->path中增加如下三项:C:\jdk1。5C:\jdk1。5\libC:\jdk1。5\bin3.系统实现系统可行性分析 本系统开的可行性分析主要从如下几个方面:硬件要求:台式机或笔记本,CPU不低于Core™2,内存2G以上,硬盘50G以上,实际运行需要有公网接入;操作系统:XP操作系统;经济可行性:本系统除硬件设备要求和网络环境要求外无需其它经济投入,所采用的所有软件Eclipse、Struct1、Tomcat5。5、JDK5.0以及引用的jar包都均为网络开源版本,无版权争议,无需另外付费;技术可行性:本系统在xp操作系统基础上,借助Eclipse集成开发环境开发,系统框架建立Struct1基础之上,结合开源的分词系统和路由模拟方式进行开始,最终形成本系统;搭建环境:在集成开发工具Eclipse上进行编码,建立动态web工程,服务其采用tomcat5。5,JDK采用JDK5.0,系统框架采用Struct1进行开发;软件实现:阅读JavaEE编程规范和参考书籍之后,掌握基本编码技术,进行代码的编写;技术处理:前端采用JSP作为与用户交互UI设计,所有数据采用txt文本进行交互,软件数据获取与解析,软件数据显示,其他功能;后期测试:在有公网接入情况下,随机输入采集一个公网中实际存在的URL作为输入参数,实现网页内容显示,生成相关的聚集、分词和路由模拟实现;系统整体架构 本系统采用Struct1作为开发架构,前端采用JSP作为用户输入和展现的架构,服务端通过ActionForm获取前端参数,Action对获取的参数进行处理,并将相关数据写入到文件中去,最中间相关结果反馈给用户,系统整体架构如图2-1:

图3-1系统整体架构图 系统主要功能介绍如下:web。xml:本系统基础配置文件,它将Struct1作为servlet引入到本系统中来;<servlet><servlet-name>action</servlet-name> <servlet-class>org。apache。struts。action。ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>ApplicationResources</param-value> </init-param> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config。xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup></servlet>struts-config。xml:Strut的核心,它配置了前段页面后服务端对应关系已经跳转关系;配置文件如下<struts-config> <form-beans> <form-beanname="fenCiForm"type="zxj。FenCiForm"/> <form-beanname="getContextForm"type="zxj。GetContextForm"/> </form-beans> <global-forwards> <forwardname="error"path="/fenci。jsp"/> </global-forwards> <action-mappings> <!-- <actionpath="/counter"type="zxj。CounterAction"name="counterForm"scope="request"validate="false"input=""> <forwardname="success"path="/susses。jsp"/> <forwardname="error1"path="/error1。jsp"/> <forwardname="error2"path="/error2。jsp"/> </action> --> <actionpath="/fenci"type="zxj。FenCiAction"name="fenCiForm"scope="request"validate="false"input="/fenci。jsp"> <forwardname="success"path="/fenCiSusses。jsp"/> <forwardname="error1"path="/fenCiErr1。jsp"/> <forwardname="error2"path="/fenCiErr2。jsp"/> </action> <actionpath="/getContext"type="zxj。GetContextAction"name="getContextForm"scope="request"validate="false"input="/fenci。jsp"> <forwardname="success"path="/fenci。jsp"/> <forwardname="error1"path="/UrlErr。jsp"/> <forwardname="error2"path="/UrlErr。jsp"/> </action> </action-mappings><message-resourcesparameter="ApplicationResources"/></struts-config>类IFIDF.Program负责网页内容聚集计算;类zxj.ReadFilesPro负责聚集内容的分词和权重分析;类zxj.Relateion负责模拟路由算法;文件夹E:\FileSys作为系统所有交互数据中心;E:\FileSys\Cluster:聚集文件生成中心;E:\FileSys\dir分词参考文件和目标文件;E:\FileSys\fenci分词结果文件;E:\FileSys\result分词权重计算结果文件E:\FileSys\RouterList模拟路由目录文件;E:\FileSys\tiaoshujilu路由模拟生成结果文件;系统界面的设计前台用户界面采用单页面跳转形式进行展现,用户在页面中输入公网中实际存在的URL后,点击提交后经由ActionForm传递数据到业务后台。如图图3-1用户交互页面packagezxj;importjavax。servlet。http。HttpServletRequest;importorg。apache。struts。action。*;publicclassGetContextFormextendsActionForm{publicStringtxtUrl;publicStringcontextDtl;publicStringgetTxtUrl(){ returntxtUrl; } publicvoidsetTxtUrl(StringtxtUrl){ this。txtUrl=txtUrl; } publicStringgetContextDtl(){ returncontextDtl; } publicvoidsetContextDtl(StringcontextDtl){ this。contextDtl=contextDtl; } publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){}publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){ActionErrorserrors=newActionErrors();returnerrors;}}系统数据交互本系统的数据全部存储在文本文件中,所以本系统中的数据交互主要是文本流的读写。Java从1。1版本开始就提供了文本处理的相关类,随着版本的不断更替,越来也简单的文本流操作方法出现了,并在其基础上封装出了高效、安全、简便的封装。本系统就采用5。0版本提供的轻量级文本读写封装类,代码如下:(一)读文本代码/**输入参数:文件路径和文件名称*输出参数:获取文件内容*/publicstaticStringreadFiles(Stringfile)throwsFileNotFoundException,IOException{StringBuffersb=newStringBuffer();try{InputStreamReaderis=newInputStreamReader(newFileInputStream(file),"utf-8");//只需一行就可以读入文本文件BufferedReaderbr=newBufferedReader(is);Stringline=br。readLine();while(line!=null){sb。append(line)。append("\r\n");line=br。readLine();}br。close();}catch(Exceptione){}returnsb。toString();}(二)写文件代码/* *输入参数:网页原文存储 *输出参数:返回原文存储路径 */ privateStringsaveFile(Stringsb){ //保存结果 Stringret=null; try{ Dated=newDate(); SimpleDateFormatsdf=newSimpleDateFormat("",Locale。SIMPLIFIED_CHINESE); sdf。applyPattern("yyyy年MM月dd日HH时mm分ss秒"); StringtimeStr=sdf。format(newDate()); ret="E:\\FileSys\\res\\txt"+timeStr+"。txt"; Filefile=newFile(ret); if(file。exists()) { file。delete(); } FileWriterresultFile=newFileWriter(file); PrintWritermyFile=newPrintWriter(resultFile);//写文件 myFile。println(sb。toString()); resultFile。close(); myFile。close(); System。out。println("源文件文件成功生成:"+ret); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e。printStackTrace(); } returnret; }3.5系统数据传递与显示 本系统采用的是Struct1作为系统框架,所以数据传递和显示采用ActionForm作为数据交互传递与显示的媒介。ActionForm既可以作为用户输入端输入数据,也可以作为服务端向浏览器输出的媒介,ActionForm定义与传递代码如下:ActionFormpublicclassFenCiFormextendsActionForm{/** *分词用的表单定义 * */ privatestaticfinallongserialVersionUID=1L; publicStringtxtSource; publicStringresult; publicStringgetTxtSource(){ returntxtSource; } publicvoidsetTxtSource(StringtxtSource)throwsUnsupportedEncodingException{ this。txtSource=txtSource;// } publicStringgetResult(){ returnresult; } publicvoidsetResult(Stringresult){ this。result=result; } publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){ActionErrorserrors=newActionErrors();returnerrors;} publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){}}(二)业务端获取ActionFormpublicActionForwardexecute(ActionMappingmapping,ActionFormactionForm,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{ //从form中获取文章内容 try{ request。setCharacterEncoding("gb2312"); f=(FenCiForm)actionForm; Stringresource=newString(f。getTxtSource()。getBytes("iso-8859-1"),"utf-8");}(三)浏览器获取ActionForm<!--初始化,设置一些属性--><jsp:useBeanid="fenCiForm"class="zxj。FenCiForm"scope="request"/><% StringresourceFile=fenCiForm。getResult();%>系统相关其他功能的实现 系统中需要对交互数据进行过滤,以实现前后台编码一致,过滤器代码如下:(一)过滤器publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ request。setCharacterEncoding(encoding); response。setContentType("text/html;charset="+encoding); chain。doFilter(request,response); } publicvoidinit(FilterConfigfilterConfig)throwsServletException{ this。encoding=filterConfig。getInitParameter("encoding"); }

4.系统算法与实现4.1网络蜘蛛 网络爬虫源自Spider(或Crawler、robotswanderer)等的意译。网络爬虫的定义有广义和狭义之分,狭义的定义为:利用标准的http协议,根据超级链接和Web文档检索的方法遍历万维网信息空间的软件程序。广义的定义为:所有能利用http协议检索Web文档的软件都称之为网络爬虫。网络爬虫是一个功能强大的自动提取网页的程序,它为搜索引擎从万维网下载网页,是搜索引擎的重要组成部分。它可以完全不依赖用户干预实现网络上的自动“爬行”和搜索 Java语言在此非常适合构建一个“蜘蛛”程序,其内建了对HTTP协议的支持,通过它可以传输大部分的网页信息;其还内建了一个HTML解析器,正是这两个原因使Java语言成为本文构建“蜘蛛”程序的首选。4.1.1网络蜘蛛搜索策略 目前使用比较广泛的网络蜘蛛搜索策略三种: (一)地址搜索策略 先赋予爬虫一个起始的IP地址,然后根据IP地址递增的方式搜索本IP地址段后的每一个WWW地址中的文档,它完全不考虑各文档中指向其它Web站点的超级链接地址。优点是搜索全面,能够发现那些没被其它文档引用的新文档的信息源;缺点是不适合大规模搜索。 (二)深度优先搜索策略 在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。优点是能遍历一个Web站点或深层嵌套的文档集合;缺点是因为Web结构相当深,,有可能造成一旦进去,再也出不来的情况发生。 (三)宽度优先搜索策略 在宽度优先搜索中,先搜索完一个Web页面中所有的超级链接,然后再继续搜索下一层,直到底层为止。4.1.2网页提取Boilerpipe简介 Boilerpipe是一个正文提取工具,其算法的基本思想是通过训练获得一个分类器来提取出我们需要的信息(如正文、发布时间等)。Boilerpipe是一个轻量级的通过Http协议提取网页内容工具,对于小型系统来说已经足够,对于需要大批量采集网络信息时需要采用更为重量级的文本采集工具,其配套的硬件设备代价也会更大。 所以本系统采用这样一个轻量级网络蜘蛛实现固定URL单页面信息的爬取,以满足本系统的需求。图4-1Boilerpipe整体架构图图4-2Boilerpipe调用关系图4.1.3代码实现 在使用必须将下载下来的压缩包解压后将boilerpipe-1。2。0。jar以及lib文件下的2个jar包引入到nekohtml-1。9。13。jar、xerces-2。9。1。jar项目的lib中去,否则在系统运行过程中将无发解析网页中的文件,获取网页内容一定要进行编码转换,否则前台页面会显示为乱码。import。URL;importde。l3s。boilerpipe。extractors。ArticleExtractor;publicclassGetContextActionextendsAction{ privateStringreturnStr="success"; privateGetContextFormf=null; /* *输入参数:Http请求,ActionForm *输出参数:ActionForm数据打包 */ publicActionForwardexecute(ActionMappingmapping,ActionFormactionForm,HttpServletRequestrequest,HttpServletResponseresponse) throwsException{ try{ request。setCharacterEncoding("gb2312"); f=(GetContextForm)actionForm; StringurlStr=f。getTxtUrl(); if(urlStr==null||urlStr==""){ returnStr="error1"; }else{ finalURLurl=newURL(urlStr); Stringstr=ArticleExtractor。INSTANCE。getText(url); f。setContextDtl(str); } }catch(Exceptione){ returnStr="error2"; } return(mapping。findForward(returnStr)); } }4.2新闻聚集4.2.1新闻热点话题发掘 新闻内容聚集的概念来源于新闻热点话题的发掘技术。热点话题发现是话题识别与跟踪(TopicDetectionandTracking,简称为TDT)技术在实际领域中的应用。TDT旨在发展一系列基于事件的信息组织技术,自从1996年前瞻性的探索以来,通过连续的大规模评测,TDT已成为国际上自然语言处理尤其是信息检索领域的一个研究热点,大大促进了TDT相关技术的发展。目前主流的话题发现算法都采用文本聚类技术来实现。在早期的网络话题相关研究中,为了简化问题,一般假定所有的话题没有层次之分,而且一个文档只能与一个话题相关,因此研究人员基本上都采用传统的聚类算法。[YYang,T.Pierce,etc,1998]先用增量聚类把新话题中时序相关的文档聚在一起,而后再用Single-Pass聚类来找回时间间隔较大的话题相关文档。随着研究的深入,从2003年开始,层次化话题发现(HierarchicalTopicDetection)作为话题发现与跟踪领域一个全新的研究问题被提了出来,它突破了传统的话题组织忽略话题多粒度现象的不合理之处,采用层次化的结构对话题进行组织。[MargaretConnell,AoFeng,GiridharKumaran,etc,2004]先把文档分成很多小类,再按报道来源、时间和语种将小类合并;[MuManquan,LuoWeihua,ere,2004]先把文档按照时序分组,然后采用自底向上的多层聚类把所有的话题组织成为一个有向无环图结构。4.2.2新闻聚集 新闻聚集目的是为了用简短的几句话找出一条新闻关键语句,并能概括出新闻核心价值。进行新闻内容聚集步骤如下: 首先是要做题词的操作。停词就是在文本出现重复率较高的词汇、标点符号等等词汇,这些词汇和符号对于新闻的聚集没有太大影响作用,所以在做新闻内容聚集时首先将这些停词过滤掉; 其次是对新闻内容大概分类,找出本新闻内容中出现平凡的字、词、短语、短句; 再次对分类后的内容和新闻全文进行计算聚类的向心度,向心度越高的词语越能成为新闻内容的核心字、词、短语和短句; 最后将向心都较高的字、词、短语和短句进行整合形成新闻内容的核心。 通过以上几个步骤就能将一篇新闻内容聚集成几个或几句简单内容。4.2.3代码实现聚集常量定义finalint_coordCount;//数据的数量finaldouble[][]_coordinates;//原始数据finalint_k;//聚类的数量privateWawaCluster[]_clusters;//聚类WawaCluster[]getClusters(){return_clusters;}finalint[]_clusterAssignments;//定义一个变量用于记录和跟踪每个资料点属于哪个群聚类privatefinalint[]_nearestCluster;//定义一个变量用于记录和跟踪每个资料点离聚类最近privatefinaldouble[][]_distanceCache;//定义一个变量,来表示资料点到中心点的距离,privatestaticfinalRandom_rnd=newRandom(1);//用来初始化的随机种子核心代码publicvoidStart(){intiter=0;while(true){System.out.println("Iteration"+(iter++)+"...");System.out.println(_clusters.length);//1、重新计算每个聚类的均值for(inti=0;i<_k;i++){_clusters[i].UpdateMean(_coordinates);}//2、计算每个数据和每个聚类中心的距离for(inti=0;i<_coordCount;i++){for(intj=0;j<_k;j++){doubledist=getDistance(_coordinates[i],_clusters[j].Mean);_distanceCache[i][j]=dist;}}//3、计算每个数据离哪个聚类最近for(inti=0;i<_coordCount;i++){_nearestCluster[i]=nearestCluster(i);}//4、比较每个数据最近的聚类是否就是它所属的聚类//如果全相等表示所有的点已经是最佳距离了,直接返回;intk=0;for(inti=0;i<_coordCount;i++){if(_nearestCluster[i]==_clusterAssignments[i])k++;}if(k==_coordCount)break;//5、否则需要重新调整资料点和群聚类的关系,调整完毕后再重新开始循环;//需要修改每个聚类的成员和表示某个数据属于哪个聚类的变量for(intj=0;j<_k;j++){_clusters[j].CurrentMembership.clear();}for(inti=0;i<_coordCount;i++){_clusters[_nearestCluster[i]].CurrentMembership.add(i);_clusterAssignments[i]=_nearestCluster[i];}}}staticdoublegetDistance(double[]coord,double[]center){//计算某数据离某聚类中心的距离,也可以用余弦夹角来计算某数据离某聚类中心的距离return1-TermVector.ComputeCosineSimilarity(coord,center);}privatevoidInitRandom(){//随机初始化k个聚类for(inti=0;i<_k;i++){inttemp=_rnd.nextInt(_coordCount);_clusterAssignments[temp]=i;//记录第temp个资料属于第i个聚类_clusters[i]=newWawaCluster(temp,_coordinates[temp]);}}4.3中文分词4.3.1中文分词 中文自动分词方面的研究已较为成熟,一些经过长期研究具有一定规模的分词系统结合各种领域的词典,其分词精度可达到95%以上,并得到广泛应用。现有的分词算法可分为三大类:机械性分词方法、统计性分词方法和理解性分词方法。前两类主要是基于词典、词库的匹配和词的频度统计,较易于实现。理解性分词方法的基本思想是在分词的同时进行句法、语义分析并利用句法信息和语义信息来处理歧义现象。更复杂的方法可以考虑不同分词算法之间的结合策略。本文采用中国科学院计算技术研究所自行研制的分词系统ICTCLAS(InstituteofComputingTechnologyChineseLexicalAnalysisSystem)对语料进行分词,该系统具有较好的分词性能和较快的分析速度。4.3.2TF-IDF TF-IDF(termfrequency–inversedocumentfrequency)[23]是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF*IDF,TF词频(TermFrequency),IDF反文档频率(InverseDocumentFrequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处。4.3.3代码实现中文分词核心代码System.out.println("***************分词*****************"); Stringpath="E:\\FileSys\\dir"; StringtargName=path+"\\target.txt"; System.out.println("***************分词*****************"); sb.append("分词").append("\r\n"); Map<String,HashMap<String,Integer>>normal=ReadFiles.NormalTFOfAll(path); for(Stringfilename:normal.keySet()){ if(targName.equals(filename)){ sb.append(filename).append("\r\n"); sb.append(normal.get(filename).toString()).append("\r\n"); quci(normal.get(filename).toString()); } //System.out.println("fileName"+filename); //System.out.println("TF"+normal.get(filename).toString()); } sb.append("tf值").append("\r\n"); Map<String,HashMap<String,Float>>notNarmal=ReadFiles.tfOfAll(path); for(Stringfilename:notNarmal.keySet()){ if(targName.equals(filename)){ sb.append(filename).append("\r\n"); sb.append(notNarmal.get(filename).toString().toString()).append("\r\n"); } } sb.append("idf值").append("\r\n"); Map<String,Float>idf=ReadFiles.idf(path); for(Stringword:idf.keySet()){ //System.out.println("keyword:"+word+"idf:"+idf.get(word)); //sb.append("keyword:"+word+"idf:"+idf.get(word)).append("\r\n"); } sb.append("tfidf值").append("\r\n"); Map<String,HashMap<String,Float>>tfidf=ReadFiles.tfidf(path); for(Stringfilename:tfidf.keySet()){ //System.out.println("fileName"+filename); //System.out.println(tfidf.get(filename)); if(targName.equals(filename)){ sb.append("fileName"+filename).append("\r\n"); sb.append(tfidf.get(filename)).append("\r\n"); } } publicstaticHashMap<String,Float>tf(String[]cutWordResult){HashMap<String,Float>tf=newHashMap<String,Float>();//正规化intwordNum=cutWordResult.length;intwordtf=0;for(inti=0;i<wordNum;i++){wordtf=0;for(intj=0;j<wordNum;j++){if(cutWordResult[i]!=""&&i!=j){if(cutWordResult[i].equals(cutWordResult[j])){cutWordResult[j]="";wordtf++;}}}if(cutWordResult[i]!=""){tf.put(cutWordResult[i],(newFloat(++wordtf))/wordNum);cutWordResult[i]="";}}returntf;}/**输入参数:分词文件数组列表*输出参数:非规化的TF值*/publicstaticHashMap<String,Integer>normalTF(String[]cutWordResult){HashMap<String,Integer>tfNormal=newHashMap<String,Integer>();//没有正规化intwordNum=cutWordResult.length;intwordtf=0;for(inti=0;i<wordNum;i++){wordtf=0;if(cutWordResult[i]!=""){for(intj=0;j<wordNum;j++){if(i!=j){if(cutWordResult[i].equals(cutWordResult[j])){cutWordResult[j]="";wordtf++;}}}tfNormal.put(cutWordResult[i],++wordtf);cutWordResult[i]="";}}returntfNormal;}/**输入参数:分词文件数组列表*输出参数:非规化的TF值*/publicstaticHashMap<String,Integer>normalTF(String[]cutWordResult){HashMap<String,Integer>tfNormal=newHashMap<String,Integer>();//没有正规化intwordNum=cutWordResult.length;intwordtf=0;for(inti=0;i<wordNum;i++){wordtf=0;if(cutWordResult[i]!=""){for(intj=0;j<wordNum;j++){if(i!=j){if(cutWordResult[i].equals(cutWordResult[j])){cutWordResult[j]="";wordtf++;}}}tfNormal.put(cutWordResult[i],++wordtf);cutWordResult[i]="";}}returntfNormal;}/**输入参数:分词文件数组列表*输出参数:所有的TF值*/publicstaticMap<String,HashMap<String,Float>>t

温馨提示

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

评论

0/150

提交评论