标签归档:微博

微博名人那些事儿(二)

如何评价一个名人的热度?自然而然能想到的方法是,通过粉丝/关注比来评判其“风云”程度(好吧如果不考虑僵尸粉这种特色产物……><)。但实际上,在social network里面,我们真正面临的,是一个“网络”结构。让我们想想,消息在SNS里是怎么传播的呢?关注、粉丝、转发、评论 blablabla……所以,最近我在想,能不能利用这些关系来评判一个人的影响力?

首先面临的问题是,应该用什么样的行为表示人与人之间的关系呢?鉴于想对用户兴趣做一些扩展的探索,我首选了“转发”关系。而且,退一步讲,在新浪在7月2号对API做了调整限制后,关注关系及粉丝关系等就不是我们这种ds小市民那么容易得到的了。(实际上即使能够得到,我个人也认为转发关系是在信息传播力上极为重要的一环)

继续阅读微博名人那些事儿(二)

微博名人那些事儿

微博,这一新生代大规模杀伤性社交武器近年来迅速在国内走红,其来势之汹,范围之广,威力之猛当不可小觑。通过它,我们不仅能第一时间八卦到身边柴米油盐、鸡毛蒜皮的小事儿,而诸如家国天下、业内前沿的大事记也难以逃过公众的法眼。

这样迅捷高效的信息传播是怎样做到的呢?相信每一个微博控都能如数家珍的道出自己心仪的几位微博名人们,不妨就从那些微博名人们入手,看看这些名人们身边的故事。

1、信息采集

信息采集,说白了就是数据爬取。还好,这些名人们可是早就榜上有名了,可以用XML包的readHTMLTable函数爬下来风云榜上来自体育、财经、传媒、科技 and so on的风云人物的微博信息,存为数据集。

以sports数据集为例,代码如下:

library(XML)
# get data from web
webpage <-'http://data.weibo.com/top/influence/famous?class=29&type=day'
tables <- readHTMLTable(webpage,stringsAsFactors = FALSE)
sports=tables[[1]][,c(1,2,3,6)]
names(sports)=c("rank","name","influence","description")

这样,我们就获取了这些名人们的微博大名。
继续阅读微博名人那些事儿

粉丝地图的可视化

Rweibo问世以来,我就对它的可视化感到兴趣盎然。通过它我们可以得到微博关注者的各项信息,其中比较有意思的一项是地点(location),这也就意味着,通过关注者的location(省市),可以找到他们的地理分布信息,同时,又可以得到他们的粉丝数目信息(可以判断是否是“微博名人”)。所以,既然万事俱备,为什么不用它做个“粉丝地图”来展示个人的粉丝信息呢?通过如下五步,我便基本得到了我想要的效果。

  1. 收集关注者的信息,整理地点信息;
  2. 获取并整理经纬度信息;
  3. 结合Himsic与ggmap包绘制图形;
  4. 结合animation包绘制动态图形。

1. 收集关注者的信息,整理location信息

首先,收集关注者的信息,并进行整理,我的做法是去除在“海外”,或者所在地为“其他”的人群(如果市的信息为“其他”而省份不为“其他”,令它与省份相同)。整理工作的代码如下:

roauth < - createOAuth(app_name = "pudding", access_name = "rweibo")
my_fri <- friendships.friends(roauth, uid = 2530951134, count = 200, cursor = 0)
save(my_fri, file = "my_fri.rda")
fri = my_fri[[1]]
info1=lapply(fri,function(x) c(x$name,x$location,x$followers_count))
info=do.call(rbind,info1)
loc=strsplit(info[,2]," ")
a=do.call(rbind,loc)
a[,1][a[,1]=="台湾"]="台"
a[,2][a[,2]=="台湾"]="台"
a[,2][a[,2]=="其他"]=a[,1][a[,2]=="其他"]
 
myfri=data.frame(name=info[,1],province=a[,1],city=a[,2],loc=apply(a,1,paste,collapse=" ")
 ,follower=as.numeric(info[,3]))
myfri=myfri[which(myfri$province!="其他"&myfri$province!="海外"),]

2. 获取并整理经纬度信息

不过,有了地理位置的名称是不够的,我们必须知道他们的经纬度信息,这一部分信息可以通过网页抓取而得:

library(XML)
# get data from web
webpage < - "http://blog.csdn.net/svrsimon/article/details/8255051"
tables <- readHTMLTable(webpage, stringsAsFactors = FALSE)
raw <- tables[[1]]
zh_posi <- raw[-1, ]
colnames(zh_posi) = c("province", "city", "county", "lon", "lat")
save(zh_posi, file = "zh_posi.rda")
zh_posi$loc = apply(zh_posi[, 1:3], 1, paste, collapse = " ")
zh_posi[, 4:5] = apply(zh_posi[, 4:5], 2, as.numeric)

get.loc <- function(loc) {
    pro = grepl(loc[1], zh_posi$loc)
    cit = grepl(loc[2], zh_posi$loc)
    match = which(pro & cit)
    show(match)
    return(c(mean(zh_posi$lon[match]), mean(zh_posi$lat[match])))
}

b = apply(myfri[, 2:3], 1, get.loc)
myfri$lon = b[1, ]
myfri$lat = b[2, ]

鉴于关注人数在某些地区过于集中,此处只取在这些地区的均值表示:

library(sqldf)
myfri2 = sqldf("select province,city, avg(lon) as m_lon,avg(lat) as m_lat, avg(follower) as m_fol from myfri group by province,city")
Encoding(myfri2$province) = "UTF-8"
Encoding(myfri2$city) = "UTF-8"

继续阅读粉丝地图的可视化

新浪微博文本分析初探v0.1

v0.1版本说明:本文发在主站上之后,站友们经常评论代码跑着有问题。经过和lijian大哥等人进行咨询,自己也摸索了一些之后,发现了之前代码非常多的漏洞。因此,给广大站友带来了困扰。在这里我表示万分的抱歉。最近邮箱中收到让我整理代码的需求越来越多。我也非常想整理下,但是由于工作也非常繁忙,所以很难抽出时间。前两天说5.1期间会整理一下代码发出来。但是事实上因为5.1小长假期间我可能无法上网,导致无力更新代码。所以今晚抽时间对代码进行了简单的修改。对本文也进行了一些调整。目前的状况是,基本上到生成待分析的语料库已经没有问题了。聚类分析的模型可以跑出来,但是最终的图画不出来。我暂时也没能找到原因。所以进一步的调整可能要等到5.1过完以后再抽时间来做了。这篇文章我会负责到底的哈。(20130429)

完整代码如下:weibo_analysis

—————————–分割线————————————————-

自从lijian大哥的Rweibo包问世以来,便成了R爱好者们获取新浪微博数据的最为重要的工具。在该包的中文主页上,作者对如何连接新浪微博的API,获取授权,并以此为基础开发应用的原理讲解的非常清楚。对于我这种连基本的网页开发神马原理都一点也不清楚的菜鸟来说,Rweibo是一种非常趁手的获取微博数据的工具。

有了获取数据的工具,对于中文文本分析来说,最重要的是分词。这里使用的分词算法来自中科院 ictclas算法。依然是沾了lijian大哥Rwordseg的光,直接拿来用了。

有了这两样利器,我们便可以来分析一下新浪微博的数据了。我选取的话题是最近热映的国产喜剧电影《泰囧》,在微博上拿到了998条和“泰囧”有关的微博文本。代码如下(以下代码不能直接执行,请首先阅读链接中Rweibo的关于授权帮助文档):

#关键词搜索并不需要注册API
require(Rweibo)
#registerApp(app_name = "SNA3", "********", "****************")
#roauth <- createOAuth(app_name = "SNA3", access_name = "rweibo")
res <- web.search.content("泰囧", page = 10, sleepmean = 10,
           sleepsd = 1)$Weibo

获取了数据之后,首先迫不及待对微博文本进行分词。代码如下(Rwordseg包可以在语料库中自助加入新词,比如下面的insertWords语句):

require(Rwordseg)
insertWords("泰囧")
n = length(res[, 1])
res = res[res!=" "]
words = unlist(lapply(X = res, FUN = segmentCN))
word = lapply(X = words, FUN = strsplit, " ")
v = table(unlist(word))
v = sort(v, decreasing = T)
v[1:100]
head(v)
d = data.frame(word = names(v), freq = v)

继续阅读新浪微博文本分析初探v0.1

用R来给微博添把火

近两年来微博这东西越来越火了,已经逐渐成了最主流的网络舆论平台。对于最近的网络热点问题大家一定是深有体会,作为统计门人,肯定很多人技痒不已,希望能进一步地探究很多事情背后的秘密……

好在几个主流的微博平台都提供了API,各种语言的SDK应运而生,而真正的分析利器R的SDK一直没有,这里不卖关子了,直接发布一个R的SDK,参见:Rweibo中文主页

本项目在R-Forge上开发(https://r-forge.r-project.org/projects/rweibo/),最新的信息发布在Rweibo中文主页上。目前的版本全部基于新浪微博,毕竟是现在最火的微博,其实几个微博的API平台大同小异,和twitter的也类似,都来自于同样的开源平台,略作改动也能支持腾讯微博等。本文就只拿新浪微博举例。

CRAN上有一个twitteR包,之前普通权限还可以用的时候有些接口可以和新浪的API通用,新浪废掉普通权限只留OAuth之后,我就放弃了twitteR,开始开发Rweibo(当前版本的twitteR已经可以支持OAuth,不过很多接口的细节和新浪微博还是不一样)。

在这里,我先介绍一下授权机制以及OAuth,这个搞定后整个微博的API就仅仅只是传一下参数调用GET和POST方法而已。最早的微博开放平台的授权方式是普通授权,通过HTTP的头信息来传递用户的信息,这种方式不是很安全,在非HTTPS的情况下密码可能会被窃听,对于开发者和使用者来说都是比较危险的。后来新浪就直接停用了这种方式,采用目前流行的OAuth。

OAuth看上去很玄乎,其实道理非常简单。拿微博开放平台来说,开发者希望能开发一个应用,让不同的用户使用,每个用户都有自己的微博帐号信息,他们不希望在使用的过程中被开发者知道,同时开发者的这个应用的帐号密码也不希望被别的用户知道,不然就会被同行拿去乱来。这样一来,就需要一种授权机制,能够使得开发者和用户都信得过,就好象在淘宝买东西一样,买家和卖家都基于一个可信的第三方平台。对于新浪微博来说,双方都信任新浪,只要能确认所处的网站是真的新浪微博,就不会有问题。先是开发者将自己的App Key和App Secret发送到一个请求地址,新浪微博验证无误后,返回请求的Token,其实相当于是加密过的开发者信息,将这个信息发送到授权地址,可以完成用户的授权。用户在授权的页面可以输入自己的微博帐号,这些信息只有新浪知道,然后会返回一个验证码,用户输入这个验证码之后进行再次确认。开发者将之前自己的Token信息以及用户的这个验证码一起发送到一个访问地址,经过确认后,新浪微博觉得双方都是可信的,而且彼此也都不知道对方的信息,就会返回一个访问的Token以及密码,这就好比是一把钥匙,开发者只要存着这把钥匙,下次如果再对该用户做某些操作时就不需要再征求他的同意了,除非用户主动废除这把钥匙。以上的过程就是OAuth授权的过程。

我最开始是利用JAVA版本的OAuth库,通过rJava实现,后来CRAN上的ROAuth成熟之后又改用ROAuth,在twitte上使用没问题,在新浪微博上调用POST时会有问题,而且对于中文的POST,新浪的开放平台需要编码两次,因此需要对这个包进行改写。当前版本的Rweibo已经不再依赖于ROAuth,直接使用RCurl实现整个授权过程,但是仍然借鉴了大部分的ROAuth包的内容,在这里对作者表示感谢。

安装Rweibo可以参见Rweibo中文主页,里面有详细的介绍。使用时首先需要有一个微博帐号,点击“应用”,选定“微博开放平台”,在弹出页面选择“我是开发者”,然后创建一个普通应用,填好基本信息之后在应用的详情中填上相应的内容,就可以成功创建一个新的应用,将会得到一个App Key和App Secret,在Rweibo中使用registerApp函数,输入这两个信息以及该应用的名称(自己随便起个英文名字即可,不一定要与新浪应用的名字相同),就可以在R中注册该应用的信息。

利用createOAuth函数可以创建一个OAuth对象,如果是第一次使用,将会自动进行授权。比方说我注册了一个应用叫做test,我需要授权给我的微博帐号lijiao001或者我的马甲Rweibo,那么将会在R的界面中完成一个授权的交互过程,如果我用lijianoo1的帐号来操作,那么授权成功后,就可以调用各类函数读取这个帐号的信息或者用该帐号来发微博。一个简单的操作过程如下所示:

registerApp("GDdmIQH6jh", "MCD8BKwGdgPHv", app_name = "test")  # 在R中注册新的应用
roauth <- createOAuth("test", "lijian001")  # 创建OAuth对象
timeline.Friends(roauth, list(count = 5))  # 获取好友及自己的前5条最新微博
timeline.CommentsList(roauth, list(id = 14762313082))  # 获取某条微博的评论列表
timeline.Comments(roauth, list(count = 5))  # 获取自己发送及收到的评论
timeline.Repost(roauth, list(id = 14761105585, count = 5))  # 获取某ID微博的转发情况
timeline.Mentions(roauth, list(count = 5))  # [email protected]
timeline.User(roauth, list(screen_name = "rweibo", count = 5))  # 获取某用户的信息
access.update(roauth, list(status = "hello world"))  # 发一条微博
search.Content(roauth, list(q = "Rweibo"))  # 根据关键词搜索微博内容

目前版本的Rweibo实现了所有的timeline接口以及搜索、查询用户等接口,利用这些接口已经可以取到大部分能够用来分析的信息了。至于其他一些操作的接口,将会在后续的版本中实现。大家有什么建议也可以提给我,我将会在后续的版本中修改。

另外值得注意的是,我们申请的应用都是最低权限的,因为新浪目前对接口访问权限控制得比较严,只有成为合作开发者才能有很大的权限,而这些主要都是针对应用的需求而不是分析的需求。普通的权限一小时只能访问150次,其中发微博的操作只能在30次以内。对于一些操作,每次取出的信息条目也会有限制,20条到200条不等。没办法对某个关键词一次把所有的东西搜索出来或者将某条微博的转发信息一次抓取出来。但是这些难不倒我们,微博API是基于轮询的协议,两分钟左右取一次足矣,对于要分析的内容,我们完全可以设置一个任务,每隔两分钟取一下增量,时间一长就会得到我们想要的大量的数据了。

至于这些内容可以如何进行分析,就需要大家的聪明才智了。我最近想做的一件事情就是研究一下微博的转发规律。很多热点事件通常都会有几条转得极热的微博,如果能够得到转发的规律,就像传染病的规律一样,找到一些关键的节点,对于我们研究微博舆情是非常有用的。