前言: 因为最近接触到了词云图,所以就想做一个关于和女朋友聊天的词云图,但是现在很少使用QQ了,所以就不得不使用微信导出聊天记录。于是我坐在电脑面前查阅资料查了一天,但是在走到快导出微信聊天记录的时候,还是被卡住了。
通过手机备份微信聊天记录到电脑,我拿到了下面几个文件
我想通过SQLCipher打开EnMicroMsg这个数据库文件,但是需要输入密码,根据网上所述,需要找到IMEI和微信UIN,然后IMEI+UIN通过MD5加密取32位小写前七位就是数据库密码,可是我试了很久都打不开,于是我放弃了。还有其他方法我也获取不了密码,不知道怎么回事。于是我选择了复制粘贴的办法,一天一天的把聊天记录保存到txt文件中。如果有人知道怎么导出微信聊天记录,请告诉我一下呗,不胜感激,如果不知道怎么导出微信聊天记录,那么你也可以采用我这个笨办法保存聊天记录,但是作词语图的方法都一样~
下面操作是基于聊天记录保存到txt文本中的,数据格式如下:
首先我想的是把这个txt文件中的数据保存到csv中,因为这样还可以把聊天记录发给她,csv文件看起来也方便。
代码如下:
import csv
role=[] #角色
dialogue=[] #对话
time=[] #时间
with open(r'C:\Users\23993\Desktop\微信聊天记录\聊天记录.txt',encoding='utf-8') as notes:sentence=notes.readlines()for lineID,line in enumerate(sentence):if lineID % 3 == 0:if '-' in line:time.append(line.strip())role.append('')if line.strip()=='啦什么啦:': #将微信昵称改成你想要的昵称role.append('我')time.append('')if line.strip() in ['啦啦:','大宝贝:']:role.append('大宝贝')time.append('')if lineID % 3 == 1:dialogue.append(line.strip())with open("聊天记录.csv","w+",newline = '',encoding = "gb18030") as f:writer = csv.writer(f,dialect = 'excel')writer.writerow(["时间","角色","对话"])writer.writerows(zip(time,role,dialogue))
经过上述操作,已经将txt文件转换为了csv文件,我们这时可以看效果:
PS:如果你知道如何导出聊天记录,那肯定原本就是一个csv文件,也不会像我这么麻烦。我这个是个笨方法~
接下来就是如下步骤:
①查看数据,看看聊天记录主要内容,删除空值所在行
import pandas as pd
datas=pd.read_csv('聊天记录.csv',encoding = "gb18030") #读取csv文件
datas.head() #查看DataFrame头部数据
datas=datas.dropna(axis='index', how='any', subset=['角色','对话']) #删除'角色''对话'列存在空值的行
print(datas)
②通过观察,我们发现消息中存在[干嘛]、[语音]等格式的数据,这是因为它们是表情包和语音,我们需要把它们剔除掉,以免对重要词造成影响。
#删除表情包,和语音,他们都在"[]"中
dropdata=datas[datas['对话'].str.contains(']')] #找到含有‘]’所在的行
print(dropdata)
test1=list(dropdata['对话']) #将dropdata的'对话'列表示为列表test1
test2=list(datas['对话']) #将datas的'对话'列表示为列表test2
dialogue=list(set(test1)^set(test2)) #采用列表求差集的方法将数据中含有'[]'的元素除去
print(dialogue)
print(str(len(dialogue))+'个元素') #查看列表dialogue中还有多少个元素
③操作后所有消息都在列表中,一条消息就是一个元素,接下来就利用jieba库进行分词。
import jieba
#利用jieba分词
words=[]
for sentence in dialogue:word=jieba.lcut(sentence) #分词words += word
result=' '.join(words)
print(result)
④利用wordcloud库生成词云图
import matplotlib.colors as colors
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from PIL import Image
import numpy as np
#stop_words.txt是一个停用词文本,用于除去result中的停用词
stop_words = open("stop_words.txt",encoding="utf8").read().split("\n")
#图片
picture=np.array(Image.open('爱心.png'))
#红色 #FF0000 蓝色 #0000FF 牡丹红 #FF00FF 青色 #00FFFF 黄色 #FFFF00
#海蓝 #70DB93 橙色 #FF7F00 黑色 #000000 蓝紫色 #9F5F9F 黄铜色 #B5A642
#金色 #CD7F32 紫红色 #D8BFD8 紫罗兰色 #4F2F4F 粉红色 #BC8F8F 珊瑚红 #FF7F00
#深紫色 #871F78 巧克力色 #5C3317 橙色 #FF7F00 橙红色 #FF2400 浅蓝色 #C0D9D9
colormaps=colors.ListedColormap(['#ffadbb','#ffb6c1','#ffb3e6','#ffd9e6']) #编辑文字颜色
#推荐颜色
#'#FF0000','#D8BFD8','#FF2400','#FF7F00'
#'#C7EDCC','#DCE2F1'
#'#ffadbb','#ffb6c1','#ffb3e6','#ffd9e6'#使用WordCloud生成词云
word_cloud = WordCloud(mask=picture, #设置图片background_color="white", # 词云图的背景颜色font_path="simsun.ttc", # 设置词云字体colormap=colormaps, # 指定字体颜色stopwords=stop_words) # 去掉的停词
word_cloud.generate(result)
#运用matplotlib展现结果
plt.subplots(figsize=(12,8))
plt.imshow(word_cloud)
plt.axis("off")
# 保存生成的词云图
word_cloud.to_file('聊天词云图.jpg')
最后查看效果:
用到的爱心图片:
最后呢,我想祝愿天下所有有情人终成眷属,纵使所爱隔山海,山海亦可平
感想:(此处可以略过~)
其实通过词云图就可以看出我们现在聊天基本上都是在聊上班,甚至还有一个字特别明显—‘哭’,我们其实已经恋爱五年了,但异地估计都有四年,大学也是异地,期间经历了很多事情。
在她刚读大一,我选择了复读,在她工作了,我还没毕业,所以现在我还在上学,她在上班。因为陪我,去年来我学校这边工作,所以就这一段时间我们才真正的不算异地,因为不确定因素,导致今年我们又异地了,她在她家那边上班。每天都感觉她很累,有时候她也会自己哭,然而我自己钱也不多,以前读大学异地的时候,我每个月还可以去找她两次,现在异地可能一个月只能去找她一次。真的感觉是我害了她一样,如果不遇见我,可能她会过的更好。但是我现在很舍不得她,当然以后肯定是准备和她结婚,所以我希望,在这个学期不要浑浑噩噩,复习备考公务员和学好如何做一个数据分析师两手抓,在马上到来的职场中能有所作为。
我不知道为什么在这里留下了这么多文字,我也不希望陌生人看见了会觉得我怎么怎么样,我只希望如果以后的我看见这段话,会勾起那些回忆和承诺,不要辜负了她