一、用R登录并发布微博
之所以仍然选择用R来做这个登录和发布的工作,是考虑到分析过程的连续性,毕竟能够在同一个平台下面完成所有的工作,还是很令人身心愉悦的。这里借助了一款命令行浏览器cURL,这个浏览器在R中可以用RCurl实现,简单的介绍建议参考medo的《R不务正业之RCurl》。由于我对HTTP这些东西都属于初级未入门水平,没能实现直接的登录,只好利用了cookie实现间接登录。但是最终结果还是蛮稳定的。编写这个登录和发布微博的函数,目的之一是为后续的数据采集做准备,但同时也能够实现同步更新不同平台信息的功能,例如写一条语句就能够把人人状态、新浪微博、飞信签名等等同步更新,还是很有趣的。只是人人状态和飞信签名貌似不是很稳定,偶尔能用偶尔报错,我稍微测试了一下,可能是cookie的问题,目前没有深入探索。
(更新:目前已经实现了直接登录,这样或许可以绕过cookie的问题。)
总地来说这个功能的效果就是这个样子。
![](https://pic.jg.com.cn/img/pinggu/5ff213f80d687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353832385f312e6a706766c0729e89.jpg)
二、采集关注信息,制作粉丝及关注人的地区分布
在登录之后,就可以用一些循环语句来采集关注者与被关注者的ID等信息(不知道这算不算是某种爬虫)。为了描述地区分布,只需要采集用户的地区信息就OK了。然后借助maptools包,可以比较方便地画出简单的用户分布图。这里没办法画海外人士,见谅。
我的粉丝的分布:
![](https://pic.jg.com.cn/img/pinggu/e6e72c2e6f687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731345f315f6c69742e706e67b008c8faf8.jpg)
我关注的人的分布:
![](https://pic.jg.com.cn/img/pinggu/5b9ad82fb0687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731355f325f6c69742e706e67125da7ad0e.jpg)
可以看得出来,不论是关注还是被关注,用户的分布都算是比较集中。这个很可以理解,因为我是小网虫一只,没啥广泛的人气,哈哈。但是显然地,某省ID的频数很高,令人欣慰。
三、采集关注信息,制作关注关系的网络图
这个工作目前尚未完成,主要是遇到了技术性的障碍:矩阵太大,我的计算机算不动。事实上,采集数据的过程跟上述的地理位置的采集没有本质区别,都是一些循环的计算,最终得到的结果是这个样子:
![](https://pic.jg.com.cn/img/pinggu/5eec1601f8687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731355f335f6c69742e6a7067d6254df230.jpg)
前两列是我关注的用户以及他们的ID,后两列是前两列所关注的用户及ID。这个数据集目前有22446行,涉及到15868个用户ID,如果要画网络图,似乎对计算机的性能有比较高的要求。所以我只好暂时选择了一种无奈的办法:抽样。得到的结果大概是这样:
![](https://pic.jg.com.cn/img/pinggu/ea55f388e7687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731355f345f6c69742e706e6724f5a11e74.jpg)
换一种抽样的逻辑,减少对象个数,可以做出相对清晰一点的网络。像是这样:
![](https://pic.jg.com.cn/img/pinggu/b5209cea57687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731355f355f6c69742e706e676a70877992.jpg)
虽然作图遇到了一定的障碍,但是在做的过程中我还是有所体会:follow的信息比fans的信息更干净一点。因为我都是以我的ID为中心出发来进行数据的采集,所以本质上得到的网络都是个体网。而fans的关系往往不能说明什么问题,因为我的很多fans都是不知所云的fans。我揣测,这些fans,要么是所谓的僵尸ID,要么是所谓的广告ID,要么就是一些新用户随便添加的关注。这些关注关系并不是我所关心的关系,虽然他在某种程度上体现着我的某种中心度。因此我在后面把关心的重点集中在我的follow上,因为由我出发的这条follow关注链是比较纯粹的:要么是感兴趣的人,要么是有感情的人,总之都是具有确实意义的关注关系。
四、基于follow关系的一种用户推荐
意识到follow关系的纯粹性之后,我就开始试图针对follow关系做一些分析。最先想到的就是用户的推荐。
我没有具体研究新浪微博目前使用的用户推荐的方式,感觉是有两种:根据个人资料推荐,根据个人标签推荐。
我的直观理解,推荐系统的一个逻辑问题是:用户会接受怎样的推荐。或者换句话说,用户是为什么而去关注他人的。因此我就觉得,基于个人资料的推荐可能并不是那么靠谱,尤其是新浪微博持续不断地向我推荐”浙江大学“的用户。且不说里面有很多是”浙江大学城市学院“之类的漏网之鱼,关键是我为什么仅仅因为他跟我同一所大学毕业就要去关注他呢?我觉得基本上没有道理。除非在大学的基础上还能够进行其他判断,精确地推断出他跟我可能是本科室友,那我就比较感谢新浪微博了哈哈。至于根据个人标签来进行推荐,我觉得对我来说相对还算靠谱,因为我主要还是根据兴趣爱好来进行关注的。但是仅仅根据个人的标签来做推荐,又有点单调与片面,我觉得加入”关注对象的标签“可能会更完善一点。这种考虑的来源是:我关注的那些人都是我确实感兴趣的那些人,他们可能会拥有一些类似的标签,而这些标签是我没有给自己加的,这要么是因为懒,要么是因为没有意识到。于是我采集了我follow的那些用户的个人标签,然后做了简单的频数统计,得到了下面的结果,这个结果基本上算是一目了然。
![](https://pic.jg.com.cn/img/pinggu/1d708f3369687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731355f365f6c69742e706e67e6595a9f82.jpg)
另外一种可能靠谱的推荐是直接从关注关系出发进行推荐。这种考虑的来源是:我关注的那些人都是我确实感兴趣的那些人,他们可能会拥有一些共同的关注对象,而这些对象是我还没有关注的,这要么是因为懒,要么是因为没有意识到。于是我画了这样的图:
![](https://pic.jg.com.cn/img/pinggu/17fb325783687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731365f375f6c69742e706e677897f660db.jpg)
在这个图里面标出了一些用户,横轴表示我关注的人当中有多少人正在关注这个用户,纵轴表示这个用户本身的粉丝数量。横轴这个数值越大,说明我关注的人当中有很大一部分正在关注这个用户,例如李开复老师,于是我就很可能对李开复老师是感兴趣的。之所以要考虑纵轴(用户本身的粉丝数量),是因为有一些用户的粉丝本身就很多,例如潘石屹等人,他们是某种明星人物,因此我关注的人当中有很多都关注这个用户,是一种很正常的追星现象,未必能够很好地体现这种关注兴趣的集中性与传递性。基于这种考虑,我设置了一个明星阈值:粉丝数量大于10000的,认为是某种明星,暂时不考虑作为推荐(或许可以在某种topN的推荐中出现)。这样处理的结果是:
![](https://pic.jg.com.cn/img/pinggu/aa63f35220687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731365f385f6c69742e706e6768e7df8d77.jpg)
可以看出来,这种做法的本质是把原图的左下角放大了。
另一种策略是将上面原图的横轴和纵轴数据做整合,用横轴除以纵轴,构造一个比例:我关注的人在他全部粉丝中的占比。可以很直观地理解,如果一个用户的粉丝本身就不多,而其中就有好多是我所关注的人,那么这个用户很可能也是我会感兴趣的用户。
![](https://pic.jg.com.cn/img/pinggu/abd436bc3a687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731365f395f6c69742e706e6732868855e3.jpg)
这个图做得有点粗糙,其实横轴可以把”来自我关注的人“加进去,但似乎也不很影响结果的直观性,就懒得重新画了。
还有一种比较类似的思路:已关注我 & 我未关注 & 我关注的人当中有人已关注他。于是
![](https://pic.jg.com.cn/img/pinggu/582546636c687474703a2f2f7777772e69746f6e676a692e636e2f75706c6f6164732f616c6c696d672f3132303330382f315f3132303330383030353731365f31305f6c69742e706e67ff7c8a5d81.jpg)
基本就是这样,这是我对微博分析的一些初步尝试,应该会继续学习下去。
資料來源: Internet