自从换了新装备以来就对Rweibo和Rwordseg两大利器垂涎不已,原来的2G小破机(我不是嫌弃它啊……)不是这儿报错就是那儿不行,不过应了颠扑不破的真理,硬件才是硬道理啊!!
我还是不说废话了,其实我也只是试了一下皮毛而已,真要深入进去的话,要学的还有很多。关于Rweibo和Rwordseg,都在lijian大哥的blog上有详细记载:Rweibo Rwordseg,总的来说,感觉Rweibo获取微博数据要比RCurl要先进很多,虽然有很多权限的限制,但数据已经结构化了很多;而中文分词着实是个难点,Rwordseg主要基于中科院的 ictclas 中文分词算法,核心是HMM的模型(coursera的课上有讲过HMM,不过细节的论文我也木有看……),安装前需要配置虚拟机环境(具体步骤在lijian大哥的pdf中有详述)。
安装好之后,就可以使用啦,首先你要注册你的app并授权:
library(Rweibo)<br />
registerApp(app_name = "pudding", "key", "Secret")<br />
listApp("pudding")<br />
roauth <- createOAuth(app_name ="pudding", access_name = "rweibo")
然后抽取我最近发的200条围脖:</p>
res1 <- statuses.user_timeline(roauth,screen_name="布丁Nnn", count = 200)
由于本人经常用微博偷窥别人的生活百态(勿拍砖><),所以我个人的“原创”微博几乎寥寥无几。但是要做文本分析的话,这点语料实在少的可怜;何况人人上有个大神说,要了解一个人,请看他的分享- -|||</p>
所以我把我的微博内容和转发内容都纳入了俺的微博文本。当然经常刷微博的各位可能知道当你转发的时候前面已经有了一个队列的转发,这些人转发的同时也可能插上两脚吐槽几句(当然也有群众是默默无闻的,但是一般情况是前面的吐槽者恰好就是吐露你心声的神最右!),所以,我也很不厚道的也盗窃了之前几位的神评论。
以下这两句用来抽取微博内容和转发内容:
text=unlist(lapply(res1,function(xl) xl$text))<br />
retweet_text=unlist(lapply(res1,function(xl) xl$retweeted_status$text))
接下来用strsplit对微博内容作切分。虽然我想盗用之前神评论,但是十分不好意思我不能保存各位原创大侠的大名(这对俺的文本会有干扰作用所以……只能不好意思了),可以用正则表达式的方法偷天换日。代码如下:</p>
text_split=unlist(lapply(text,strsplit,split="//@",perl=T))<br />
ll=lapply(text_split,gregexpr,pattern=":",perl=T)<br />
omit=unlist(lapply(ll,function(xl) xl[[1]][1]))<br />
ind=which(omit>0)<br />
tmp=text_split[ind]<br />
text_split[ind]=substr(tmp,omit[ind]+1,max(nchar(tmp))+1)
然后,就可以用Rwordseg来做分词了。Rwordseg支持导入搜狗细胞词库,可以把常用的细胞词库保存并导入(细胞词库可以在搜狗输入法的主页上下载)。我这里导入的词库包括:数学、统计、机器学习三个词库(只需导入一次,下次重启R生效)。</p>
library(Rwordseg)<br />
installDict("E:/R learning/weibo/machine_learning.scel", dictname = "machine_learning.scel",<br />
dicttype = c("scel"))<br />
installDict("E:/R learning/weibo/stat.scel", dictname = "stat.scel",<br />
dicttype = c("scel"))<br />
installDict("E:/R learning/weibo/math.scel", dictname = "math.scel",<br />
dicttype = c("scel"))<br />
alltext=c(text_split,retweet_text)<br />
res=unlist(segmentCN(alltext))<br />
res=res[res!=""]
然后就是去噪音。其实我去噪音的方法比较初级,考虑到汉语的词汇组成形式,我提取了长度大于1的汉语分词结果;当然你也知道语言里不可避免的会出现“的”“啊”这一类的词,实际上他们没有实际含义但出现频率较高,一般把它们叫做
停词。可以从这里下载到汉语停词库:
汉语停词
以上处理过程如下:</p>
res=res[nchar(res)>1]<br />
word_f=table(res)<br />
word=names(word_f)</p>
<p>stopwords=readLines("CH_stopwords.txt")<br />
stopwords=c(stopwords,"http","cn","www")<br />
word=setdiff(word,stopwords)<br />
word_f=word_f[word]
最后就是画词云啦,wordcloud包是您居家旅行必备神器:</p>
library(wordcloud)<br />
wordcloud(word, word_f, random.order=FALSE, colors=brewer.pal(8, "Dark2"))
最后就是这个样儿的:
</p>
最后还有个问题,我在用Rweibo的时候发现似乎对于有一些中文的昵称直接检索会报错……不知道是bug没有修复还是我的问题,多多指教~