Python使用微信聊天记录生成词云
本文使用工具:
1、微信电脑版
2、模拟器(本文使用夜神模拟器)
3、https://md5jiami.bmcx.com/ MD5加密工具
4、Sqlcipher.exe
5、Excel
6、Pycharm
一、导出微信聊天记录
- 1、官网下载模拟器、安装
- 2、模拟器安装微信,在模拟器中登录微信,将想要的聊天记录备份到模拟器中。此步骤极为简单,这里不赘述。
- 3、在模拟器中找到备份聊天记录的数据库所在位置,通过文件助手备份至电脑文件夹。
- /data/data/com.tencent.mm/MicroMsg/2bf2a2d7d94578b3n2d9v(文件中较长名称的文件夹)/EnMicroMsg.db
在文件助手中将EnMicroMsg.db保存至共享文件夹(Pictures)下,在电脑文件夹中可以查看到EnMicroMsg.db文件。
二、获取数据库密码
微信聊天记录数据库密码是由手机IMIE+UIN组成的,为了绕开root,所以我们使用模拟器root获取IMEI,在模拟器中需要找1、IMEI以及2、UIN。
- 1、在模拟器系统设置中,手机菜单下,找IMEI,保存下来。
- 2、在Amaze中/data/data/com.tencent.mm/shared_prefs下找com.tencent.mm_preferences.xml。
- 3、打开文件后,
<string name ="last_login_uin">734432902</string>
,734432902即为uin,将其保存下来。
- 4、到此,我们获取了IMEI和UIN,将IMEI+UIN拼接在一起,即为:351564288183262+734432902=351564288183262734432902。
- 5、将351564288183262734432902复制到https://md5jiami.bmcx.com/ MD5加密网站上解析,其中32位小写前七位即为微信聊天记录数据库密码:737ecee
- 6、到这里,我们就获取到数据库密码了。当然这里有个坑,大家会发现IMEI无论怎么找,加密出来的密码都不对。可以尝试一下1234567890ABCDEF代替一下IMEI。会有惊喜哦。
三、编译sqlcipher.exe
- 现在网络这么强大,没必要自己编译了,而且编译出现的问题很多,不建议新手自己去编译,特别不友好。可以自己去搜索下载,网上很多的。也可以点赞之后留言一下,找我要哦。
这里在Sqlcipher.exe中打开微信聊天记录数据库后输入,我们得到的数据库密码后,导出csv文件。
四、导出csv文件
- 导出csv文件,记得选择message,这个才是聊天内容。
五、简单处理csv文件
- 在csv文件中,content列为聊天内容,可以自己筛选去除没有用的数据,留下有用的数据。然后将该列数据复制到txt文件中,方便后续使用python生成词云。
六、使用pycharm生成词云
- 1、下载pycharm,创建一个项目。
- 2、这里需要导入包:
- import jieba
- import numpy
- import codecs
- import pandas
- from matplotlib.image import imread
- import matplotlib.pyplot as plt
- from wordcloud import WordCloud,ImageColorGenerator
可以在Python Interpreter中加入以上包。
也可以在底下Terminal中 pip install 以上包…
以下放出完整python代码:
import jieba
import numpy
import codecs
import pandas
from matplotlib.image import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
def load_file_segment():
# 加载自己定义的词典单词
jieba.load_userdict("mywords.txt")
# 打开我们处理好的聊天文件
f = codecs.open(u"123.txt", 'r', encoding='utf-8')
# 读取聊天文件到content中
content = f.read()
# 关闭文件
f.close()
# 保存分词结果
segment = []
# 对整体进行分词
segs = jieba.cut(content)
for seg in segs:
if len(seg) > 1 and seg != '\r\n':
# 这里进行判断分词得到的结果不是单个字,并且不是换行符,就将分词加到数组中
segment.append(seg)
return segment
def get_words_count_dict():
# 获得以上分词结果
segment = load_file_segment()
# 将分词数组转化为pandas
df = pandas.DataFrame({'segment': segment})
# 这里设置不想要的分词,将不想要的分词写入文件中,可以将设置好的分词剔除出去。
stopwords = pandas.read_csv("stopwords.txt", index_col=False, quoting=3, sep="\t", names=['stopword'],encoding="utf-8")
# 如果不在停用词中
df = df[~df.segment.isin(stopwords.stopword)]
# 按词分组,计算每个词的个数
words_count = df.groupby(by=['segment'])['segment'].agg([("计数", numpy.size)])
# reset_index保留segment字段,排序,数字大的在前面
words_count = words_count.reset_index().sort_values(by="计数", ascending=False)
return words_count
words_count = get_words_count_dict()
# 读取想要生成词云模板图片
bimg = imread('ai2.jpg')
wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')
words = words_count.set_index("segment").to_dict()
wordcloud = wordcloud.fit_words(words["计数"])
bimgColors = ImageColorGenerator(bimg)
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors))
plt.show()
- 效果,点个赞吧,谢谢!