新浪微博如火如荼,基于微博的各种应用也层出不穷。

有一种共识似乎是:微博数据蕴含着丰富的信息,加以适当的挖掘。可以实现众多商业应用。恰好社会网络分析也是我之前有所了解并持续学习的一个领域,因此我做了微博数据分析方面的一些尝试。这些尝试是比較初步的,属于探索性的阶段,当然不能跟微博分析家这样比較成熟的应用相提并论。而且我的分析基本上都出于想当然的直觉感受,没有详细的理论支撑。这方面须要试着找点书籍来阅读一下,貌似有蛮多可以參考的。

一、用R登录并公布微博

之所以仍然选择用R来做这个登录和公布的工作。是考虑到分析过程的连续性。毕竟可以在同一个平台以下完毕全部的工作,还是非常令人身心愉悦的。这里借助了一款命令行浏览器cURL,这个浏览器在R中可以用RCurl实现,简单的介绍建议參考medo的《R不务正业之RCurl》。因为我对HTTP这些东西都属于0基础未入门水平,没能实现直接的登录,仅仅好利用了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的推荐中出现)。这样处理的结果是:

能够看出来,这样的做法的本质是把原图的左下角放大了。
 
还有一种策略是将上面原图的横轴和纵轴数据做整合。用横轴除以纵轴,构造一个比例:我关注的人在他所有粉丝中的占比。能够非常直观地理解,假设一个用户的粉丝本身就不多。而当中就有好多是我所关注的人,那么这个用户非常可能也是我会感兴趣的用户。

这个图做得有点粗糙。事实上横轴能够把”来自我关注的人“加进去,但似乎也不非常影响结果的直观性,就懒得又一次画了。
 
另一种比較类似的思路:已关注我 & 我未关注 & 我关注的人其中有人已关注他。于是

基本就是这样,这是我对微博分析的一些初步尝试,应该会继续学习下去。

二、採集关注信息,制作粉丝及关注人的地区分布
在登录之后,就能够用一些循环语句来採集关注者与被关注者的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的推荐中出现)。这样处理的结果是:

能够看出来,这样的做法的本质是把原图的左下角放大了。
 
还有一种策略是将上面原图的横轴和纵轴数据做整合,用横轴除以纵轴。构造一个比例:我关注的人在他所有粉丝中的占比。能够非常直观地理解。假设一个用户的粉丝本身就不多,而当中就有好多是我所关注的人,那么这个用户非常可能也是我会感兴趣的用户。

这个图做得有点粗糙,事实上横轴能够把”来自我关注的人“加进去,但似乎也不非常影响结果的直观性。就懒得又一次画了。
 
另一种比較类似的思路:已关注我 & 我未关注 & 我关注的人其中有人已关注他。于是

基本就是这样,这是我对微博分析的一些初步尝试。应该会继续学习下去。

用R进行微博分析的初步尝试的更多相关文章

  1. Python爬虫学习:二、爬虫的初步尝试

    我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...

  2. R语言︱情感分析—词典型代码实践(最基础)(一)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...

  3. 使用R进行相关性分析

    基于R进行相关性分析 一.相关性矩阵计算: [1] 加载数据: >data = read.csv("231-6057_2016-04-05-ZX_WD_2.csv",head ...

  4. 用R进行文本分析初探——以《红楼梦》为例

    一.写在前面的话~ 刚吃饭的时候同学问我,你为什么要用R做文本分析,你不是应该用R建模么,在我和她解释了一会儿后,她嘱咐我好好写这篇博文,嗯为了娟儿同学,细细说一会儿文本分析. 文本数据挖掘(Text ...

  5. R语言︱情感分析—基于监督算法R语言实现(二)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:本文大多内容来自未出版的<数据 ...

  6. 基于R进行相关性分析--转载

    https://www.cnblogs.com/fanling999/p/5857122.html 一.相关性矩阵计算: [1] 加载数据: >data = read.csv("231 ...

  7. 【阿里云产品公测】性能测试服务PTS的初步尝试

        性能测试服务PTS,对于像我这样对测试毫无概念的新手来说,这服务真的太好了,使用简单,官方教程又明细,连我这样的新手一看都明白了怎样使用. _%GGl$kH   下面是我来简单尝试一下,更多功 ...

  8. Ruby 定时任务之一(初步尝试)

    最近工作需要用到定时任务.原来写java的时候也用到过类似的Scheduler的功能. Ruby语言中也有同样功能的工具.rufus-scheduler.下面介绍一下rufus-scheduler. ...

  9. 学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型

    Conference业务简介 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的用户有两类: 1:客户,可以创建和管理会议. 2:会议座位预定者,可以预订会 ...

随机推荐

  1. fedora配置ip

    fedora20配置静态ip 原创 2015年08月08日 14:36:01 标签: fedora / linux / 网络配置 / ip配置 / 网络设置 2403 在linux的世界里,给主机设置 ...

  2. CAD使用GetAllAppName读所有名称(com接口)

    主要用到函数说明: MxDrawEntity::GetAllAppName 得到所有扩展数据名称,详细说明如下: 参数 说明 [out, retval] IMxDrawResbuf** ppRet 返 ...

  3. C#readonly 关键字与 const 关键字的区别

    1. const 字段只能在该字段的声明中初始化,readonly 字段可以在声明或构造函数中初始化.因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 2. const 字段是编译 ...

  4. c++ 回调的实现

    什么是回调?通常发生在需要两个角色即调用者与实现者的情形上,即我们希望当产生某个事件时,调用实现者定义的某个函数.当然这个概念很大,不是说操作系统的信号量,条件变量什么的,是在语言级别实现,如一个Fr ...

  5. BZOJ 4519 不同的最小割 最小割树

    题面: 把每两个点当成源汇,求N*(N-1)个最小割中不同的有多少个 N<=850 分析: 有这样一个结论:一张无向图不同的最小割最多有n-1个. 那么我们一定可以建出一棵树,使得这棵树中每两个 ...

  6. vim使用学习

    1.1在正常模式下,使用h,j,k,l实现左,下,上,右移动. (如果不再正常模式下,使用Esc键进入正常模式) 1.2退出vim,先进入到正常模式,输入:q!退出,但不保存任何修改. 1.3在正常模 ...

  7. linux文件及目录的权限管理

    一.文件的权限 1.文件权限的查看 命令:ls -l 可以使用ll命令代替 ls -l 2.ls -l 所包含的信息 (1)权限信息 (-rw-r--r-- ) 一共有10位 a.第一位:表示文件信息 ...

  8. CODE【VS】3160 最长公共子串 (后缀自动机)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  9. codeforces 407 div1 A题(Functions again)

    codeforces 407 div1 A题(Functions again) Something happened in Uzhlyandia again... There are riots on ...

  10. 【04】AJAX接收服务器返回的数据

    AJAX接收服务器返回的数据 readyState 和 status 属性 readyState 属性保存有 XMLHttpRequest 对象的交互状态,从 0 到 4 变化: 0 :未初始化(还没 ...