ggplot2包实现可视化。

  话不多说,直接上思路及代码。


主要思路:

一般文本分词主要为4步:

  • 第一步:就是一些正则匹配去掉脏字符,符号,空格等;
  • 第二步:中文分词(R中可以使用Rwordseg包跟结巴分词包,网上自行百度,因为资源比较多,就不赘述了,直接说重点…)
  • 第三步:中文分词之后,一般会进行停用词过滤,如:的,地,其等停用词;
  • 第四步:这一步是最重要的一步,没有之一之二,就是你根据R分词之后的效果也自己构建高频无意义词库跟关键词词库,使得分词效果达到较好
      因为中文没有类似于英文那样天然的空格,所以会将一些很有意义的词给你乱分开,那么我们得找出来之后,自己建一个词库,在用Rwordseg包中的installdict()函数加载进R语言内存里,然后分词的时候你说定义的词就不分被乱分开了,那样才有意义。
      这一步是较为耗时的,但是文本后续的分析效果也基本取决于该步的分词效果。
      这是大致的文本分词步骤。那么假如你想做词云图的话,推荐一个包,强大的词云图wordcloud2包,请自行百度。

实现代码:

  下面我的分词结果是基于上面这些步骤完成之后得到的,效果不好的时候,请重复第四步调整自己的词库。
  因为我是要得到规定时间窗口内的分词结果,所以在数据处理的时候,按时间窗口来进行分词即可。

library(rJava)
library(Rwordseg)
installDict('对象及信息.txt',dictname='对象及信息')
###停用词词库
stopword<-unlist(read.table('中文停用词.txt',stringsAsFactors=F))
##################################################################
insertWords(c('不够','不喜勿喷'))
#####分词函数
textmine<-function(x){
  mydat<-x
  mydat.removeNumber<-gsub(pattern="[a-zA-Z\\r\\/\\.0-9\\$^\\&]+","",mydat)
  mydat.removeNumber<-gsub(pattern="\n","",mydat.removeNumber)
  mydat.removeNumber<-gsub(pattern="\r","",mydat.removeNumber)
  mydat.words<-gsub(pattern="","",mydat.removeNumber)
  #处理中
  segwords <-segmentCN(mydat.words)
  mydat.words<-lapply(segwords, function(x) setdiff(x,stopword)) #去停用词
  mydat.words<-lapply(mydat.words,function(x) x[nchar(x)>1]) #去长度为1的字符
  return(mydat.words)
}
###使用分词函数分词
neg.words<-textmine(neg.content$content)
###将分词用空格连接起来 保存下来(原因:一般因为分词比较消耗时间)
neg.result<-lapply(neg.words,function(x) paste(x,collapse=' '))
neg.result<-do.call(rbind,neg.result)
neg.data<-as.data.frame(cbind(neg.content$time,neg.result))
write.csv(neg.data,'neg.data.csv',row.names = F)

  上述代码都是比较常规的分词代码函数。

  这样的话,可以下次直接导入前次分词的结果进行后续分析,不用再次分词,可以节约很多时间。

###分词结果
neg.data<-read.csv('neg.data.csv',header = T,stringsAsFactors = F)
colnames(neg.data)<-c('time','segword')
neg.data_bytime<-split(neg.data,neg.data$time)
neg.data_bytime_freq<-sapply(neg.data_bytime,
      function(x) table(unlist(strsplit(x[,2],split=' '))))
按时间窗口进行分词

亮点。这里我们要根据ggplot()函数的要求整理分词数据为数据框格式,便于后面的可视化展示。

#整理成数据框
allnames<-NULL
for(i in 1:length(neg.data_bytime_freq)){
xname<-as.data.frame(neg.data_bytime_freq[[i]]) #2016-08-23
xname$time<-rep(names(neg.data_bytime)[i],nrow(xname))
allnames<-rbind(allnames,xname)
}
可视化展示

那么最后一步即为 可视化展示代码。

# 背景色为白色
# p+ theme_set(theme_bw())
# 去掉网格线
# p+theme(panel.grid.major=element_line(colour=NA))

library(ggplot2)
p<-ggplot(allnames, aes(x=time, y=Freq,group=1))+
    geom_text(aes(label=Var1))+  #添加文字
  theme(axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 0.5), 
        #调整x轴的字体角度
   panel.grid=element_blank(),panel.border=element_blank(), #设置背景为白色
 axis.line=element_line(size=1,colour='black'))+labs(x = "时间",
 y= "词频",title='徐玉玉事件评论与时间的关系')  #添加横纵轴标题
p

即可得到如下图:




R语言在TIF图上叠加饼图_r语言


想要数据的孩子,可以留言~