首页 > > > 用R语言制作微信聊天记录词云图
简单警告:这个方法非常适合刚入门R语言的朋友!这个方法非常适合刚入门R语言的朋友!这个方法非常适合刚入门R语言的朋友!
更为详细的教程我放到了Github上面,大家可以下载Readme.rmd,在R当中打开来看详细的实现方法;实现代码也上传到Github上了,大家可以下载wordcloud_wechat.R文件,按照自己的需要进行修改。
投掷连接:用R语言制作微信聊天记录词云图 ,如果对你有帮助,请各位施主给个star哇~
如果只是想用简单的方法做一个词云图,就比较简单啦,但词云图的效果,根据我自己的操作发现,跟输入的词库有很大关系,因为词库当中的短语为长句的分割提供依据,若是词库当中没有某些特定的短语,例如,你家楼下某个杂货店名字叫二狗,而二狗在你的词库当中不存在,并且你也没有手动insertWord,那么就容易被分割成 二/ 狗 两个字。建议先跟着流程做一遍之后,根据生成的效果去调整自己输入的词库等等,那么,开始吧!

1. 下载好所需工具/软件
2. 获取原材料:导出微信聊天记录到Excel
聊天记录导出可以参考这一篇文章:记一次微信聊天文字记录导出到Excel工作 ,文章第一部分是安卓系统导出微信聊天记录的方法,第二部分是苹果系统导出方法。但在从pp助手导出数据库这一步存在问题,应该导出名称为MM.sqlite的文件,而不是fts_message.db,后者貌似只有一部分群聊的聊天记录。用sqlcipher.exe打开MM.sqlite后,只能先导出txt,这里推介,将导出的.txt通过Excel打开后,另存为成.csv,之后再R当中打开会比较方便。

3. 清理数据
清理NaNs等无意义文字记录。
# 导入做词云图所需的包
library(rJava)
install.packages(Rwordseg)
install.packages(wordcloud2)
# 读入数据
data<-read.csv("Messages.csv",stringsAsFactors = FALSE,header = TRUE)
# Remove NaNs and useless data
comp.data<-as.data.frame(data[complete.cases(data),5],stringsAsFactors = FALSE)
colnames(comp.data)<-"Message"
newdata<-as.data.frame(comp.data[!grepl(pattern ="msg",comp.data$Message),],stringsAsFactors = FALSE)
colnames(newdata)<-"Message"安装rJava需要电脑本身安装Java,详细的方法,见我的Github readme.md 的第一部分Packages needed in this project。
4. 分词
下载多几个词库,像 四十万汉语大词库续一.scel ,网上可以搜索到很多,可以根据你的内容去下一些针对性的词库啦。这里给大家推介一个Github上大神整理的词库,包含了大部分可以直接从网上获得的词库,按需下载好。
Github大神整理的词库:词库大礼包
下载好这些词库之后,要在R当中安装好才能使用。像“笨笨”、“好鸭”这种词是词库当中不存在的,就需要手动加入进去,接着进行分词。
installDict("G:\\WORDCLOUD\\四十万汉语大词库续一.scel","hanyuciku1")
installDict("G:\\WORDCLOUD\\funNLP-master\\funNLP-master\\data\\中文分词词库整理\\百度分词词库.txt","hanyuciku3")
insertWords(c("好鸭","笨笨")) #insert words I want so it won't be split into "好""鸭""笨""笨" :)
words.list<-unlist(lapply(newdata, segmentCN)[[1]]) 5. 去除停词
和上一步一样,停词也是有词库的,作用是告诉电脑停词词库里的词要去除掉,停词的词库在上面的词库大礼包当中有,可自行下载。
# 将多个停词词库整合一下
stopwords1<-read.table("G:\\WORDCLOUD\\funNLP-master\\funNLP-master\\data\\停用词\\哈工大停用词表.txt",quote="")
stopwords2<-read.table("G:\\WORDCLOUD\\funNLP-master\\funNLP-master\\data\\停用词\\中文停用词库.txt")
stopwords3<-read.table("G:\\WORDCLOUD\\funNLP-master\\funNLP-master\\data\\停用词\\百度停用词列表.txt",skip=10)
stopwords4<-read.table("G:\\WORDCLOUD\\funNLP-master\\funNLP-master\\data\\停用词\\四川大学机器智能实验室停用词库.txt")
stopwords12<-merge(stopwords1,stopwords2,all = TRUE)
stopwords34<-merge(stopwords3,stopwords4,all = TRUE)
stopwords<-unique(merge(stopwords12,stopwords34,all = TRUE))写一个函数来去除分词结果当中的停词。
# Function for removing stopwords
removestopwords<-function(x,stopwords){
temp<-character(0)
n<-1
for(n in 1:length(x)){
if(sum(x[n]==stopwords)<1){
temp<-c(temp,x[n])
}
n<-n+1
}
temp
}
# Remove stopwords
words<-lapply(words.list,removestopwords,stopwords)
t<-as.data.frame(unlist(words))
total<-t[complete.cases(t),]6. 生成词云图
total是分词并且去除停词之后的词语集合,当中有的词出现频率很高,有的出现频率低,我们需要将其进行排序,选取前200个词做词云图。
# 将词语按出现频率排序
wordsNum<-sort(table(total),decreasing = TRUE)
wordsdf<-data.frame(wordsNum)
wordsdf$total<-as.character(wordsdf$total
# 取前200个词语做词云图
finaldata <- wordsdf[1:200,]
finaldata[1,2]<-finaldata[2,2]+500 # In case that the first one is extremely larger than the second word
# 生成词云图,我在这将词云图弄成了狗子的轮廓,还可以通过设置shape做很多不同形状
picture<-system.file("examples/shibainu.png",package = "wordcloud2")
result<-wordcloud2(finaldata, size = 1, color = 'random-light',
backgroundColor = "gray", fontFamily = "微软雅黑",figPath = picture)
# help(wordcloud2) for more fun:)
最后,词云图就诞生了,可以wordcloud2当中的参数做出自己想要的效果啦。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3149123/ ,如需转载,请注明出处,否则将追究法律责任。