0x00 前言
社交关系数据已经准备就绪,PageRank算法的原理和实现我们也已经大致掌握,下面就可以在此基础上做一些有意思的事情了。
本篇会在前面抓取的500w简书的粉丝数据上,使用 PageRank 找到其中的排名靠前的用户。
0x01 前期准备
1. 数据准备
数据的存储格式如下,这也是我们在生产环境中经常使用的数据格式,因此在爬虫获取的阶段已经处理完毕。这份数据是一个有向图,左边为用户,右边为他的粉丝。
备注: 这里面用的是简书生成的用户的ID,根据这个ID可以很方便地拼出来用户的主页。
2. 程序准备
这里还是要鄙视一下自己的程序,我没用自己的写的Demo程序,而用了一个Python包:NetworkX。懂了原理之后,用一些开源的实现,总是比自己靠谱一点。
NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.
NetworkX用起来很方便,总的来讲三步就搞定:
- 引入NetworkX包
- 初始化一个图
- 计算PageRank值
0x02 实现和效果
实现
使用NetworkX包的话就很简单了,本来想用Matplotlib画一下关系图呢,但是数据量太大,后续到数据可是化的时候用Gephi或者Tableau玩一下。 下面是一个简单的代码,求取PageRank值。
对于最终结果,我们可以排一个序,然后打印出来PageRank值在前十的用户。如下图:
效果
效果的话,没什么好说的,自己跑一下数据然后取top的用户就会发现,排名考前的用户,大部分都是粉丝非常多的用户,相应的他们的博客的数量以及阅读量也都很多。
由于整个关系网是以我为入口爬取,因此在排名考前的一些用户中主要是三种类型:
- 数据相关的从业者(我关注的人以及我的粉丝大部分都会是类似的用户)
- 鸡汤类作家(简书的主旋律)
- 经常画画的简书用户(之前画过一些简笔画,因此有不少类似的关系)
0xFF 总结
做这一步只是为了好玩,然后顺便加深一下对PageRank算法的理解。 跑完程序之后感觉还是有不少收获的,也打开了不少的思路。
首先是观察到了一个非常有趣的现象:刚开始数据比较少的时候(20万左右)我就运行了一下程序,发现了有一个排名很靠前的用户,大概排名第七,但是他只有一个粉丝,看了一下他的粉丝,这个粉丝排名在第二,相应地把他拉到了第七的位置,这就验证了上一篇文章中提到的:如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高
然后数据量大起来后再运行了程序,在结果集中过滤掉鸡汤类用户之后,会发现很多之前没关注的博主,他们的博客都非常高。如果按照这种方式,简书或者CSDN这种博客网站,是不是可以将PageRank值作为推荐的一个权重,用于推荐系统中?不太清楚他们的推荐是怎么做的,不过没听说过哪个公司用PageRank作为推荐的一个权重,应该是有其局限性。
PageRank算法的原理的实现以及一个基本场景大致过了一遍,后续会来搞一下社区分区,然后再分别实现这些算法的MapReduce程序,以及在MapReduce程序中如何进行工程上的优化。
作者:dantezhao |简书 | CSDN | GITHUB
个人主页:http://dantezhao.com
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息
网友评论