本科毕业设计无格式Word下载.docx
《本科毕业设计无格式Word下载.docx》由会员分享,可在线阅读,更多相关《本科毕业设计无格式Word下载.docx(38页珍藏版)》请在冰豆网上搜索。
RubyonRails;
全文检索;
相似推荐算法
Abstract
Asinternetenteredweb2.0times,webdevelopmenthasusheredingreatchanges.TheemergenceofAJAX,rich-client,RSSandothernewconceptshasjustmade"
user-centric"
towintheindustry’sattention.However,behindthesechanges,someadvancedtechniquesbecamecivilianpopular.Thesetechnologieswasonceholdbyafewlargecompanies,whilenowwidelytookadvantagebymanysmallWeb2.0sites--justforbetteruserexperience.
Thisprojectisabouttodoadeepresearchatthosekeytechniques,suchasfull-textsearch,Chinesewordsegmentation,similarityrecommendation,performancetuning,etc,tomeettheneedofaWeb2.0site’sdevelopment.Thewayofresearchistodevelopasitethatrequiresthesetechniques.Inaddition,thehotframeworkRubyonRailswillbeused,toperformagiledevelopmentpractice.
Finally,thisprojectfulfilledtherequirementsthatplannedatthebeginning,withhighperformanceasaplus.Inaddition,thisprojectincludestheresearchanddevelopmentofthekeytechniquesthatquotedabove,sothattheycanbeappliedinrealinternetproducts.Throughthewholedevelopment,IgainedalotofexperiencethataboutAgileandRubyonRails.Asamatteroffact,theAgiledevelopmentmethodcanextremelyacceleratethelaunchingofproducts,astosavetimefortheirsdesigningandpromotion,intherapidchangingInternet.
Keywords:
AgileDevelopment;
Web2.0;
RubyonRails;
Full-textsearch;
Similarityrecommendalgorithm
引言
自从Web2.0的概念在2004年兴起,互联网行业已经涌现出了一大批Web2.0网站。
其中不乏成功者如国外Youtube、Facebook,国内的豆瓣。
Web2.0改变了互联网:
从思路上,“以用户为中心”的提出标志着网站更加重视用户体验,学会站在用户的角度考虑问题;
从技术上,海量数据、富客户端、全文检索等相对复杂的技术开始在中小网站普及。
在Web开发的语言方面,近几年也有了长足发展。
在互联网在国内发展的最初几年,用于web开发的技术主要是微软公司的ASP,Java平台的JSP以及开源的PHP。
而最近几年,又有了不少新的语言和平台普及开来,比如.net平台,python、ruby、erlang等。
另一方面,在Web应用的设计角度,体现出了层次化、抽象化的特征。
相比以前的简单页面、简单逻辑,Web2.0时代的Web应用往往以页面众多、内容丰富、逻辑复杂为特色。
如豆瓣网,拥有百万级别的图书音像资料,还要根据用户收藏的图书为不同用户做出不同推荐。
可想而知,其中的逻辑是非常复杂的。
正因为如此,如今的Web应用在设计的角度开始分层,基本的分层方法如MVC,将控制器、模型和页面展示分开;
也有分为Web层、BIZ层和DAO层的方法,直观地抽象出业务层(BIZ)和数据访问层(DAO),是一种更适合大型Web应用所处分布式环境下的架构设计。
如果说以前的Web开发只是“做网页”,比做软件的工程量小很多的话,如今的Web开发可以被认为是“SoftwareforInternet”,其中涉及到的知识广度,已经大大超过了开发传统软件。
此外,当前在Web开发的方法上,也比以前更加丰富。
以前更多的是单兵作战,网站上需要编程的部分较少,用网页三剑客基本可以完成。
但现在的Web开发讲究分层,讲究团队协作,特别是在大网站如阿里巴巴、XX等,同一个网站下会有众多的产品线,而每一个产品线都由一个或多个团队负责。
具体到一个团队,不同开发人员的工作职责又可分为前端开发、后端开发、测试、运维等,复杂程度已经超过了软件开发。
由此可知,在Web开发的方法论上,近年也有了长足发展,特别是敏捷开发,日益被更多团队采用。
本项目拟采用敏捷开发的方式,以新近流行的RubyOnRails框架为基础,开发一个Web2.0社区系统。
该系统以图书点评为中心,在开发过程中,致力于研究一些Web2.0网站所涉及到的关键技术,比如相似推荐算法、中文分词算法、搜索引擎技术、海量数据下的性能调优等。
所有的研究都会给出可操作的解决方案,使这些技术不会停留在理论上可行的阶段。
项目概述
Web2.0概述
“Web2.0”的概念来自于2004年一个会议,由O'
Reilly公司副总裁的戴尔·
多尔蒂(DaleDougherty)提出。
如今,“Web2.0”一词已经深入人心。
但是,至今关于Web2.0的含义仍存在极大的分歧,一些人将Web2.0贬低为毫无疑义的一个行销炒作口号,而其他一些人则将之理解为一种新的传统理念。
暂且搁置争论,不可否认的是,确实有一批公司,在Web2.0的浪潮中崭露头角。
在国外有YouTube,2006年被Google以16.5亿美金收购;
还有Wikipedia,Flickr,Delicious,Myspace以及后来的Facebook,Twitter。
在国内,典型的Web2.0网站如豆瓣,以及校内等SNS类网站也可归入Web2.0范畴。
Web2.0在商业上的成功,离不开技术上的进步。
但在Web2.0浪潮中涌现出来的新技术,大多是“旧瓶装新酒”。
Web2.0涉及到的新技术主要包括:
AJAX:
AJAX全称为“AsynchronousJavaScriptandXML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
简单来说,AJAX可以实现不全部刷新页面而更新内容,可以让B/S模式的应用有C/S模式的使用体验,在“以用户为中心”的Web2.0浪潮中,AJAX极大地提升了用户的使用体验。
最早应用AJAX的Web项目是Google的Gmail和GoogleMap。
Javascript:
Javascript并不是在Web2.0时代才出现的技术,但以前开发者对Javascript的使用仅限于作为静态页面的点缀。
直到AJAX出现以后,Javascript才被“正名”。
如今,Javascript已经被作为一种常用的编程语言,许多大公司也专门设置了前端开发工程师岗位,Javascript越来越被重视。
在开源社区,也涌现出大量Javascript库,如Prototype,Script.aculo.us,JQuery等。
在本项目中,我将使用Prototype和Script.aculo.us进行AJAX操作并产生一些可视化效果(VisualEffects)。
RSS:
RSS全称为“ReallySimpleSyndication”是一种描述和同步网站内容的格式,是目前使用最广泛的资源共享应用。
可以被称为资源共享模式的延伸。
如今,将内容输出成为RSS已成为一种惯例,通过RSS,也可以将互联网上的内容更有语义化地组织起来。
Web2.0中也产生了一些基于RSS的创业公司,如Feedsky,抓虾,鲜果等。
流媒体技术:
流媒体技术并非Web2.0中才出现,而是美国Real公司最早提出的。
这种技术可以让用户在观看视频媒体时“边下载边观看”,对音频媒体也是如此。
但Real公司并没能让它的技术普及,真正从流媒体技术中获益的是Youtube,而它依赖是基于FLV的流媒体技术。
Web应用原理简述
Web应用与桌面应用有显著区别。
在涉及到网络交互的应用中,Web应用被称为B/S模式,桌面应用被称为C/S模式。
实际上B/S模式可认为是一种特殊的C/S,这里的C(Client)就是浏览器。
Web应用基于HTTP协议,需要一个Web服务器来提供服务;
如果Web应用是动态的,还需要一层应用服务器以执行动态代码。
总结起来,Web应用的原理由浅入深,可以做如下划分:
图2-1服务静态内容
对静态内容请求的处理如图2-1所示,直接由WebServer返回。
图2-2服务动态内容
有动态程序的情况如图2-2所示。
WebServer调用相应的解释器或VM,运行指定的文件,获得运行结果。
然后WebServer将运行结果所谓响应返回。
对于一些平台,如J2EE、Ruby等,将会有一层独立的应用服务器进行支撑。
图2-3有数据库的情况
采用了数据库以后如图2-3所示。
动态的程序在执行过程中到数据库查询结果,并根据一定规则生成文本内容返回给WebServer,之后WebServer发送响应内容。
图2-4多数据库的情况
多个数据库作了复制或是集群或是负载均衡的情况如图2-4所示。
因为在查询压力较大时,数据库可能成为应用瓶颈,所以可以采用数据库集群。
一方面可以使读写分离(主数据库只写,从数据库只读),另一方面,可以将读的压力均衡至多台服务器。
这种方式在被很多大型Web应用所采用。
图2-5多个Web服务器的情况
多个web服务器作了负载均衡的情况如图2-5所示。
原理和数据库层面进行的负载均衡类似,但在技术细节上有所区别,但都是为了分散单点所承受的压力。
对Web服务器和数据库服务器都采用负载均衡的情况不再赘述,这种情况下,要考虑的因素更为复杂。
在一些大规模应用中,从最前端负责请求转发的Web服务器到最后端提供数据持久化的数据库服务器,经过的可能不只一层应用。
这就涉及到Web开发中的分层的思路[1]。
MVC概述
MVC是Web开发中一种常见的分层开发的思路。
其中,M,V,C分别指Model(对象),View(视图)和Controller(控制器)。
MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。
它把软件系统分为三个基本部分:
模型(Model),视图(View)和控制器(Controller)。
MVC由TrygveReenskaug提出,是XeroxPARC在20世纪80年代为程序语言Smalltalk-80发明的一种软件设计模式。
MVC的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
除此之外此模式通过对复杂度的简化使程序结构更加直观。
软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
专业人员可以通过自身的专长分组:
控制器-程序员编写程序应有的功能(实现算法等等)
视图-界面设计人员进行图形界面设计
模型-数据库专家进行数据管理和数据库设计
图2-6MVC图示
近年,在Web开发中使用MVC成为趋势。
在最初的Web开发中中,像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。
经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心地计划和不断的尝试。
MVC从根本上强制性地将它们分开。
尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。
首先,多个视图能共享一个模型。
如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱,这就要求Web网站同事能提供Internet界面和WAP界面。
在MVC设计模式中,模型响应用户请求并返回响应数据,视图负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。
其次,模型是自包含的,与控制器和视图保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。
如果把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需改变模型即可。
一旦正确地实现了模型,不管数据来自数据库还是LDAP服务器,视图都会正确地显示它们。
由于MVC的三个模块相互独立,改变其中一个不会影响其他两个,所以一句这种设计思想能构造良好的松耦合的构件。
此外,控制器提高了应用程序的灵活性和可配置性。
控制器可以用来连接不同的模型和视图去完成用户的需求,也可以构造应用程序提供强有力的手段。
给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型机型处理,然后选择适当的的视图将处理结果显示给用户。
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。
使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。
开发一个MVC架构的工程,将不得不花费相当可观的时间去考虑如何将MVC运用到应用程序中,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。
每个构件在使用之前都需要经过彻底的测试。
另外由于MVC将一个应用程序分成了三个部件,所以这意味着同一个工程将包含比以前更多的文件。
因此MVC并不适合小型甚至中等规模的应用程序,这样会带来额外的工作量,增加应用的复杂性。
但对于开发存在大量用户界面,并且逻辑复杂的大型应用程序,MVC将会使软件在健壮性、代码重用和结构方面上一个新的台阶。
尽管在最初构建MVC框架时会花费一定的工作量,但从长远的角度来看,它会大大提高后期软件开发的效率。
本项目将采用RubyonRails框架,以及MVC的开发思想。
RubyonRails是通过Ruby语言所开发出来的WebFramework,也是采用Model-View-Controller架构。
RubyonRails简介
RubyonRails,也称RoR或简称Rails,是一个使用Ruby语言实现的全栈式(full-stack)开源网络应用框架,它是严格按照MVC结构开发的。
Rails努力使自身保持简单,来使实际的应用开发时的代码更少,配置更少[1]。
Rails的设计原则包括“不要重复自己”(Don'
tRepeatYourself)和“约定胜于配置”(ConventionOverConfiguration)。
Rails框架自2003年问世以来,已经发展到第2.2版本,也出现了一大批基于ROR构建的网站。
国外的Twitter、国内的Javaeye,都是用Rails框架搭建的;
豆瓣的第一版也使用了Rails,这也符合其创始人阿北提出的“快速上线”的方针。
RubyonRails首先是基于Ruby语言,Ruby语言虽然冷门,却有许多令人兴奋的特性。
比如在Ruby中,一切皆为对象;
而号称纯OO的Java,其中的基本类型(如Integer、Long)就不是以对象的形式存在的。
Ruby特有的“block”可以便捷地处理循环、回调,使Ruby可以用更少的代码完成更多地任务,而且程序保持简洁易懂。
比如下面的这行代码:
Ruby语言简短的代码具有强大的表现能力。
根据统计,在真实的Ruby项目中,平均每个方法(函数)只有5行代码。
Ruby的项目比起同样规模的Java项目,代码量只相当于Java项目的1/5。
同时,Ruby的代码风格比较自由。
比如函数调用可以不加括号,行尾可以不加分号。
这使得Ruby可以在经过包装之后,成为一种DSL(领域特定语言),这显著拓展了Ruby的适用范围。
RubyonRails框架问世以后,以“约定大于配置”的思想,迅速征服了世界范围内的Web开发者,并给实际上占统治地位的J2EE平台带来了极大冲击。
Rails框架的魅力在于把一切都按照需要的方式约定好,无需配置,甚至无需撰写代码就可以让应用成功跑起来。
如今,RubyonRails已经发布了2.3版本。
Rails框架将和另一个名为Merb的框架合并,并发布在3.0版本中。
围绕着RubyonRails产生了一系列生产环境的部署方案,虽然还不如J2EE平台成熟,但选择已经很多。
本项目将采用Rails2.1.0版本进行开发,部署环境选择UbuntuLinuxServer8.10版本。
敏捷开发简介
敏捷开发是近年流行起来的一种开发模式。
敏捷开发依靠变化来获取活力。
团队几乎不进行预先设计,因此,不需要一个成熟的初始设计。
他们更愿意保持设计尽可能的干净、简单,这保持了设计的灵活性、易于理解性。
团队利用这种灵活性,持续地改进设计,以便于每次迭代结束生成的系统都具有最适合于那次迭代中需求的设计[2]。
敏捷开发所遵循的原则包括:
个体和交互胜过过程和工具
可以工作的软件胜过面面俱到的文档
客户合作胜过合同谈判
响应变化胜过遵循计划
这些规则也可以归纳为:
个体交互、快速原型、客户现场、拥抱变化。
在互联网行业中,互联网产品的特点往往是:
需要快速完成上线;
需求很难在一开始完全确定;
业务规则相对简单。
这些特点使敏捷开发模式非常适用于互联网软件的开发。
本项目将在RubyonRails框架的基础上,通过搭建一个Web2.0社区系统,进行一次敏捷开发实践。
全文检索简介
全文检索的一个关键技术是全文索引,这是一种区别于数据库索引的倒排索引(invertedindex)[3]。
在小规模数据量时,对于文本的检索可以使用数据库的like语法进行。
但由于数据库索引不是为全文索引设计的,因此,使用like"
%keyword%"
时,数据库索引是不起作用的,搜索过程又变成类似于一页页翻书的遍历过程。
所以对于含有模糊查询的数据库服务来说,like对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:
like"
%keyword1%"
andlike"
%keyword2%"
...其效率之低下也可想而知。
在数据量规模很大的情况下(比如百万级别的数据),根本无法使用like进行查询。
建立一个高效检索系统的关键是建立一个反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词到文章的映射关系,利用这样的映射关系索引:
[关键词=>
出现关键词的文章编号,出现次数(甚至包括位置:
起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。
从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。
当前,对全文检索的研究主要由研究语言模型的数学家进行,并且取得了显著成果。
在排序方面,基于tf/idf原理的打分算法成为标准;
在软件领域,有Lucene、Sphinx、Xpian等开源项目用来提供全文检索服务。
另一方面,全文检索在中文(以及日文和韩文)领域遇到了挑战。
因为中文的文本没有天然的空格,所以需要开发单独的中文分词器来支持中文分词。
支持中文的全文检索技术,可以认为是Web开发中关键技术之一。
本项目将研究在海量数据下进行中文全文检索,并将所有功能完整实现。
中文分词技术简介
由于中文文本没有天然的空格,所以对中文分词需要采用单独的分词算法进行。
目前,比较常见的中文分词算法包括单字切词、二分法以及基于词库匹配的分词算法。
其中,单字切词和二分法都不算是真正的分词算法,效果也不理想。
本项目中将研究基于词库匹配的分词算法。
基于词库匹配的分词算法,需要解决的是二义性问题。
九十年代以前,海内外不少学者试图用一些文法规则来解决分词的二义性问题,都不是很成功。
90年前后,清华大学的郭进博士用统计语言模型成功解决分词二义性问题,将汉语分词的错误率降低了一个数量级[4-5]。
利用统计语言模型分词的方法,可以用几个数学公式简单概括如下:
假定一个句子S可以有几种分词方法,为了简单起见假定有以下三种:
A1,A2,A3,...,Ak,
B1,B2,B3,...,Bm
C1,C2,C3,...,Cn
其中,A1,A2,B1,B2,C1,C2等等都是汉语的词。
那么最好的一种分词方法应该保证分完词后这个句子出现的概率最大。
也就是说如果A1,A2,...,Ak是最好的分法,那么(P表示概率):
P(A1,A2,A3,...,Ak)>
P(B1,B2,B3,...,Bm),并且
P(C1,C2,C3,...,Cn)
因此,只要利用合适的统计语言模型计算出每种分词后句子出现的概率,并找出其中概率最大的,就能够找到最好的分词方法。
其中,统计语言模型可以用TF/IDF算法计算得出[6]。
在一系列研究的基础上,Chih-HaoTsai提出了一种MMSeg算法[7],这种算法可分为simple和complex两种算法。
其中,simple算法就是最简单的正向最大匹配算法。
为了解决simple算法的不足,MMSEG又提供了另一种选择:
complex算法。
该算法使用了ChenK.J.和LiuS.H.于1992年在WordidentificationforMandarin