利用python做微信聊天记录词云分析——记录美好回忆
目录
1 概述
2 数据准备
2.1 安卓设备
2.1.1 Root手机,安装Root Explorer
2.1.2 用Root Explorer将聊天记录的数据文件导出并存入电脑
2.1.3 对EnMicroMsg.db进行解密
2.1.4 数据库表的分析和提取
2.1.5 建立message数据库
2.2 ios设备
2.2.1 备份手机记录到电脑
2.2.2 数据库结构
2.2.3 关于加密
3 目标好友聊天记录筛选
3.1 安卓
3.2 ios版本
4 制作词云
4.1 准备相关依赖包
4.1.1 jieba安装
4.1.2 WordCloud安装
4.2 调用相关包
4.3 导入聊天记录筛选.txt,用分词包进行切词
4.4 去停用词
4.5 统计频率并排序
4.6 画词云图
5 总结
1 概述
python的词云分析功能很是强大,不少网友早已提出众多利用python对聊天记录进行词云分析的方法。但是在实践过程中,有许多的bug和不太切合实际的地方,本文对目前网上已有的方法进行总结,并结合自己在实际操作中遇到的一些问题,给出一篇较为详细的步骤分解,让刚刚学习python的小白,也可以快速上手,体验python的强大和乐趣~
2 数据准备
要对微信聊天记录进行分析,必须将记录从手机或者电脑导出。
网上也有不少软件据说可以直接导出聊天记录,但大多都是收费的~
我们借鉴众多机智网友的做法自力更生(没钱买软件)
2.1 安卓设备
原文链接:https://www.zhihu.com/question/19924224/answer/69982884
本部分感谢知乎大神“画头像的dada”
2.1.1 Root你的手机,安装Root Explorer。
不同的手机root办法不同,依据自己的手机型号自行百度。
Root Explorer在任何一个安卓市场都可以下载,请自行下载并安装。
2.1.2用Root Explorer将聊天记录的数据文件导出并存入电脑
利用Root Explorer,打开以下路径:
路径:/data/data/com.tencent.mm/MicroMsg/一大串字符命名的长文件夹
并在该文件夹下找到EnMicroMsg.db文件
你的手机登录过几个微信号,就有几个这样的“一大串字符命名的长文件夹”,要是分不清楚哪个是自己,可以选择都复制。
把数据库文件EnMicroMsg.db拷贝到手机根目录,链接数据线,将其拷贝到电脑。
EnMicroMsg.db是一个sqlite3的数据库文件,Python内置了SQLite3,所以,在Python中使用import sqlite3可以直接调用sqlite3,并利用sql语句实现查询功能。但是EnMicroMsg.db是一个加密数据库,需要进行解密,才能操作,目前尚未找到直接通过python进行解密的手法,所以还需要一个解密过程。
2.1.3 对EnMicroMsg.db进行解密
微信对于用户的聊天记录还是有保护的,不是谁拿到数据文件都能看的,要进行解密。
钥匙 KEY = IMEI (手机序列号) + UIN(用户信息号)
手机输入 *#06# 能得到IMEI
利用Root Explorer访问/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml文件,并将其复制到电脑,用记事本打开,uin在最下面文本处,为11位数字,或者10位数字加一个符号,差多如下图,value值所指就是。
把IMEI (手机序列号) 和 UIN(用户信息号)连起来写成一串,计算其MD5值,免费MD5散列计算器
对计算结果取前7位为数据库密码
至此,数据库的密码拿到了,就可以进行数据提取了。
感谢网友提供的解密sqlite3数据库神器,sqlcipher。下载地址:百度网盘
点击File,OpenDatabase,选择刚才的EnMicroMsg.db文件,出现弹框,输入刚才拿到的7位密码,就能进入数据库。
2.1.4数据库表的分析和提取
数据库中chatroom表包含了所有群的相关信息,而rcontact表中包含了所有联系人的信息(包括好友和非好友)。如下图:
我们需要通过rcontact表来找到想要分析的聊天对象的username,以便于找到对应的聊天内容。下图中,昵称为“文件传输助手”的username是filehelper。
然后我们找到一个名为message的表,里边记录了所有的聊天记录。createtime是信息创建时间,talker是聊天者,用上一步提到的username来标识,而content就是聊天内容了。
虽然sqlcipher提供sql语句查询功能,但是,查询出来的数据并不能导出,所以,通过文件导出功能,将message表整体导出,再通过python进行筛选查询。我们将表message储存为csv格式。命名为“聊天记录.csv”
有可能这个csv文件会有上百兆,如果用excel打开,会非常卡,无法对目标talker筛选,从而找到目标聊天记录内容。
通过tableau进行文本数据源的导入,进行筛选也是一个不错的选择,本文不做详述。
2.1.5 建立message数据库
为了快捷简便的对message表进行筛选,找到与目标talker的聊天内容,我们将上一步导出的csv文件导入到一个新建的sqlite3数据库中。用sql语句进行筛选。
利用pandas,将csv导入新建的“聊天记录.db”数据库。
代码如下(会自动创建“聊天记录.db”文件):
import pandas
import csv, sqlite3
conn= sqlite3.connect('聊天记录数据库.db')
df = pandas.read_csv('聊天记录.csv')
df.to_sql('tablename', conn, if_exists='append', index=False)
print('ok')
聊天记录数据库.db中含有一个表,表名为tablename
至此,完成了安卓聊天记录的数据库准备工作。
2.2 ios设备
原文链接:
https://www.zhihu.com/question/19924224/answer/225572319
感谢知乎大神“Yuanxq”
2.2.1 备份手机记录到电脑
利用itunes给手机备份
用itools打开备份文件
可以看到var文件夹,依次打开mobile>>applications>>com.tencent.xin>>documents文件夹
与安卓一样,有一个很长字符串的文件
在这个文件中找到DB文件夹,有一个MM.sqlite文件,就是我们要找的聊天记录数据库
2.2.2数据库结构
在MM.sqlite文件中,依然有许多表,与安卓不同,这里每一个以“chat_好友1代码”开头的表中包含与“好友1”聊天的全部信息。
同样,createtime是信息创建时间,message是聊天内容。我们需要找到想要分析的含有目标好友聊天记录的表名,“chat_目标好友代码”
2.2.3关于加密
貌似ios的MM.sqlite数据库不是加密的。
至此,ios的聊天数据准备工作也已经完成。
3 目标好友聊天记录筛选
在准备好数据库后,我们对想要做词云的目标好友的聊天记录进行筛选。利用python对sqlite进行操作,可以参考:廖雪峰python访问数据库sqlite
3.1 安卓
利用python链接sqlit数据库。
import sqlite3 #调用sqlite数据库
conn=sqlite3.connect('聊天记录数据库.db') #链接“聊天记录数据库.db"
cursor.execute('select content from tablename where talker=? and length(content)<30',('目标username',)) #建立游标,用sql语句进行筛选,其中,限定了talkername为我们要找的username,并将content长度限定30以下,因为content中会有聊天时所发送的长链接等,需要排除
value=cursor.fetchall()#利用fetchall返回筛选结果
data=open("聊天记录筛选.txt",'w+',encoding='utf-8')
print(value,file=data)
data.close()#将筛选结果写入”聊天记录筛选.txt”
cursor.close()
conn.close()#关闭连接
3.2 ios版本
import sqlite3 #调用sqlite数据库
conn=sqlite3.connect('MM.sqlite')
cursor.execute('select message from chat_目标好友代码 where length(content)<30') #建立游标,用sql语句进行筛选
value=cursor.fetchall()#利用fetchall返回筛选结果
data=open("聊天记录筛选.txt",'w+',encoding='utf-8')
print(value,file=data)
data.close()#将筛选结果写入”聊天记录筛选.txt”
cursor.close()
conn.close()#关闭连接
4 制作词云
参考连接:http://www.sohu.com/a/126189699_467304
本部分主题思路以及大部分代码接来自该文章,并进行适用性修改。
4.1准备相关依赖包
主要用到jieba分词包、numpy计算包、pandas数据分析包、WordCloud词云包、codecs语言代码处理包、matplotlib绘图功能包。
推荐安装anaconda,其中会集成numpy、pandas、codecs、matplotlib等包。
4.1.1jieba安装
下载地址:http://pypi.python.org/pypi/jieba/
然后在windows的命令提示符中输入(假设解压在D盘) :
C:\Users\Administrator>D:
D:\> cd D:\jieba-0.35
D:\TDDownload\jieba-0.35> python setup.py instal
参考连接:https://blog.csdn.net/u010707315/article/details/79252964
4.1.2 WordCloud安装
下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
找到对应的版本,cp37代表python3.7,进行下载
假设下载在D盘
pip install wheel
cd D:
pip install wordcloud-1.5.0-cp37-win amd64.whl
完成安装。
参考连接:https://blog.csdn.net/xyisv/article/details/79070960
4.2 调用相关包
这一步开始正式开始制作词云了。
我们采用Jupyter Notebook来进行编写。
#coding:utf-8
import jieba #分词包
import numpy #numpy计算包
import codecs #codecs语言代码处理包
import pandas #数据分析包
import matplotlib.pyplot as plt
from wordcloud import WordCloud#词云包
运行~
4.3 导入聊天记录筛选.txt,用分词包进行切词
该部分利用jieba分词,把聊天记录中的语句切分成为单个词。
我们这里使用林徽因诗词全集做一个例子。
目标文件"lhyscqj.txt",这里声明了要用utf-8编码,因为在上一步导出“聊天记录筛选.txt”时,是以utf-8编码的。
file=codecs.open(u"lhyscqj.txt",'r',encoding='utf-8')
content=file.read()
file.close()
segment=[]
segs=jieba.cut(content) #切词
for seg in segs:if len(seg)>1 and seg!='\r\n':segment.append(seg)
运行~
4.4 去停用词
停用词,是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。
像“哦”、“的”等无具体意义的词。
有停用词表,可以直接拿来使用。
停用词表:https://blog.csdn.net/dorisi_h_n_q/article/details/82114913
将停用词表复制到一个txt文件中,以“stopwords.txt”命名。
当然,也可以继续添加你认为没有意义的,不想放到词云中的词。把这些词放入“stopwords.txt”中,将不会在词云中出现。
words_df=pandas.DataFrame({'segment':segment})
words_df.head()
stopwords=pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="gb18030")
words_df=words_df[~words_df.segment.isin(stopwords.stopword)]
运行~
4.5统计频率并排序
对分切好的词去除停用词以后,依据出现频率进行排序。
words_stat=words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat=words_stat.reset_index().sort_values(by="计数",ascending=False)
words_stat #打印统计结果
运行~
可以得出,林徽因诗词中,提到“秋天”一词比较多。
4.6画词云图
可以依据你自己的图片进行词云生成。比如,我们使用一个蓝色的椭圆来制作。图片名字“tuoyuan.jpg”
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
%matplotlib
bimg=imread('tuoyuan.jpg')
wordcloud=WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf')
#wordcloud=wordcloud.fit_words(words_stat.head(4000).itertuples(index=False))
words = words_stat.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()
运行~
可以看到,“秋天”一词,所占面积最大。
5 总结
至此,所有的步骤都完成了,本文代码大部分都可以在调试之后运行。
数据分析并不难,难的是前期的数据准备工作。在文本数据处理时,尤其需要注意统一编码格式。
感谢众多网友的智慧。
利用python做微信聊天记录词云分析——记录美好回忆相关推荐
- 微信聊天记录词云分析
步骤 - 获取对象聊天记录加密数据 - 解码 - 对csv数据进行筛选 -词云分析 获取微信聊天记录加密数据 安卓手机获取微信导出微信聊天记录需要先获取root权限,这个风险比较大,而且我这个手机比较 ...
- 用R语言做自己的微信聊天记录词云
心血来潮,想做一个微信聊天记录词云,于是就动手了. 最后的效果如下图所示 啊--我真的是一个爽朗的女孩子. 好了,下面就是步骤啦~ 请多多指教. 第一步:导出微信聊天记录. 我使用的手机是安卓系统,是 ...
- Python---qq群聊天记录词云分析
python拥有近13w个第三方库,其中有很多优秀的库,比如wordcloud,scipy,jieba等库,能快速实现很多功能,比如制作一个QQ群聊天记录词云-- 工具:PyCharm, Python ...
- 利用python做微信公众号标题的词云图
一.标题数据的获取 1.通过微信公众平台后台网页,左侧的统计模块来下载相应的数据,单独把标题复制出来,形成文件形式: 2.通过网页爬虫来爬取. 二.词云图制作过程 1.引入需要的库 import wo ...
- 其实特简单,Python 做一个漂亮女孩词云跳舞的视频
大家好,最近不少小伙伴在学 Python,想找个好玩的练手项目.那今天分享一个简单.好玩,适合新手的 Python 小项目.文章较长,建议收藏.喜欢关注.点赞,文末提供技术交流群. 以下是具体项目: ...
- 利用Python对微信好友数据进行分析
一直就想着做个微信好友数据分析,折腾了一天总算是勉强完成了. 本文参考: 微信好友大数据分析 Python基于jieba库进行简单分词及词云功能实现方法 本文会使用到的第三方模块: itchat:微信 ...
- 利用Python生成漂亮的词云,云的形状由你定
前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里 ...
- 用R语言,生成微信聊天记录词云。
首先获取微信聊天记录:并导出为txt文件 基于R语言: #install.packages("jiebaRD") #install.packages("jiebaR&q ...
- 微信聊天记录提取及分析(wordcloud+pyecharts)
0. 前言 之所以想要提取微信的聊天记录并分析是因为也开始再学习python,但是单纯看看语法什么的又很无趣,无意间看到python可以进行微信聊天记录的分析,就自己尝试做了一下,感觉还是挺有意思 ...
最新文章
- Chemistry.AI | 基于非线性激活的多层感知器预测分子特性
- php168站内统计,PHP168整站系统0DAY
- jdbc preparestatement 执行多条语句_jmeter获取JDBC响应做接口关联(三)
- .Net 垃圾回收和大对象处理
- 分分钟带你欣赏ES6语法糖
- 洛谷-DFS-1101-单词方阵-个人AC题解及公共题解的笔记
- idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
- endnotex9切换中文_EndNoteX9常用方法汇总
- 【刘润五分钟商学院】156对对抗思考到平行思考
- java分布式-一致性
- tomcat是干什么的
- 洛谷题集——乒乓球(思维、乒乓球比赛规则)
- 基于@Aspect实现AOP的两种方式
- 僵尸网络瞄准Linux服务器
- [Python数据分析]NBA的球星们喜欢在哪个位置出手
- 植树节推文如何排版?—135植树节样式上新
- 33岁跨专业考计算机研究生,盲目跨专业考研考上以后也不轻松
- 387:字符串中的第一个唯一字符
- 小强升职记思维导图_《小强升职记》思维导图与总结
- Spring中添加自定义标签
热门文章
- 一加8T 原装65W WARP闪充 充电功率记录
- varnish 4.0 官方文档翻译9-用户手册- 向Vanish下发指令
- 鹰潭:移动物联网产业领跑全国
- read函数---------详解
- 修行“静”的九种境界
- Spring Boot使用websocket实现聊天室
- 项目经理必须知道的7种项目管理方案
- c语言中char16_t是什么类型,错误[Pe167]:类型为“uint16_t *”的参数与类型为“unsigned char *”的参数不兼容...
- 张益唐111页论文攻克朗道-西格尔零点猜想
- kubernetes-1.23.6版本部署