新浪微博文本分析初探

标签: 数据挖掘与机器学习 统计软件 | 发表时间:2013-01-13 13:58 | 作者:郝智恒
出处:http://cos.name

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

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

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

require(Rweibo)
registerApp(app_name="SNA3","********","****************")
roauth<-createOAuth(app_name="SNA3",access_name="rweibo")
res<-web.search.content("泰囧",page=50,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,deceasing=T)
v[1:100]
head(v)
d=data.frame(word=names(v),freq=v)

完成分词之后,我们最先想到的,便是对词频进行统计。词频排名前53的词列表如下(这个词频是我人工清理过的,但是只删除了一些符号):

泰囧 1174         一代宗师 87         时候 53          生活 44          娱乐 35          成功 30
电影 385           看过 70                影片 52          文化 43          但是 33      王宝强 30
票房 306          上映 68                 今天 51          影院 43          分享 33
囧 275              泰国 68                喜剧 51          炮轰 40          发现 32
笑 192              感觉 62                导演 49          电影院 38       故事 32
俗 188              观众 61                好看 49          排 38              光线 32
十二生肖 123   可以 60                喜欢 49           哈哈 37          国民 32
什么 104          大家 59                上海 48           兽 37              时间 32
中国 102          教授 56                现在 48           水平 37          哈哈哈 31
徐峥 90            11亿 54                搞笑 47           需要 35         逼 30
从中我们可以看出一些东西。比如说这部电影的口碑似乎还不错,此外某教授对其的炮轰也引发了不少得讨论。另外,同档期的另外两部电影(一代宗师,十二生肖)也经常和它同时被提及(这是否会对某些搞传播和营销的人带来一些启发,联动效应之类的,纯数个人瞎说)。 词云展示是不可少的,展示频率最高的150个词(这里我实现把分词的结果存放在了txt文件中,主要目的是为了节省内存):

require(wordcloud)
d<-read.table("wordseg.txt")
dd<-tail(d,150)
op<-par(bg="lightyellow")
#grayLevels<-gray((dd$freq)/(max(dd$freq)+140))
#wordcloud(dd$word,dd$freq,colors=grayLevels)
rainbowLevels<-rainbow((dd$freq)/(max(dd$freq)-10))
wordcloud(dd$word,dd$freq,col=rainbow(length(d$freq)))
par(op)

泰囧

 

 

下面做一些相对来说比较专业的文本挖掘的工作。主要目的是对这998条微博进行聚类。聚类里最核心的概念是距离。将距离比较靠近的数据聚为一类就是聚类。对于文本来说,如何定义距离呢?也就是说我如何来衡量微博与微博之间的距离。这涉及到了文本挖掘最基本的概念,通过建立语料库,词频-文档矩阵,来衡量文档之间的相关性,从而衡量文档之间的距离之类的。 详情请参看刘思喆大哥R语言环境下的文本挖掘。下面使用PAM算法,对998条微博进行聚类。看看能不能得出一些什么有意思的结果。

PAM算法全称是Partitioning Around Medoids算法。中文翻译为围绕中心点的划分算法。该算法是基于相异矩阵的(dissimilarity matrix)。也就是说,这个算法对于样本的距离度量是基于相异矩阵的。而不是基于通常使用的距离。因此,这个算法相对来说比较稳健(比起kmeans)。该算法首先计算出k个medoid,medoid的定义有点绕口。基本上的想法就是它和同一聚类中的其他对象的相异性是最小的。也就是说,同一个聚类的对象都是围绕着medoid的。和它的平均相异程度最小。找到这些medoid之后,再将其他样本点按照与medoid的相似性进行分配。从而完成聚类。R语言中的fpc包实现了这种算法,并且给出了非常有意思的聚类图。

首先,载入tm包,建立语料库,建立词频矩阵:

require(tm)
#先生成一个语料库,来清理一下微博的文本
weiboCorpus<-Corpus(VectorSource(res))
#删除标点符号
weiboCorpus<-tm_map(weiboCorpus,removePunctuation)
#删除数字
weiboCorpus<-tm_map(weiboCorpus,removeNumbers)
#删除URL,使用了一点正则表达式
removeURL<-function(x) gsub("http[[:alnum:]]*","",x)
weiboCorpus<-tm_map(weiboCorpus,removeURL)
#再次分词
weiboData<-as.data.frame(weiboCorpus)
weiboData<-t(weiboData)
weiboData<-as.data.frame(weiboData)
#head(weiboData)
insertWords(c("泰囧","十二生肖","一代宗师","黄渤","人在囧途","人再囧途","三俗"))
weiboData$segWord<-segmentCN(as.matrix(weiboData)[,1])
head(weiboData)
#形成了一个data.frame--weiboData,第一个变量为微博内容本身,第二个变量为分词的结果

#再次形成一个语料库,用来做更进一步的分析
weiboCorpusForAnys #生成文档-词条矩阵
weiboTDMatrix<-TermDocumentMatrix(weiboCorpusForAnys,control=list(wordLengths=c(1,Inf)))

#对微博进行聚类
MatrixWeiboForCluster<-t(MatrixForCluster)
k<-3
kmeansRes<-kmeans(MatrixWeiboForCluster,k)

require(fpc)
pamRes<-pamk(MatrixWeiboForCluster,metric="manhattan")
k<-pamRes$nc
k
pamResult<-pamRes$pamobject

layout(matrix(c(1,2),2,1))
plot(pamResult,color=F,labels=4,lines=0,cex=0.8,col.clus=1,col.p=pamResult$clustering)
layout(matrix(1))

pamRes

结果我们将微博分成了两类:

泰囧微博聚类

 

当然了,从这个图,你很难看出点什么有益的信息,就是图个好看。我们不妨来看看被分成两类的微博都分别说了些什么。具体看到过程和解读因人而异,这里也没什么代码要列出来。我只说一些我看到的,不保证是对的。

两个聚类中的微博讨论的问题不同,第一类讨论的是看了泰囧的心情,比如开心,高兴抑或难过之类的。比如:

“哈哈哈二到無窮大.大半夜的我這二逼在家看泰囧.笑到爸爸起床罵我..不好意思咧.實在沒忍住”

“时间滴答滴答的走我知道我在想着一个人看泰囧片头的时候熟悉的名字我一下子愣住了我想我是在乎了这样的夜里我难过”

“大半夜睡不着觉一个人在家看盗版泰囧突然觉得很凄惨”

“我们一起吃牛排一起坐轮渡一起看金门一起去乐园一起吃牛排一起看大海一起坐公交一起啃鸡爪一起过圣诞一起看泰囧一起去鼓浪屿一起打的绕厦门岛一起在酒店吃早餐一起在一张大床上睡觉一起吃烤鱼一起在大排档吃肉一起在KFC买了对辣翅一起爬鼓山一起抱着对方说我爱你”

这一类微博本身不够成对电影的评价,电影是这些博主生活的一部分,或悲或喜,电影只是陪衬。

第二类微博,则集中于对电影的评价,褒贬不一,比如:

“搜索一代宗师发现十个里面九个说不好看上回的泰囧微博上都是说怎么怎么好笑结果去影院一看大失所望还没有赵本山演的落叶归根幽默和寓意深远纯属快餐式电影其实好的事物往往具有很大的争议性就比如John.Cage.的有的人觉得纯属扯淡有的人却如获至宝我想王家卫的电影也是如此”

“应该看第一部人在囧途比泰囧好看太多了第一部我从头看到尾很有意思第二部看分钟掐断沉闷没什么笑点”

“泰囧实在好看极了又搞笑又感动让我哭笑不得真心推荐晚安啦.我在”

“发表了博文.影评人再囧途之泰囧..首映没有赶上好多朋友强烈向我推荐推荐理由很具有唯一性笑到我抽搐.笑成了这部电影唯一的标签但是这已经足够了.在好莱坞大片冲击欧洲小资”

从我的解读来看,微博大致分为这两类,如果进一步分析,也可以将发微博的人分成两类。一类可能相对感性,单纯,生活中的高兴或者快乐,会表现在微博中。电影只是作为引发他们情绪的一件事儿被提及。而另一类人,相对比较理性,喜欢评论,喜欢写博客写影评之类。电影在他们的心中,是被评价的对象。当然,这两类人或者两类微博会有很多部分是重叠交替的。这是非常正常的现象,就像人也有理性和感性的两个面。

结语:本文仅仅是对微博数据的初步探索。感谢lijian大哥的两个包,我想,这两个包将改变微博数据分析的面貌。更多R语言爱好者将通过这两个包发挥他们的热情,来更多的挖掘微博中有价值的信息。另外,笔者从未深入研究过文本挖掘。望看官拍砖时手下留情。

相关 [新浪微博 文本分析] 推荐:

新浪微博文本分析初探

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

围攻新浪微博

- Jos - 望月的博客
在国内的门户微博中,新浪微博无疑是目前用户数量最多、媒体属性最强的,但是,最近,却连续看到一些互联网的知名人士高调宣布退出或者关闭新浪微博的博文,使用和不使用某个产品本就是个人的自由,但如此高调的宣布,并进行口诛笔伐,就值得关注了. 本文试图通过分析谷奥事件,宋石男和贾葭两位老师离开新浪微博的事件分析新浪微博的是与非.

新浪微博连接 2.3

- leeking001 - 我爱水煮鱼
新浪微博连接是我使用新浪微博 API 接口开发的一个 WordPress 插件,它的主要功能是能让用户使用新浪微博账号登陆 WordPress 博客,并且可以直接使用新浪微博的头像,同步博客日志到 WordPress 博客. 经过几天的测试,新浪微博连接插件升级到 2.3,主要修正:同步博客到新浪微博的问题,并且同步内容更为丰富,规则改为:【日志标题】+ 日志内容摘要 + 日志链接.

新浪微博n大傻

- suki - broom&#39;s blog
看不到follow的人之间的交互这类产品本身的问题就不提了,就说说用户行为的傻. 其中有些行为也是产品本身纵容的. 三天两头换id的,搞个巨长的id既占字数又让别人压根没法手动@的,带个公司前缀的,用流行语的. 完全没有网络时代id就是个人身份的概念,意识还停留在QQ时代,以为随便改昵称呢. 某些专门发垃圾小段子的帐号尤甚.

V5后的新浪微博

- - It Talks--上海魏武挥的博客
正是在这个内外交困的时刻,新浪微博展开了它的商业化之旅,前途如何,尚未可知. 近日新浪微博发布了它的第五个版本,称为“V5”,在这个版本中,一个很明显的变化是:它长的有点像Facebook,用户不仅可以设置较大的头像,也可以在顶部自定义一张大图. V5版本的一些细节做得很用心,无论是提示语,还是版式的细微之处.

新浪微博不是Twitter

- 马克叔叔 - 月光博客
  Twitter是互联网短信,新浪微博以微博客Twitter式弱关系切入,正在转型SNS. 转型的挑战在于:1.如何融合弱关系和强关系. 2.如何用弱关系倒逼中国社会的强关系和潜关系.   国内有一些Twitter的拥趸,认为微博抄Twitter都抄不到点子上.   “Twitter 是四两拨千斤的艺术.

小心授权你的新浪微博

- Ehaagwlke - 心弦 | blog
新浪微博上的“随手拍解救大龄女青年”出来有一段时间了,粉丝为数众多,也有了一定的社会影响力. 开始的时候我觉得这是挺好的一件事儿. 这个微博的主人不仅在微博上热心公益事业,还特意做了一个网站,把所有想要被“解救”的姑娘的信息汇总,让大家可以按照各种条件查找,然后查看她们的详细资料. 可是后来我无意中发现一个问题:这个网站在竭尽全力地获得其访问者的新浪微博账户的授权.

PADMAG@新浪微博 近期精选(070311)

- 璎珞天色 - PADMAG视觉杂志
【摄影】70个闪电出现在同一张照片,拍摄于希腊Ikaria岛,来自摄影师Chris Kotsiopoulos,官方网站:http://t.cn/aNItNg. PADMAG的新浪微博:http://weibo.com/padmag,点击阅读全文可见更多内容. 【产品设计】iDroplets是一款用于iPad的透明脚贴,保护iPad与桌面接触时不至于划伤,一组售价5美元,全球包邮,官网:http://t.cn/hBCZjU ,看起来会像一颗水珠.

新浪微博屏蔽“长江”

- David - Solidot
新浪微博迎来了荒诞的一天:《华尔街日报》发现无法在上面搜索长江或扬子江. 新浪微博会返回“根据相关法律法规和政策,搜索结果未予显示”. 凡是与“江”有关的关键词都被屏蔽,如江西,江东,江北,浙江. 除此之外新浪还屏蔽了大量的其它关键词.

新浪微博的XSS攻击

- 铭文 - 酷壳 - CoolShell.cn
今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件. 大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等微博和私信,并自动关注一位名为hellosamy的用户.