在很多情况下,已有的数据就足以为自己的应用构建出有价值的智能。但在某些情况下,在应用中构建有价值的智能组件可能需要访问外部的信息。图1.6是mashup网站HousingMaps(http://www.housingmaps.com)的截图。结合craigslist(http:// www.craigslist.com)的房屋数据和Google的地图服务(http://code.google.com/apis/ maps/index.html),用户可以在这个网站中查看任何地理区域内待售或待租的房屋。
类似的,新闻网站也可以把新闻及事发地结合在一起,能从地图中获取位置信息,这对任何应用而言都是一种进步。但这并不意味着这是一个智能应用,除非能对这些从地图中获取的信息做一些智能的处理。
地图是一个很好的获取外部信息的例子,但在网络上还有很多其他的信息。让我们看看如何利用这些技术。
爬虫(crawler)也被称为蜘蛛(spider),是用于从互联网上获取公开内容的程序。爬虫通常会访问一份URL列表,然后跟踪其中的每个链接。这个过程会不断地重复,重复次数被称为爬行深度(depth of crawling)。当爬虫访问完一个页面后,会将其内容存放到本地以做进一步的处理。这样可以收集大量的数据,但很快就会遇到存储和版权方面的问题。因此,在采集数据的时候一定要谨慎。在第2章中,我们会展示一个爬虫的实现。在附录中还有一个网络采集的整体介绍,其中总结了我们自己实现的爬虫和一些开源实现。
信息抓取(screen scraping)指的是从HTML网页中获取信息。这看上去很简单,但其实很烦琐。举个例子,要构建一个专用于外出就餐的搜索引擎(例如http://www. foodiebytes.com),第一项工作就是要从各个餐厅的网页中获取菜单。信息抓取本身就能从本书介绍的技术中获益。在餐厅搜索引擎这个例子里,需要根据有用餐经验的食客们的评价对餐厅的优劣做出评估。有时候可以获得数值化的评分,但更多的情况是食客们的评论都是用自然语言写就的文章。逐篇地阅读这些评论,然后据此对餐厅进行排名显然是一个很糟糕的解决方案。在信息抓取的过程中应用智能技术可以实现评论的自动分类,并据此给餐厅打分,Boorah(http://www.boorah.com)就是一个例子。
网站聚合(website syndication)是另一种获取外部数据的方法,这种方法无须使用爬虫反复地访问网站。通常,相对于常见的网页,结构化的聚合内容对机器更友好。常见的源格式有三种:RSS 1.0、RSS 2.0和Atom。
顾名思义,RDF站点摘要(RDF Site Summary,RSS)1.0源自资源描述框架[1](Resource Description Framework,RDF),主要目的是让机器和人都可以理解网络上的信息。但是,人类可以推测内容的语义(单词或短语在特定语境中的含义),而机器则很难做到这一点。引入RDF的目的就是要对网络上的内容做出语义化的解释,从而可以根据具体的需求,从中解析出有用的数据。RSS 1.0的规范可在http://web. resource.org/rss/1.0/站点找到。
简易资讯聚合(Really Simple Syndication,RSS 2.0)是基于Netscape的富站点摘要(Rich Site Summary)0.91的,至少也是重载了后者的首字母缩写RSS,它的目的是简化基于RDF的格式。它采用了一种基于XML格式的聚合专用语言,但没有XML命名空间和RDF引用。现在,几乎所有的主流网站都提供了RSS 2.0,而且对个人用户和非盈利机构的非商业性使用都是免费的。Yahoo!的RSS源站点(http://developer.yahoo.com/rss)上有很多相关的介绍,你可以在http://cyber.law. harvard.edu/rss上找到RSS 2.0的规范和其他相关信息。
最后要介绍的是基于Atom的聚合。RSS 2.0中存在的一些缺陷使得人们开始开发互联网工程任务组(Internet Engineering Task Force,IETF)的RFC 4287(http://tools.ietf.org/html/rfc4287)中所描述的标准。Atom并不是基于RDF的,它兼具RSS 1.0的灵活性和RSS 2.0的简洁。从本质上说,它是实现现有标准的功能和尽可能满足向后兼容性的妥协产物。然而,Atom已经像RSS 2.0一样广受欢迎。大部分网络聚合器(例如Yahoo!和Google)都同时提供这两种格式的源。在IBM Developer Works上可以找到更多有关Atom聚合格式的信息:http://www.ibm.com/ developerworks/xml/standards/x-atomspec.html。
REST(Representational State Transfer)是Roy T. Fielding[2]在其博士论文中提出的。这是一种为分布式、超链接的媒介构建应用的软件架构风格。REST是一种无状态的C/S架构,它将每个服务都映射成一个URL。如果非功能性需求不是很复杂,而且不需要跟服务提供商签订正式的协议,REST就是一个便捷地访问互联网上各种服务的不错选择。关于这种重要技术的更多信息,可以参考Leonard Richardson和Sam Ruby撰写的RESTful Web Services一书。
很多网站都提供了RESTful服务,你可以在自己的应用中使用这些服务。Digg提供了能接受REST请求的API(http://apidoc.digg.com/),并且提供XML、JSON、JavaScript和序列化PHP等多种不同类型的反馈。通过这个API,可以获取符合各种要求的新闻、用户、好友或用户的粉丝等。
Facebook API也是类REST风格的接口。所以,无论是什么编程语言,都可以与这个激动人心的平台进行交流。你要做的只是把HTTP的GET或POST请求发送给Facebook API REST服务器。Facebook API有很好的文档,本书稍后也会用到这些API。详细信息请参考http://wiki.developers.facebook.com/index.php/API。
Web服务是用于应用之间相互交流的API,它有大量的Web服务框架,其中很大一部分是开源的。Apache Axis(http://ws.apache.org/axis/)是一个简单访问对象协议(Simple Access Object Protocol,SOAP)的开源实现,该协议“可以用于在无中心分布式环境中的节点间交换结构化、类型化的信息。”[3]Apache Axis是一个很流行的框架,在第2版中做了全新的设计,Apache Axis2支持SOAP 1.1和SOAP 1.2,以及使用广泛的REST风格的Web服务,还有大量的其他功能。
另一个值得一提的Apache项目是Apache CXF(http://incubator.apache.org/cxf/),这是IONA的Celtix和Codehaus XFire结合的产物。Apache CXF支持的标准有:JAX-WS 2.0、JAX-WSA、JSR-181、SAAJ、SOAP 1.1和1.2、WS-I Basic Profile、WS-Security、WS-Addressing、WS-RM、WS-Policy、WSDL 1.1和 2.0。它还支持多种传输机制、绑定和格式。如果考虑使用Web服务,就应该看看这个项目。
除了这些数量众多的Web服务框架,还有更多的Web服务提供商,几乎每个公司都在使用Web服务整合各种各样的应用,这些应用的功能各不相同,所使用的技术也千差万别。这种情况有可能是公司合并的结果,也有可能是因为大型公司内部的开发工作协调不到位。纵向地看,几乎所有的大型金融投资机构都在使用Web服务来实现无缝整合。Xignite(http://preview.xignite.com/Default.aspx)就提供了金融方面的各种Web服务,SAP、甲骨文、微软等软件巨头也为Web服务提供支持。总之,基于Web服务的整合无处不在,而且作为主要的整合技术,它在智能应用的设计中也是重要的基础构件。
至此,你一定已经对如何改进自己的应用有了一些想法,或者已经对下一次激动人心的创业有了新的创意。我们已经确保获得了所有必要的数据,至少我们能访问到这些数据。现在来看看这些我们将要添加到应用中的智能,以及它们跟其他已熟悉的概念之间的关系。
本文节选自《智能WEB算法》一书。
图书详细信息:http://bvbroadview.blog.51cto.com/3227029/643291