搜索
查看: 2010|: 0

用R进行微博分析的初步尝试

[复制链接]

202

主题

6

回帖

885

积分

高级会员

积分
885
发表于 2014-5-24 03:35:15 | 显示全部楼层 |阅读模式
新浪微博如火如荼,基于微博的各种应用也层出不穷。有一种共识似乎是:微博数据蕴含着丰富的信息,加以适当的挖掘,能够实现众多商业应用。恰好社会网络分析也是我之前有所了解并持续学习的一个领域,因此我做了微博数据分析方面的一些尝试。这些尝试是比较初步的,属于探索性的阶段,当然不能跟微博分析家这样比较成熟的应用相提并论。并且我的分析基本上都出于想当然的直觉感受,没有具体的理论支撑,这方面需要试着找点书籍来阅读一下,貌似有蛮多可以参考的。      

一、用R登录并发布微博
之所以仍然选择用R来做这个登录和发布的工作,是考虑到分析过程的连续性,毕竟能够在同一个平台下面完成所有的工作,还是很令人身心愉悦的。这里借助了一款命令行浏览器cURL,这个浏览器在R中可以用RCurl实现,简单的介绍建议参考medo的《R不务正业之RCurl》。由于我对HTTP这些东西都属于初级未入门水平,没能实现直接的登录,只好利用了cookie实现间接登录。但是最终结果还是蛮稳定的。编写这个登录和发布微博的函数,目的之一是为后续的数据采集做准备,但同时也能够实现同步更新不同平台信息的功能,例如写一条语句就能够把人人状态、新浪微博、飞信签名等等同步更新,还是很有趣的。只是人人状态和飞信签名貌似不是很稳定,偶尔能用偶尔报错,我稍微测试了一下,可能是cookie的问题,目前没有深入探索。
(更新:目前已经实现了直接登录,这样或许可以绕过cookie的问题。)
总地来说这个功能的效果就是这个样子。
二、采集关注信息,制作粉丝及关注人的地区分布
在登录之后,就可以用一些循环语句来采集关注者与被关注者的ID等信息(不知道这算不算是某种爬虫)。为了描述地区分布,只需要采集用户的地区信息就OK了。然后借助maptools包,可以比较方便地画出简单的用户分布图。这里没办法画海外人士,见谅。
        
我的粉丝的分布:

        
我关注的人的分布:
        
可以看得出来,不论是关注还是被关注,用户的分布都算是比较集中。这个很可以理解,因为我是小网虫一只,没啥广泛的人气,哈哈。但是显然地,某省ID的频数很高,令人欣慰。

三、采集关注信息,制作关注关系的网络图
这个工作目前尚未完成,主要是遇到了技术性的障碍:矩阵太大,我的计算机算不动。事实上,采集数据的过程跟上述的地理位置的采集没有本质区别,都是一些循环的计算,最终得到的结果是这个样子:

前两列是我关注的用户以及他们的ID,后两列是前两列所关注的用户及ID。这个数据集目前有22446行,涉及到15868个用户ID,如果要画网络图,似乎对计算机的性能有比较高的要求。所以我只好暂时选择了一种无奈的办法:抽样。得到的结果大概是这样:

换一种抽样的逻辑,减少对象个数,可以做出相对清晰一点的网络。像是这样:

        
虽然作图遇到了一定的障碍,但是在做的过程中我还是有所体会:follow的信息比fans的信息更干净一点。因为我都是以我的ID为中心出发来进行数据的采集,所以本质上得到的网络都是个体网。而fans的关系往往不能说明什么问题,因为我的很多fans都是不知所云的fans。我揣测,这些fans,要么是所谓的僵尸ID,要么是所谓的广告ID,要么就是一些新用户随便添加的关注。这些关注关系并不是我所关心的关系,虽然他在某种程度上体现着我的某种中心度。因此我在后面把关心的重点集中在我的follow上,因为由我出发的这条follow关注链是比较纯粹的:要么是感兴趣的人,要么是有感情的人,总之都是具有确实意义的关注关系。
        
四、基于follow关系的一种用户推荐        
意识到follow关系的纯粹性之后,我就开始试图针对follow关系做一些分析。最先想到的就是用户的推荐。

我没有具体研究新浪微博目前使用的用户推荐的方式,感觉是有两种:根据个人资料推荐,根据个人标签推荐。

我的直观理解,推荐系统的一个逻辑问题是:用户会接受怎样的推荐。或者换句话说,用户是为什么而去关注他人的。因此我就觉得,基于个人资料的推荐可能并不是那么靠谱,尤其是新浪微博持续不断地向我推荐”浙江大学“的用户。且不说里面有很多是”浙江大学城市学院“之类的漏网之鱼,关键是我为什么仅仅因为他跟我同一所大学毕业就要去关注他呢?我觉得基本上没有道理。除非在大学的基础上还能够进行其他判断,精确地推断出他跟我可能是本科室友,那我就比较感谢新浪微博了哈哈。至于根据个人标签来进行推荐,我觉得对我来说相对还算靠谱,因为我主要还是根据兴趣爱好来进行关注的。但是仅仅根据个人的标签来做推荐,又有点单调与片面,我觉得加入”关注对象的标签“可能会更完善一点。这种考虑的来源是:我关注的那些人都是我确实感兴趣的那些人,他们可能会拥有一些类似的标签,而这些标签是我没有给自己加的,这要么是因为懒,要么是因为没有意识到。于是我采集了我follow的那些用户的个人标签,然后做了简单的频数统计,得到了下面的结果,这个结果基本上算是一目了然。
               
另外一种可能靠谱的推荐是直接从关注关系出发进行推荐。这种考虑的来源是:我关注的那些人都是我确实感兴趣的那些人,他们可能会拥有一些共同的关注对象,而这些对象是我还没有关注的,这要么是因为懒,要么是因为没有意识到。于是我画了这样的图:

在这个图里面标出了一些用户,横轴表示我关注的人当中有多少人正在关注这个用户,纵轴表示这个用户本身的粉丝数量。横轴这个数值越大,说明我关注的人当中有很大一部分正在关注这个用户,例如李开复老师,于是我就很可能对李开复老师是感兴趣的。之所以要考虑纵轴(用户本身的粉丝数量),是因为有一些用户的粉丝本身就很多,例如潘石屹等人,他们是某种明星人物,因此我关注的人当中有很多都关注这个用户,是一种很正常的追星现象,未必能够很好地体现这种关注兴趣的集中性与传递性。基于这种考虑,我设置了一个明星阈值:粉丝数量大于10000的,认为是某种明星,暂时不考虑作为推荐(或许可以在某种topN的推荐中出现)。这样处理的结果是:

        
可以看出来,这种做法的本质是把原图的左下角放大了。
        
另一种策略是将上面原图的横轴和纵轴数据做整合,用横轴除以纵轴,构造一个比例:我关注的人在他全部粉丝中的占比。可以很直观地理解,如果一个用户的粉丝本身就不多,而其中就有好多是我所关注的人,那么这个用户很可能也是我会感兴趣的用户。
         
        
这个图做得有点粗糙,其实横轴可以把”来自我关注的人“加进去,但似乎也不很影响结果的直观性,就懒得重新画了。
        
还有一种比较类似的思路:已关注我 & 我未关注 & 我关注的人当中有人已关注他。于是
        
基本就是这样,这是我对微博分析的一些初步尝试,应该会继续学习下去。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-12-22 02:24 , Processed in 0.111093 second(s), 29 queries .

快速回复 返回顶部 返回列表