数学之美 —— 阅读笔记(四)
这一部分主要讲的是关于搜索引擎的一些原理。一个搜索引擎大致需要做这么几件事:
- 尽量下载更多的网页;
- 简历快速有效的索引;
- 根据相关性对网页进行准确的排序;
网络爬虫
实现一个网络爬虫在工程上需要考虑很多细节,大致有这么几点:
- BFS or DFS
爬取静态网页,这两种方法差不多,但互联网静态不变是不可能的。那么问题需要稍作修改,哪种方法能在有限时间内爬取最多网页?我们先思考下一个网页的设计,最重要的一定是首页,然后是这个首页直链的一批网页。这样一来 BFS 明显优于 DFS。当然下载过程中需要下载完一个完整网页后再下载下一个网页,这样又有点 DFS 的味道(有吗?)。
虽然这里说的是 BFS,但实际上并不是简单的 BFS 而是一套相对复杂的下载优先级排序方法在管理下载顺序,这个子系统称为“调度系统”。 - 页面分析 & URL 提取
现在的互联网,大多网页是用脚本语言生成的了,因此需要浏览器内核工程师来开发网络爬虫的解析程序,让爬虫模拟浏览器运行一个网页然后才能得到里面的内容进行爬取分析。 - URL 表
URL 表的作用在于使用一个哈希表来记录哪些网页已经下载过了。这个部分最大的挑战在于分布式系统中所有服务器都要访问并维护这同一张表,而这张表在整个互联网的规模支撑下很大很大。其中一些比较好的解决方法一般采用了这两个技术:首先明确每台下载服务器的分工,然后在此基础上判断 URL 是否下载就可以批量处理了。
索引
建立索引是为了加速搜索过程,最简单的索引结构是用一个很长的二进制数表示每一个关键词的出现与否,然后只需要对这个索引和用户需要搜索的内容进行布尔运算即可。但这样空间消耗太大,无法存储在一个服务器内,所以这时就需要分布式存储了。一般的做法是根据网页的序号将索引分成很多份分别存储在不同服务器中,每当查询时这个查询内容将会分发到很多服务器中并行处理用户请求,最后合并信息反馈用户。
对搜索引擎感兴趣的话可以详细了解下索引建立的策略,因为它是决定搜索引擎质量的关键因素。
PageRank
简历好索引之后就需要对网页进行排序了,著名的排序算法 Google 的 PageRank 是一个革命性的发明,很多人认为 Google 搜索质量好,或者说这个公司的成功全靠这个算法(这有些夸大了)。
把 PageRank 拆开来看,它就是一个“明主表决”系统,它的设计思想简单来说就是:如果一个网页被很多其它网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高,虽然实际上要复杂得多,但万变不离其宗了。同时算法注意到了一个问题,即排名高的网站贡献的链接权重应该更大。这很好理解,就像找工作,一个名牌大学毕业的学生找工作时被录取都是优先的。
现在来看下 PageRank 的计算方法
假如页面 B C 都有关于页面 A 的链接,而各个页面的 PageRank 值为 PR,所拥有的所有链接数为 LK。那么根据 PageRank 的基本思路有:
而一个用户浏览完一个网页后进入下一个相关链接的概率是相同的,所以
然而有一些网页很“自私”,因为它们没有出链,对于这样的网页 PageRank 强行给它们加上对所有网页的出链数(包括自己)。
当然还有一种可能性就是用户浏览完一个网页后,直接通过输入链接跳转到其它网页。现在给这种随机事件一个概率
α
。那么最终 PR 值的计算如下:
当然这么做是建立在已证明了这样做能收敛的基础上的,具体证明这里不阐述,涉及到了马尔可夫过程,即最终可以将问题转化为证明一个马尔可夫过程的收敛。
布尔代数
布尔代数基于二进制,是简单到不能再简单的运算了,它只有两个元素:True,False;基本运算只有:AND,OR,NOT 三种(实际上都能转化成 “与非” AND-NOT 运算)。别看布尔代数如此简单的形式,所有的数学运算和逻辑运算都能转换成二值的布尔运算。例如要搜关于原子能应用的文献,但不想知道如何制造原子弹,那么可以通过 原子能 AND 应用 AND (NOT 原子弹)
的布尔运算来实现。也就是说根据建立好的索引和用户搜索的关键字就能查找到要反馈给用户的内容了。