Google的PageRank算法浅析

摘要:
最近,我一直在学习hadoop。我想知道谷歌的pagerank算法。我找到了《谷歌PageRank算法分析》一文,受益匪浅。文章链接:http://blog.codinglabs.org/articles/intro-to-pagerank.html张阳的博客文章很容易理解,他的想法非常清晰。第一部分:首先介绍了搜索引擎的难点和PageRank的背景;第二部分:接下来,详细介绍PageRa

最近在学习hadoop,对google的pagerank算法先做下了解。搜索到《Google的PageRank算法浅析》一文,受益匪浅。

文章链接:http://blog.codinglabs.org/articles/intro-to-pagerank.html  张洋的博客

文章浅显易懂,思路非常清晰。

第一部分:首先从搜索引擎的难题引入,PageRank产生的背景;

第二部分:接着详细介绍PageRank算法的思想以及基础框架,并结合互联网页面拓扑结构讨论PageRank处理Dead Ends及平滑化的方法;

第三部分:最后讨论PageRank仍然存在的Spam攻击方法Spam Farm,以及搜索引擎如何防御Spam Farm。

1. 搜索引擎的难题

  从本质上说,搜索引擎是一个资料检索系统,搜索引擎拥有一个资料库(具体到这里就是互联网页面),用户提交一个检索条件(例如关键词),搜索引擎返回符合查询条件的资料列表。

  ”如何对搜索结果进行重要性排序“是搜索引擎的重要任务,也是核心难题。 

早期的搜索引擎经历了“不评价” 和“基于检索词”的评价两个阶段。 “基于检索词”的评价算法很直观,但是容易受到“Term Spam”的攻击。其实从搜索引擎出现的那天起,spammer和搜索引擎反作弊的斗法就没有停止过。Spammer是这样一群人——试图通过搜索引擎算法的漏洞来提高目标页面(通常是一些广告页面或垃圾页面)的重要性,使目标页面在搜索结果中排名靠前。

 2.PageRank算法

   PageRank的作用是评价网页的重要性,以此作为搜索结果的排序重要依据之一。实际中,为了抵御spam,各个搜索引擎的具体排名算法是保密的,PageRank的具体计算方法也不尽相同,本节介绍一种最简单的基于页面链接属性的PageRank算法。这个算法虽然简单,却能揭示PageRank的本质,实际上目前各大搜索引擎在计算PageRank时链接属性确实是重要度量指标之一。

   1)简单的PageRank计算

  首先,我们将Web做如下抽象:1、将每个网页抽象成一个节点;2、如果一个页面A有链接直接链向B,则存在一条有向边从A到B(多个相同链接不重复计算边)。因此,整个Web被抽象为一张有向图。

现在假设世界上只有四张网页:A、B、C、D,其抽象结构如下图:

Google的PageRank算法浅析第1张

显然这个图是强连通的(从任一节点出发都可以到达另外任何一个节点)。

然后需要用一种合适的数据结构表示页面间的连接关系。其实,PageRank算法是基于这样一种背景思想:被用户访问越多的网页更可能质量越高,而用户在浏览网页时主要通过超链接进行页面跳转,因此我们需要通过分析超链接组成的拓扑结构来推算每个网页被访问频率的高低。最简单的,我们可以假设当一个用户停留在某页面时,跳转到页面上每个被链页面的概率是相同的。例如,上图中A页面链向B、C、D,所以一个用户从A跳转到B、C、D的概率各为1/3。设一共有N个网页,则可以组织这样一个N维矩阵:其中i行j列的值表示用户从页面j转到页面i的概率。这样一个矩阵叫做转移矩阵(Transition Matrix)。下面的转移矩阵M对应上图:

Google的PageRank算法浅析第2张(转移矩阵实际上就是Google 矩阵)

然后,设初始时每个页面的rank值为1/N,这里就是1/4。按A-D顺序将页面rank为向量v:

Google的PageRank算法浅析第3张(特征向量)

注意,M第一行分别是A、B、C和D转移到页面A的概率,而v的第一列分别是A、B、C和D当前的rank,因此用M的第一行乘以v的第一列,所得结果就是页面A最新rank的合理估计,同理,Mv的结果就分别代表A、B、C、D新rank:

Google的PageRank算法浅析第4张(新的特征向量值)

然后用M再乘以这个新的rank向量,又会产生一个更新的rank向量。迭代这个过程,可以证明v最终会收敛,即v约等于Mv,此时计算停止。最终的v就是各个页面的pagerank值。例如上面的向量经过几步迭代后,大约收敛在(1/4, 1/4, 1/5, 1/4),这就是A、B、C、D最后的pagerank。

  2)处理Dead Ends的情况  

上面的PageRank计算方法假设Web是强连通的,但实际上,Web并不是强连通(甚至不是联通的)。下面看看PageRank算法如何处理一种叫做Dead Ends的情况。

所谓Dead Ends,就是这样一类节点:它们不存在外链。看下面的图:

    Google的PageRank算法浅析第5张

注意这里D页面不存在外链,是一个Dead End。上面的算法之所以能成功收敛到非零值,很大程度依赖转移矩阵这样一个性质:每列的加和为1。而在这个图中,M第四列将全为0。在没有Dead Ends的情况下,每次迭代后向量v各项的和始终保持为1,而有了Dead Ends,迭代结果将最终归零(要解释为什么会这样,需要一些矩阵论的知识,比较枯燥,此处略)。

处理Dead Ends的方法如下:迭代拿掉图中的Dead Ends节点及Dead Ends节点相关的边(之所以迭代拿掉是因为当目前的Dead Ends被拿掉后,可能会出现一批新的Dead Ends),直到图中没有Dead Ends。对剩下部分计算rank,然后以拿掉Dead Ends逆向顺序反推Dead Ends的rank。

以上图为例,首先拿到D和D相关的边,D被拿到后,C就变成了一个新的Dead Ends,于是拿掉C,最终只剩A、B。此时可很容易算出A、B的PageRank均为1/2。然后我们需要反推Dead Ends的rank,最后被拿掉的是C,可以看到C前置节点有A和B,而A和B的出度分别为3和2,因此C的rank为:1/2 * 1/3 + 1/2 * 1/2 = 5/12;最后,D的rank为:1/2 * 1/3 + 5/12 * 1 = 7/12。所以最终的PageRank为(1/2, 1/2, 5/12, 7/12)。

  3)Spider Traps及平滑处理

  可以预见,如果把真实的Web组织成转移矩阵,那么这将是一个极为稀疏的矩阵,从矩阵论知识可以推断,极度稀疏的转移矩阵迭代相乘可能会使得向量v变得非常不平滑,即一些节点拥有很大的rank,而大多数节点rank值接近0。而一种叫做Spider Traps节点的存在加剧了这种不平滑。例如下图:

    Google的PageRank算法浅析第6张

D有外链所以不是Dead Ends,但是它只链向自己(注意链向自己也算外链,当然同时也是个内链)。这种节点叫做Spider Trap,如果对这个图进行计算,会发现D的rank越来越大趋近于1,而其它节点rank值几乎归零。

为了克服这种由于矩阵稀疏性和Spider Traps带来的问题,需要对PageRank计算方法进行一个平滑处理,具体做法是加入“心灵转移(teleporting)”。所谓心灵转移,就是我们认为在任何一个页面浏览的用户都有可能以一个极小的概率瞬间转移到另外一个随机页面。当然,这两个页面可能不存在超链接,因此不可能真的直接转移过去,心灵转移只是为了算法需要而强加的一种纯数学意义的概率数字。

加入心灵转移后,向量迭代公式变为:

                            v=(1β)Mv+eβN

其中β往往被设置为一个比较小的参数(0.2或更小),e为N维单位向量,加入e的原因是这个公式的前半部分是向量,因此必须将β/N转为向量才能相加。这样,整个计算就变得平滑,因为每次迭代的结果除了依赖转移矩阵外,还依赖一个小概率的心灵转移。

以上图为例,转移矩阵M为:

                    Google的PageRank算法浅析第7张

设β为0.2,则加权后的M为:

                    Google的PageRank算法浅析第8张

因此:

                  Google的PageRank算法浅析第9张

如果按这个公式迭代算下去,会发现Spider Traps的效应被抑制了,从而每个页面都拥有一个合理的pagerank。

  4)Topic-Sensitive PageRank

其实上面的讨论我们回避了一个事实,那就是“网页重要性”其实没一个标准答案,对于不同的用户,甚至有很大的差别。例如,当搜索“苹果”时,一个数码爱好者可能是想要看iphone的信息,一个果农可能是想看苹果的价格走势和种植技巧,而一个小朋友可能在找苹果的简笔画。理想情况下,应该为每个用户维护一套专用向量,但面对海量用户这种方法显然不可行。所以搜索引擎一般会选择一种称为Topic-Sensitive的折中方案。Topic-Sensitive PageRank的做法是预定义几个话题类别,例如体育、娱乐、科技等等,为每个话题单独维护一个向量,然后想办法关联用户的话题倾向,根据用户的话题倾向排序结果。

Topic-Sensitive PageRank分为以下几步:

1、确定话题分类。

一般来说,可以参考Open Directory(DMOZ)的一级话题类别作为topic。目前DMOZ的一级topic有:Arts(艺术)、Business(商务)、Computers(计算机)、Games(游戏)、Health(医疗健康)、Home(居家)、Kids and Teens(儿童)、News(新闻)、Recreation(娱乐修养)、Reference(参考)、Regional(地域)、Science(科技)、Shopping(购物)、Society(人文社会)、Sports(体育)。

2、网页topic归属。

这一步需要将每个页面归入最合适的分类,具体归类有很多算法,例如可以使用TF-IDF基于词素归类,也可以聚类后人工归类,具体不再展开。这一步最终的结果是每个网页被归到其中一个topic。

3、分topic向量计算。

在Topic-Sensitive PageRank中,向量迭代公式为

v=(1β)Mv+sβ|s|

首先是单位向量e变为了s。s是这样一个向量:对于某topic的s,如果网页k在此topic中,则s中第k个元素为1,否则为0。注意对于每一个topic都有一个不同的s。而|s|表示s中1的数量。

还是以上面的四张页面为例,假设页面A归为Arts,B归为Computers,C归为Computers,D归为Sports。那么对于Computers这个topic,s就是:

Google的PageRank算法浅析第10张

而|s|=2。因此,迭代公式为:

Google的PageRank算法浅析第11张

最后算出的向量就是Computers这个topic的rank。如果实际计算一下,会发现B、C页在这个topic下的权重相比上面非Topic-Sensitive的rank会升高,这说明如果用户是一个倾向于Computers topic的人(例如程序员),那么在给他呈现的结果中B、C会更重要,因此可能排名更靠前。

4、确定用户topic倾向。

最后一步就是在用户提交搜索时,确定用户的topic倾向,以选择合适的rank向量。主要方法有两种,一种是列出所有topic让用户自己选择感兴趣的项目,这种方法在一些社交问答网站注册时经常使用;另外一种方法就是通过某种手段(如cookie跟踪)跟踪用户的行为,进行数据分析判断用户的倾向,这本身也是一个很有意思的话题,按时这个话题超出本文的范畴,不再展开细说。

3.针对PageRank的Spam攻击与反作弊

待续

免责声明:文章转载自《Google的PageRank算法浅析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【原】C#子线程刷新主线程一例spring-boot-route 读取配置文件的几种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Transformer架构记录(三)

Transformer架构记录(二)中提到,整个Encoder-block的结构如下图所示: 本文聚焦上图中的Multi-Head Attention模块,即下图所示: 1. self-Attention self-Attention是理解Multi-Head Attention模块的基础,因此需要理解自注意力机制在Transformer中的具体原理。...

移植UE4的Spline与SplineMesh组件到Unity5

一个月前,想开始看下UE4的源码,刚开始以为有Ogre1.9与Ogre2.1源码的基础 ,应该还容易理解,把源码下起后,发现我还是想的太简单了,UE4的代码量对比Ogre应该多了一个量级,毕竟Ogre只是一个渲染引擎,而UE4包含渲染,AI,网络,编辑器等等,所以要理解UE4的源码,应该带着目地去看,这样容易理解。 在看UE4提供的ContentExamp...

C#刷遍Leetcode面试题系列连载(1)

目录 系列教程索引 为什么要刷LeetCode 刷LeetCode有哪些好处? LeetCode vs 传统的 OJ LeetCode刷题时的心态建设 C#如何刷遍LeetCode 选项1: VS本地Debug + 在线验证后提交 选项2: VS Code本地Debug + 在 LeetCode 插件中验证和提交 安装C#相关插件 配置 .NET...

pspice仿真老不收敛怎么办?

仿真不收敛,提示ERROR(ORPSIM-15138): Convergence problem in transient analysis at Time =  116.4E-21.         Time step =  116.4E-21, minimum allowable step size =  1.000E-18 就是在计算时迭代还没有达到...

Boost库简介

Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。 字符串和文本处理库 Conversion库:对C++类型转换的增强,提供更强的类型安全转换、更高效的类型安全保护、进行范围检查的数值转换和词法转换。 Format库:实现类似printf的格式化对象,可以把参数格式化...

R语言对NASA元数据进行文本挖掘的主题建模分析

原文链接:http://tecdat.cn/?p=9424 目录 什么是主题建模? 获取和整理NASA元数据 制作DocumentTermMatrix LDA主题建模 探索建模 每个文档都属于哪个主题? 将主题建模连接到关键字 NASA有32,000多个数据集,并且NASA有兴趣了解这些数据集之间的联系,以及与NASA以外其他政府组织中其他重要数据集...