PageRank算法

PageRank算法总的来说就是预先给每个网页一个PR值(下面用PR值指代PageRank值),由于PR值物理意义上为一个网页被访问概率,所以一般是 1 N \frac{1}{N} N1​,其中N为网页总数。另外,一般情况下,所有网页的PR值的总和为1。如果不为1的话也不是不行,最后算出来的不同网页之间PR值的大小关系仍然是正确的,只是不能直接地反映概率了。

所以PageRank算法实际上就是预先给定PR值后,通过每个网页之间的链接关系不断迭代,直至达到平稳分布为止。

各个网页的PR值之间的关系一般情况下表示为如下的式子:

P R ( p i ) = α ∑ p j ∈ M p i P R ( p j ) L ( p j ) + ( 1 − α ) N \LARGE PR(p_i)=α\sum_{p_j∈M_{p_i}}\frac{PR(p_j)}{L(p_j)}+\frac{(1-α)}{N} PR(pi​)=α∑pj​∈Mpi​​​L(pj​)PR(pj​)​+N(1−α)​

其中 M p i M_{p_i} Mpi​​是所有对 p i p_i pi​网页有出链的网页集合; L ( p j ) L(p_j) L(pj​)是网页的出链数目; N N N是网页总数; α α α是阻尼系数,即用户离开当前网页重新输入网址访问的概率,一般取0.85。

根据这一关系不断迭代,当算法收敛的时候,得到的PR值即使每个网页的PR排序值。


#算法实现

##digraph类

由于一个搜索引擎中的网页数不胜数,使用一个矩阵存储各个网页之间的链接关系是不可能的,这里采用有向图类来优化稀疏矩阵的存储。

  • 类的方法一览表
名字 参数 说明
init_nodes self, nodes 初始化向图图的节点
init_edges self, edges 初始化向图图的边
add_edge self, edge 增加向图图中的边
neighbors self, node 返回参数节点的所有后继节点
incidents self, node 返回参数节点的所有前驱节点
  • digraph类源代码
class digraph:def init_nodes(self, nodes):self.nodes = nodesself.edges = []for node in nodes:self.edges.append([node, [], []])def init_edges(self, edges):for edge in edges:self.add_edge(edge)def add_edge(self, edge):for edgeTmp in self.edges:if edgeTmp[0] == edge[0]:edgeTmp[2].append(edge[1])if edgeTmp[0] == edge[1]:edgeTmp[1].append(edge[0])def neighbors(self, node):neighbors = []for nodeTmp in self.edges:if node == nodeTmp[0]:neighbors = nodeTmp[2]breakreturn neighborsdef incidents(self, node):incidents = []for nodeTmp in self.edges:if node == nodeTmp[0]:incidents = nodeTmp[1]breakreturn incidents

##PRIterator类

PRIterator类是用来迭代计算PR值的类,由一个有向图和一个阻尼系数构造,阻尼系数即公式中的α。默认的最大迭代次数是100,确定迭代是否结束,即PR值是否收敛的参数为0.00001,即ϵ。

只有一个方法——page_rank方法,来迭代计算PR值直至收敛。同时如果一个节点没有任何的后继节点,那么相当于所有的节点都是它的后继节点,即一个网页没有出链的情况下,下一秒访问任何网页的概率都是相等的。

  • PRIterator类源代码
class PRIterator:__doc__ = '''计算一张图中的PR值'''def __init__(self, dg, damping_factor):self.damping_factor = damping_factor  # 阻尼系数,即αself.max_iterations = 100             # 最大迭代次数self.min_delta = 0.00001              # 确定迭代是否结束的参数,即ϵself.graph = dgdef page_rank(self):#  先将图中没有出链的节点改为对所有节点都有出链for node in self.graph.nodes:if len(self.graph.neighbors(node)) == 0:for node2 in self.graph.nodes:self.graph.add_edge((node, node2))nodes = self.graph.nodesgraph_size = len(nodes)if graph_size == 0:return {}page_rank = dict.fromkeys(nodes, 1.0 / graph_size)  # 给每个节点赋予初始的PR值damping_value = (1.0 - self.damping_factor) / graph_size  # 公式中的(1−α)/N部分flag = Falsefor i in range(self.max_iterations):change = 0for node in nodes:rank = 0for incident_page in self.graph.incidents(node):  # 遍历所有"入射"的页面rank += self.damping_factor * (page_rank[incident_page] / len(self.graph.neighbors(incident_page)))rank += damping_valuechange += abs(page_rank[node] - rank)  # 绝对值page_rank[node] = rankprint("This is NO.%s iteration" % (i + 1))if change < self.min_delta:flag = Truebreakif flag:print("finished in %s iterations!" % node)else:print("finished out of 100 iterations!")return page_rank

##主函数

主函数的作用就是读取网页的链接数据,初始化有向图,迭代计算PR值直至收敛,最后输出计算结果。

测试的数据为维基百科网站上所有网页的链接数据,由于数据共有103689条,这里不再给出详细数据,文末附有数据集及源码,可执行文件下载链接。这里给出一部分样例的截图如下。数据格式为:网页ID——链接到的网页ID。

在主程序中,需要输入测试数据的路径和阻尼系数。运行结果如下图。

  • 主程序源代码
if __name__ == '__main__':# python NewPageRankDemo.py# 输入数据和输出结果所在的文件夹位置directory = input('输入数据和输出结果所在的文件夹位置:\n示例输入:C:\\Users\\37618\\Desktop\\PageRank\\\n')damping_factor = input('输入阻尼系数α(一般取0.85):\n')damping_factor = float(damping_factor)# 储存训练样本数据f = open(directory + 'WikiData.txt')nodes = []edges = []for v in f:tmp = v.split("\t")tmp[1] = tmp[1].split("\n")[0]if nodes.count(tmp[0]) == 0:nodes.append(tmp[0])if nodes.count(tmp[1]) == 0:nodes.append(tmp[1])edges.append((tmp[0], tmp[1]))# 输出预测结果import sysoutput = sys.stdoutoutputfile = open(directory + 'result(' +str(damping_factor)+ ').txt', 'w')sys.stdout = outputfiledg = digraph()dg.init_nodes(nodes)dg.init_edges(edges)pr = PRIterator(dg, damping_factor)page_ranks = pr.page_rank()print("The final page rank is\n")for page_rank in page_ranks:print(page_rank, ' ', page_ranks.get(page_rank))outputfile.close()sys.stdout = output

示例输出如下图。

可以看到,程序在31次迭代后在ID为8274的网页处收敛,并输出了所有网页的PR值。

#特别注意!10万条数据的迭代非常占内存,请配置垃圾的笔记本们慎重尝试!


#源代码链接

源代码链接,附带测试数据集及测试输出,源代码及说明,可执行文件

搜索引擎中的PageRank算法相关推荐

  1. 在微博中应用PageRank算法

    这个想法很早就有了,因为我是做搜索引擎背景的,能够深刻的理解PageRank算法在搜索引擎中的重要性,绝对的核心技术之一.不过,这篇博客,并不打算介绍PageRank算法的原理,而是,让我们来看看,这 ...

  2. Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析

    PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...

  3. SEO算法:如何通过PageRank算法判断SEO排序结果

    想必在做SEO的时候有同学发现相同的网站有两个页面但是排名的名次不同,既然是同一个网站那么应该权重都一样怎么会一个排名前面一个后面呢?在搜索引擎当中每个网页都有对应的页面得分在决定这两个页面排名顺序是 ...

  4. PageRank算法改进

    PageRank算法的应用 PageRank 算法是 Google 搜索引擎进行网页排名的一种算法,那么它如何映射到其他领域? 比如,我们如何在文献排名中应用PageRank算法呢? 对文献的质量进行 ...

  5. 翻译: 网页排名PageRank算法的来龙去脉 以及 Python实现

    PageRank ( PR ) 是Google 搜索用来在其搜索引擎结果中对网页进行排名的算法.它以"网页"一词和联合创始人拉里佩奇的名字命名.PageRank 是衡量网站页面重要 ...

  6. 浅析PageRank算法

    机器学习很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看了一些相关的资料(PS:在动车上看看书真是一种享受),趁热打铁 ...

  7. 【复杂网络建模】——Python可视化重要节点识别(PageRank算法)

    目录 一.复杂网络建模 二.建模的算法 三.使用PageRank算法进行网络重要节点识别 1.PageRank算法 2.基于PageRank算法的ER网络重要节点识别 3.基于PageRank算法的小 ...

  8. 图算法(一):Pagerank算法(网页排名算法)【适用场景:网页排序、社交网络重点人物发掘等】【一种由搜索引擎根据网页(节点)之间相互的超链接进行计算的技术,用来体现网页(节点)的相关性和重要性】

    一.概述 PageRank算法又称网页排名算法,是一种由搜索引擎根据网页(节点)之间相互的超链接进行计算的技术,用来体现网页(节点)的相关性和重要性. 如果一个网页被很多其他网页链接到,说明这个网页比 ...

  9. 算法高级(31)-搜索引擎中的拼写纠错功能该如何实现?

    一.Word中的拼写检查功能 拼写检查程序是指将输入的每个字词与存储器里的字典比较,检查其正确性并在屏幕上显示差异的计算机程序.如果在字典中没有这个单词,用户就会被警告可能拼写错误,同时经常提供几个纠 ...

最新文章

  1. 20秋PHP作业3,北语20秋《PHP》作业3【标准答案】
  2. oracle 自定义函数
  3. Java函数式接口看这一篇就够了
  4. vue 时间刻度_vue时间轴风格式的图片展示
  5. vmware 指定的网络名不可用
  6. 浅谈c/c++typedef和#define区别[转]
  7. 旅行者 问题_门槛项目:没有旅行者回到他的原籍城市。
  8. VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏
  9. 经典面试题(24):以下代码将输出的结果是什么?
  10. 摆摊神器五菱荣光爆红后,上汽大通房车又成夜市新晋网红
  11. 1用switch语句从控制台输入100以内的分数判断优秀,良好,及格不及格属于哪一个区间
  12. GlassFish下手动部署JSF程序
  13. Andromeda OS 来了,Android 再见?
  14. F.Studio 远程备份系统
  15. 【运动学】基于matlab GUI模拟小球自由落体【含Matlab源码 1630期】
  16. emWin—数字软键盘
  17. 举例说明数据库一、二、三及BCNF范式
  18. 计算机二级页眉页脚的知识,轻松解决计算机二级之页眉页脚不再是问题-页眉页脚的设置...
  19. 晨光计算机开n次方,【三名工程】晓之以理,导之以行,动之以情——郑标名师工作室第一次网络研修记录...
  20. mysql 创建用户、授权、修改密码

热门文章

  1. 存储fc交换机配置小结
  2. VSG控制模型,不平衡电网,自适应控制模型,能够实现三相电网电流平衡,有功、无功
  3. 项目中的软件质量管理
  4. win7系统开发hadoop时遇到的问题总结
  5. eNSP模拟器安装包VM VirtualBox,WinPcap,Wireshark依赖安装包下载
  6. 邮箱Pop3 smtp地址服务器配置方法:
  7. 仲联量行:科技行业繁荣推动深圳成为中国内地第三大办公楼市场
  8. stanford cs230 课程笔记
  9. wmf格式的图片如何通过Java转换成JPG格式的在页面上直接显示?
  10. 洛谷P1118 [USACO06FEB]数字三角形 Backward Digit Su(dfs剪枝)