前言
最近在学习机器学习,恰逢昨天七夕,想给女友做个有意思的纪念品。之前用keras的tokenize分词记录词频,但做出展示效果不太好看,上网学习以后发现wordcloud意外的好用。
网上关于微信记录导出和做成词云的代码很多,所以也踩了一些坑。这边分享一下我导入微信聊天记录和做成词云的经验,希望对大家有帮助。
一、注意避开的坑
1.微信聊天记录EnMicroMsg.db库的导出
储存微信聊天记录的EnMicroMsg.db库需要在ROOT情况下导出。但目前的手机ROOT软件下载,我个人并不放心。这篇文章说明了如何在不手机ROOT的情况下导出库文件。
2.EnMicroMsg.db库的解密
关于解密网上已有很多资料,钥匙 KEY = IMEI (手机序列号) + UIN(用户信息号)
计算KEY值MD5加密以后的前7位的值,这就是库的密码。
(但是输出密码以后一直显示错误,上网查发现微信在7.017版本之后貌似会出现这种情况,当时试了好久,试了很多其他办法和密码。解决办法就是过一段时间再尝试就可以了,所以如果你碰见这样的情况,可以不用着急,等过会输入就可以了)
二.词云
2.1停用词(stopword.txt)
停用词可以用这个
chat.txt就导入自己想做词云的文本吧
图片如果自定义的话(因为代码设置是白色)背景需要自己处理下。
2.2代码示例
#coding:utf-8
import jieba #分词包
import matplotlib.pyplot as plt
from wordcloud import WordCloud#词云包
import collections
#文件读入
file=open("chat.txt",'r',encoding='utf-8')
content=file.read()
file.close()
segment=[]
segs=jieba.cut(content) #切词
#停用词读入
stopwords=open("stopword.txt",'r',encoding="utf-8")
s=stopwords.read()
stopwords.close()
s = s.split("\n")
#循环输出需要的词追加到列表
for word in segs:
if word not in s and len(word)>1:
segment.append(word)
#查看词频记录
word_counts = collections.Counter(segment) # 对分词做词频统计
word_counts_top10 = word_counts.most_common(10) # 获取前10最高频的词
print(word_counts_top10) # 输出检查
#制作词云
text = ' '.join(segment)#将文本变为str格式
bimg=plt.imread('heart.jpg')
wc = WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf',collocations=False).generate(text)
plt.imshow(wc,interpolation='bilinear')#按双线性插值输出
plt.axis('off')
plt.show()
# 保存到文件
wc.to_file('wordcloud.png')
三.词云效果
展示如下(感觉甜甜的和大家分享下嘻嘻):