Elasticsearch实战与原理解析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 网页分析

网络爬虫将网页数据爬取后,会将网页内容存储到网页库。随后,网页分析程序将自动对网页进行分析。主要的分析动作有网页内容摘要、链接分析、网页重要程度计算、关键词提取/分词、去除噪声等。经过网页分析后,网页数据将变成网页中关键词组、链接与关键词的相关度、网页重要程度等信息。

网页内容中的去除噪声主要是去除如广告、无关的导航条、版权信息、调查问卷等和文章主体内容无关的内容。这些内容如果纳入网页分析中,往往会让网页的主题发生偏移;同时更多的无关内容的索引,还会使得索引结构规模变大,拖累搜索的准确性,降低搜索速度,而这一点非常重要,因为搜索的准确性和检索速度是衡量搜索引擎的主要标准之一。在实践中,去除噪声可以基于Doc View模型实现。

网页内容摘要一般由网页正文生成,摘要一般会显示在搜索结果的展示区,如图2-3中框形区域所示。

图2-3

一般来说,摘要的生成方式有静态生成方式和动态生成方式两种。其中静态生成方式比较简单,在网页分析阶段即可从网页内容中提取。虽然这种方式“短、平、快”,但缺点也很明显,即当呈现搜索结果时,展示的摘要可能与搜索的关键词无关。

现在的搜索引擎往往采用动态生成模方式生成,即根据查询关键词在文档中的位置,提取其周边的文字,并高亮显示。

网页重要程度计算用于衡量网站的权威性。一般越权威的网站,越容易被其他网站主动链接;换言之,网站被引用的次数越多,说明该网站越重要。对搜索引擎而言,在返回相关性强的内容时,应该尽量先返回权威网站的内容;对搜索引擎的用户而言,这样往往更能匹配他们的需要。因此这也是评价搜索引擎体验好坏的核心指标之一。

网站之间链接的关系,其实可以从算法的维度来解析。链接其实是一种投票、一种信任。网站被主动链接的次数越多,说明互联网环境下其他网站对该网站的投票越多、信任越多,该网站在互联网中越流行。本质上这就是一种分布式系统下的共识投票。如图2-4所示,网页A在多个网页间被主动链接、被主动投票的次数最多,因此我们认为网页A更权威。

图2-4

如果将网页间的链接关系视作有向图,则网页的链接关系就会变成入度和出度。这里的入度指的是网页能通过其他网页的链接来访问;出度指的是网页中链接了其他网页。因此,入度大网页,说明其被多个网页引用,这也意味着该网页比较权威、比较流行和热门,如图2-4中的网页A。

在各家搜索引擎的实践中,谷歌提出了PageRank(佩奇等级)算法,该算法也是谷歌搜索引擎的重要法宝。

在关键词提取/分词环节,基础技术是分词,因此分词是各家搜索引擎中非常关键的技术。不论中英文网站,在创建索引之前都需要对内容进行分词。分词不仅是关键词提取的前提,也是后续文本挖掘的基础。

在分词方面,中英文分词有天然的差异性。相较而言,英文分词会简单一些,因为英文有天然的空格作为单词的分隔符。中文不仅没有天然空格来分隔汉字,而且汉字的词组大部分由两个及以上的汉字组成,汉语语句也习惯连续性书写,因此增加了中文分词的难度。

此外,在中英文中,都有一类词称之为“Stop Word”,即“停用词”。停用词一般是指无内容指示意义的词。

在中文分词时,常用的算法可以分为两大类,一类是基于字典的机械式分词,另一类是基于统计的分词。

基于字典的分词方法,一般会按照一定的策略将待分析的汉字串与一个充分大的词典的词条进行匹配,若在词典中找到某个字符串词条,则匹配成功。因此基于字典的分词方法的核心字符串的匹配。

在匹配字符串时分为正向匹配和逆向匹配两种。正向匹配指的是在匹配字符串时从左向右匹配。如“中国”“中国人”两个词条字符串在匹配时,从左向右可以依次匹配成功“中”和“国”。而逆向匹配与之相反,一般是从右向左匹配。同样,当“中国”“中国人”两个词条字符串从右向左匹配时,“中国”的“国”会与“中国人”的“人”去匹配,显而易见,匹配失败;此时需要匹配的字就是“中国人”中“人”字左侧的“国”字,这时,两个“国”字是能匹配成功的,依此类推,两个字符串词条中的“中”字也能匹配成功。

由于中文的特性,多个词条往往有相关的前缀或后缀,如“中国”“中国人”“中国话”三个词条都有“中国”这个公共前缀。因此在某方向,如正向或逆向匹配过程中,按匹配长度的不同,还可以细分为最大/最长匹配和最小/最短匹配。我们仍然以“中国”“中国人”“中国话”三个词条举例,正向最短匹配的结果是“中”,而正向最长匹配的结果是“中国”。

因此,基于字典的分词算法一般常用正向最大匹配、逆向最大匹配,或者是组合模式。不过基于字典的分词算法对分词词典的更新有较强依赖,特别是需要对新词敏感的场景。

第二类分词算法是基于统计的分词算法。该算法无须词典,一般会根据汉字与汉字相邻出现的概率来进行分词。因此基于统计的分词算法往往需要构建一个语料库,并不断更新。在分词前,算法需要进行预处理,即对语料库中相邻出现的各个字的组合进行统计,计算两个汉字间的组合概率。

其实不论是哪类分词算法,都会对新词不敏感,都会分出一些经常出现但并非有效词组的内容,如“有点”“有的”“好像”“非常”等。因此有必要对这类词语进行过滤,毕竟分词算法最主要的指标就是分词的准确率。

在开发实践中,各个语言栈常用的分词中间件汇总如下。Python语言中的中文分词组件有jieba中文分词,Java语言中常用Jcseg、Ansj和庖丁分词,Go语言中常用sego。