才子佳人博客

我的故事我讲述

搜索引擎相关技术简介
 
来源:xjh  编辑:xjh  2010-10-14

所谓“搜索引擎”,就是一个网络应用软件系统,或者说是一个WEB检索工具。从网络用户的角度看,它根据用户提交的类自然语言查询词或者短语,返回一系列很可能与该查询相关的网页信息,供用户进一步判断和选取。

搜索引擎大致上被分成三个大的功能模块,或者三个子系统:即网页搜集,预处理和查询服务。

一、网页搜集

搜索引擎这样一个软件系统应该是何种工作方式?快速响应网络检索、提供大规模引擎服务的基础应该是一批预先搜集好的网页集合,这个软件系统操作的数据不仅包括内容不可预测的用户查询,还要包括在数量上动态变化的海量网页,并且这些网页不会主动送到系统来,而是需要由系统主动去抓取。

首先,我们考虑抓取的时机:从网上下载一篇网页大约需要1秒钟左右,因此如果在用户查询的时候即时去网上抓来成千上万的网页,一个个分析处理,和用户的查询匹配,不可能满足搜索引擎的响应时间要求。不仅如此,这样做的系统效益也不高(会重复抓取太多的网页);面对大量的用户查询,不可能想象每来一个查询,系统就到网上“搜索”一次。因此我们看到,大规模引擎服务的基础应该是一批预先搜集好的网页(直接或者间接1)。这一批网页如何维护?可以有两种基本的考虑。

定期搜集,每次搜集替换上一次的内容,我们称之为“批量搜集”。由于每次都是重新来一次,对于大规模搜索引擎来说,每次搜集的时间通常会花几周。而由于这样做开销较大,通常两次搜集的间隔时间也不会很短(例如早期天网的版本大约每3 个月来一次,Google 在一段时间曾是每隔28天来一次)。这样做的好处是系统实现比较简单,主要缺点是“时新性”(freshness )不高,还有重复搜集所带来的额外带宽的消耗。

增量搜集,开始时搜集一批,往后只是(1)搜集新出现的网页,(2)搜集那些在上次搜集后有过改变的网页,(3)发现自从上次搜集后已经不再存在了的网页,并从库中删除。由于除新闻网站外,许多网页的内容变化并不是很经常的(有研究指出50% 网页的平均生命周期大约为50 天,这样做每次搜集的网页量不会很大(例如我们在2003 年初估计中国每天有30-50 万变化了的网页),于是可以经常启动搜集过程(例如每天)。30 万网页,一台PC 机,在一般的网络条件下,半天也就搜集完了。这样的系统表现出来的信息时新性就会比较高,主要缺点是系统实现比较复杂;这种复杂还不仅在于搜集过程,而是还在于下面要谈到的建索引的过程。

上面讲的是系统网页数据库维护的基本策略。在这两种极端的情况之间也可能有一些折中的方案,J. Cho 博士在这方面做过深入的研究[Choand Garcia-Molina,2000],[Cho,2002], 根据一种网页变化模型和系统所含内容时新性的定义,提出了相应优化的网页搜集策略。其中一个有趣的结论是:在系统搜集能力一定的情况下,若有两类网页(例如“商业”和“教育”) ,它们的更新周期差别很大(例如“商业”类网页平均更新周期是“天”,而“教育”类网页平均更新周期是“月”) ,则系统应该将注意力放在更新慢的网页上[Choand Garcia-Molina,2000] ,以使系统整体的时新性达到比较高的取值。

在具体搜集过程中,如何抓取一篇篇的网页,也可以有不同的考虑。最常见的一种是所谓“爬取” :将Web 上的网页集合看成是一个有向图,搜集过程从给定起始URL 集合S (或者说“种子”)开始,沿着网页中的链接,按照先深、先宽、或者某种别的策略遍历,不停的从S 中移除URL ,下载相应的网页,解析出网页中的超链接URL ,看是否已经被访问过,将未访问过的那些URL 加入集合S。整个过程可以形象地想象为一个蜘蛛(spider)在蜘蛛网(Web) 上爬行(crawl)。后面我们会看到,真正的系统其实是多个“蜘蛛”同时在爬。

前面提过,任何搜索引擎是不可能将Web 上的网页搜集完全的,通常都是在其他条件的限制下决定搜集过程的结束(例如磁盘满,或者搜集时间已经太长了)。因此就要尽量使得搜索到比较重要的网页,这对于那些并不追求很大的数量覆盖率的搜索引擎特别重要。研究表明,按照先宽搜索方式得到的网页集合要比先深搜索得到的集合重要(这里当然有一个重要性的指标问题)。这种方式的一个困难是要从每一篇网页中提取出所含的URL 。

另外一种可能的方式是在第一次全面网页搜集后,系统维护相应的URL 集合S,往后的搜集直接基于这个集合。每搜到一个网页,如果它发生变化并含有新的URL ,则将它们对应的网页也抓回来,并将这些新URL 也放到集合S 中;如果S 中某个url 对应的网页不存在了,则将它从S 中删除。

这种方式也可以看成是一种极端的先宽搜索,即第一层是一个很大的集合,往下最多只延伸一层。还有一种方法是让网站拥有者主动向搜索引擎提交它们的网址(为了宣传自己,通常会有这种积极性),系统在一定时间内(2天到数月不等)定向向那些网站派出“蜘蛛”程序,扫描该网站的所有网页并将有关信息存入数据库中。大型商业搜索引擎一般都提供这种功能。

二、预处理

得到海量的原始网页集合,距离面向网络用户的检索服务之间还有相当的距离。宏观地看,服务子系统是一个程序。采用Wirth 关于“程序= 算法+数据结构”的观点来考察个程序,一个合适的数据结构是查询子系统工作的核心和关键。这里只是指出:现行最有效的数据结构是“倒排文件” (inverted file) ;倒排文件是用文档中所含关键词作为索引,文档作为索引目标的一种结构(类似于普通书籍中,索引是关键词,书的页面是索引目标)。

下面讨论从网页集合形成这样的倒排文件过程中的几个主要问题,即我们所说的“预处理”。主要包括四个方面,关键词的提取,“镜像网页”(网页的内容完全相同,未加任何修改)或“转载网页” (near-replicas,主题内容基本相同但可能有一些额外的编辑信息等,转载网页也称为“近似镜像网页”)的消除,链接分析和网页重要程度的计算。

1. 关键词的提取

随便取一篇网页的源文件(例如通过浏览器的“查看源文件”功能),我们可以看到其中情况纷乱繁杂。除了我们从浏览器中能够正常看到的文字内容外,还有大量的HTML 标记。另外,由于HTML 文档产生来源的多样性,许多网页在内容上比较随意,不仅文字不讲究规范、完整,而且还可能包含许多和主要内容无关的信息(例如广告,导航条,版权说明等)。这些情况既给有效的信息查询带来了挑战,也带来了一些新的机遇,这里我们只是指出,

为了支持后面的查询服务,需要从网页源文件中提取出能够代表它的内容的一些特征。从人们现在的认识和实践来看,所含的关键词即为这种特征最好的代表。于是,作为预处理阶段的一个基本任务,就是要提取出网页源文件的内容部分所含的关键词。对于中文来说,就是要根据一个词典Σ,用一个所谓“切词软件”,从网页文字中切出Σ所含的词语来。在那之后,一篇网页主要就由一组词来近似代表了,p= {t1, t2, …, tn}。一般来讲,我们可能得到很多词,同一个词可能在一篇网页中多次出现。从效果(effectiveness)和效率(efficiency)考虑,不应该让所有的词都出现在网页的表示中,要去掉诸如“的” , “在”等没有内容指示意义的词,称为“停用词”(stop word)。这样,对一篇网页来说,有效的词语数量大约在200个左右。

2. 重复或转载网页的消除

与生俱来的数字化和网络化给网页的复制以及转载和修改再发表带来了便利,因此我们看到Web 上的信息存在大量的重复现象。这种现象对于广大的网民来说是有正面意义的,因为有了更多的信息访问机会。但对于搜索引擎来说,则主要是负面的;它不仅在搜集网页时要消耗机器时间和网络带宽资源,而且如果在查询结果中出现,无意义地消耗了计算机显示屏资源,也会引来用户的抱怨,“这么多重复的,给我一个就够了”。因此,消除内容重复或主题内容重复的网页是预处理阶段的一个重要任务。

3. 链接分析

前面提到,大量的HTML 标记既给网页的预处理造成了一些麻烦,也带来了一些新的机遇。从信息检索的角度讲,如果系统面对的仅仅是内容的文字,我们能依据的就是“共有词汇假设”(shared bag of words) ,即内容所包含的关键词集合,最多加上词频(term frequency 或tf、TF)和词在文档集合中出现的文档频率(documentfrequency 或df、DF)之类的统计量。而TF 和DF 这样的频率信息能在一定程度上指示词语在一篇文档中的相对重要性或者和某些内容的相关性,这是有意义的。有了HTML 标记后,情况还可能进一步改善,例如在同一篇文档中,<H1>和</H1>之间的信息很可能就比在<H4>和</H4>之间的信息更重要。特别地,HTML 文档中所含的指向其他文档的链接信息是人们近几年来特别关注的对象,认为它们不仅给出了网页之间的关系,而且还对判断网页的内容有很重要的作用。例如“北大学报”这几个字在北京大学学报社会科学版的主页上是没有的,因此一个仅靠内容文字分析的搜索引擎就不可能返回该主页作为结果。但是北京大学主页上是用“北大学报(社)”作为链接信息指向了北京大学学报社会科学版的主页。因此在很好利用链接信息的搜索引擎中应该能返回北京大学学报社会科学版的主页。

4. 网页重要程度的计算

搜索引擎返回给用户的,是一个和用户查询相关的结果列表。列表中条目的顺序是很重要的一个问题。由于面对各种各样的用户,加之查询的自然语言风格,对同样的“关键词”返回相同的列表肯定是不能使所有提交“关键词”的用户都满意的(或者都达到最高的满意度)。因此搜索引擎实际上追求的是一种统计意义上的满意。人们认为Google 目前比天网好,是因为在多数情况下前者返回的内容要更符合用户的需要,而不是所有情况下都如此。

如何对查询结果进行排序有很多因素需要考虑,这里只是概要解释在预处理阶段可能形成的所谓“重要性”因素。顾名思义,既然是在预处理阶段形成的,就是和用户查询无关的。如何讲一篇网页比另外一篇网页重要?人们参照科技文献重要性的评估方式,核心想法就是“被引用多的就是重要的”。“引用”这个概念恰好可以通过HTML 超链在网页之间体现得非常好,作为Google 创立核心技术的PageRank 就是这种思路的成功体现[Page,et al.,1998]。除此以外,人们还注意到网页和文献的不同特点,即一些网页主要是大量对外的链接,其本身基本没有一个明确的主题内容,而另外有些网页则被大量的其他网页链接。从某种意义上讲,这形成了一种对偶的关系,这种关系使得人们可以在网页上建立另外一种重要性指标[Kleinberg,1998]。这些指标有的可以在预处理阶段计算,有的则要在查询阶段计算,但都是作为在查询服务阶段最终形成结果排序的部分参数。

三、查询服务

如上述,从一个原始网页集合S 开始,预处理过程得到的是对S 的一个子集的元素的某种内部表示,这种表示构成了查询服务的直接基础。对每个元素来说,这种表示至少包含如下几个方面:

. 原始网页文档

. URL 和标题

. 所含的重要关键词的集合(以及它们在文档中出现的位置信息)

. 其他一些指标(例如重要程度,分类代码等)

而系统关键词总体的集合和文档的编号一起构成了一个倒排文件结构,使得一旦得到一个关键词输入,系统能迅速给出相关文档编号的集合输出。然而,如同我们在前面提到的,用户通过搜索引擎看到的不是一个“集合”,而是一个“列表”。如何从集合生成一个列表,是服务子系统的主要工作。从搜索引擎系统功能划分的角度,有时候将倒排文件的生成也作为服务子系统的一部分功能,但我们这里将它划分到预处理阶段中觉得更方便些。换句话讲,服务子系统是在服务进行的过程中涉及的相关软件程序,而为这些软件程序事先准备数据的程序都算在预处理子系统中。下面来看对服务子系统的要求和其工作原理,主要有三个方面。

1. 查询方式和匹配

查询方式指的是系统允许用户提交查询的形式。考虑到各种用户的不同背景和不同的信息需求,不可能有一种普适的方式。一般认为,对于普通网络用户来说,最自然的方式就是“要什么就输入什么”。但这是一种相当模糊的说法。例如用户输入“北京大学”,可能是他想了解北京大学目前有些什么信息向外发布,想看看今年的招生政策(于是希望看的是北大网站上的内容), 也可能是他想了解外界目前对北京大学有些什么评价(于是希望看到的是其他权威网站上关于北大的消息)。这是两种相当不同的需求。

在其他一些情况下,用户可能关心的是间接信息,例如“喜马拉雅山的高度” ,8848 米应该是他需要的,但不可能包含在这短语中。而用户输入“惊起一滩鸥鹭”则很可能是想知道该词的作者是谁,或者希望能提醒前面几句是什么。尽管如此,用一个词或者短语来直接表达信息需求,希望网页中含有该词或者该短语中的词,依然是主流的搜索引擎查询模式。这不仅是因为它的确代表了大多数的情况,还因为它比较容易实现。

分词技术:一般来讲,系统面对的是查询短语。就英文来说,它是一个词的序列;就中文来说,它是包含若干个词的一段文字。一般地,我们用q0表示用户提交的原始查询,例如,q0=“网络与分布式系统实验室”。它首先需要被“切词”(segment )或称“分词”,即把它分成一个词的序列。如上例,则为“网络与分布式系统实验室”(注意,不同的分词软件可能得出不同的结果,这里用的是北大计算语言所的在线分词软件)。然后需要删除那些没有查询意义或者几乎在每篇文档中都会出现的词(例如“的” ) ,在本例中即为“与”。最后形成一个用于参加匹配的查询词表,q = {t1, t2, …, tm},在本例中就是q= {网络,分布式,系统,实验室}。

匹配技术:前面讲过,倒排文件就是用词来作为索引的一个数据结构,显然,q 中的词必须是包含在倒排文件词表中才有意义。有了这样的q, 它的每一个元素都对应倒排文件中的一个倒排表(文档编号的集合),记作L(ti), 它们的交集即为对应查询的结果文档集合,从而实现了查询和文档的匹配。上述过程的基本假设是:用户是希望网页包含所输入查询文字的。

2. 结果排序

上面,我们了解了得到和用户查询相关的文档集合的过程。这个集合的元素需要以一定的形式通过计算机显示屏呈现给用户。就目前的技术情况看,列表是最常见的形式(但人们也在探求新的形式,如Vivisimo 引擎将结果页面以类别的形式呈现)。给定一个查询结果集合,R={r1, r2,…, rn},所谓列表,就是按照某种评价方式,确定出R 中元素的一个顺序,让这些元素以这种顺序呈现出来。笼统地讲,ri 和q 的相关性是形成这种顺序的基本因素。但是,有效地定义相关性本身是很困难的,从原理上讲它不仅和查询词有关,而且还和用户的背景,以及用户的查询历史有关。不同需求的用户可能输入同一个查询,同一个用户在不同的时间输入的相同的查询可能是针对不同的信息需求。

为了形成一个合适的顺序,在搜索引擎出现的早期人们采用了传统信息检索领域很成熟的基于词汇出现频度的方法。大致上讲就是一篇文档中包含的查询(q)中的那些词越多,则该文档就应该排在越前面;再精细一些的考虑则是若一个词在越多的文档中有出现,则该词用于区分文档相关性的作用就越小。这样一种思路不仅有一定直觉上的道理,而且在倒排文件数据结构上很容易实现。因为,当我们通过前述关键词的提取过程,形成一篇文档的关键词集合,p = {t1, t2, …, tn}的时候,很容易同时得到每一个ti 在该文档中出现的次数,即词频,而倒排文件中每个倒排表的长度则对应着一个词所涉及的文档的篇数,即文档频率。然而,由于网页编写的自发性、随意性较强,仅仅针对词的出现来决定文档的顺序,在Web 上做信息检索表现出明显的缺点,需要有其他技术的补充。这方面最重要的成果就是前面提到过的PageRank。通过在预处理阶段为每篇网页形成一个独立于查询词(也就和网页内容无关)的重要性指标,将它和查询过程中形成的相关性指标结合形成一个最终的排序,是目前搜索引擎给出查询结果排序的主要方法。

3. 文档摘要

搜索引擎给出的结果是一个有序的条目列表,每一个条目有三个基本的元素:标题,网址和摘要。其中的摘要需要从网页正文中生成。一般来讲,从一篇文字中生成一个恰当的摘要是自然语言理解领域的一个重要课题,人们已经做了多年的工作并取得了一些成果。但相关的技术用到网络搜索引擎来有两个基本困难。一是网页的写作通常不规范,文字比较随意,因此从语言理解的角度难以做好好;二是复杂的语言理解算法耗时太多,不适应搜索引擎要高效处理海量网页信息的需求。

我们做过统计,即使是分词这一项工作(文本理解的基础),在高档微机上每秒钟也只能完成10篇左右网页的处理。因此搜索引擎在生成摘要时要简便许多,基本上可以归纳为两种方式,一是静态方式,即独立于查询,按照某种规则,事先在预处理阶段从网页内容提取出一些文字,例如截取网页正文的开头512 个字节(对应256 个汉字),或者将每一个段落的第一个句子拼起来,等等。这样形成的摘要存放在查询子系统中,一旦相关文档被选中与查询项匹配,就读出返回给用户。显然,这种方式对查询子系统来说是最轻松的,不需要做另外的处理工作。

但这种方式的一个最大的缺点是摘要和查询无关。一篇网页有可能是多个不同查询的结果,例如当用户分别查询“北大计算机网络”和“北大分布式系统” ,我们实验室的主页http://net.pku.edu.cn 在两种情况下应该都作为结果返回。当用户输入某个查询,他一般是希望摘要中能够突出显示和查询直接对应的文字,希望摘要中出现和他关心的文字相关的句子。因此,我们有了“动态摘要”方式,即在响应查询的时候,根据查询词在文档中的位置,提取出周围的文字来,在显示时将查询词标亮。这是目前大多数搜索引擎采用的方式。为了保证查询的效率,需要在预处理阶段分词的时候记住每个关键词在文档中出现的位置。

除上述外,查询服务返回的内容还有一些细节的支持。例如,对应一个查询往往会有成千上万的结果,返回给用户的内容通常都是按页组织的,一般每页显示10 个结果。统计表明[Wang, et al.,2001], 网络用户一般没有耐心一页页看下去,平均翻页数小于2。这告诉我们将第一页的内容组织好非常重要。如果希望用户多用搜索引擎,就要让第一页的内容尽量有吸引力。

相关文章:

http://www.itale.cn/archives/2010/10/20101014102354.html搜索引擎工作原理简介

http://www.kreny.com/pagerank_cn.htm Google 的秘密- PageRank 彻底解说 中文版

http://baike.baidu.com/view/1518.htmGoogle的PageRank


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: