目录

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做微信聊天记录词云分析——记录美好回忆相关推荐

  1. 微信聊天记录词云分析

    步骤 - 获取对象聊天记录加密数据 - 解码 - 对csv数据进行筛选 -词云分析 获取微信聊天记录加密数据 安卓手机获取微信导出微信聊天记录需要先获取root权限,这个风险比较大,而且我这个手机比较 ...

  2. 用R语言做自己的微信聊天记录词云

    心血来潮,想做一个微信聊天记录词云,于是就动手了. 最后的效果如下图所示 啊--我真的是一个爽朗的女孩子. 好了,下面就是步骤啦~ 请多多指教. 第一步:导出微信聊天记录. 我使用的手机是安卓系统,是 ...

  3. Python---qq群聊天记录词云分析

    python拥有近13w个第三方库,其中有很多优秀的库,比如wordcloud,scipy,jieba等库,能快速实现很多功能,比如制作一个QQ群聊天记录词云-- 工具:PyCharm, Python ...

  4. 利用python做微信公众号标题的词云图

    一.标题数据的获取 1.通过微信公众平台后台网页,左侧的统计模块来下载相应的数据,单独把标题复制出来,形成文件形式: 2.通过网页爬虫来爬取. 二.词云图制作过程 1.引入需要的库 import wo ...

  5. 其实特简单,Python 做一个漂亮女孩词云跳舞的视频

    大家好,最近不少小伙伴在学 Python,想找个好玩的练手项目.那今天分享一个简单.好玩,适合新手的 Python 小项目.文章较长,建议收藏.喜欢关注.点赞,文末提供技术交流群. 以下是具体项目: ...

  6. 利用Python对微信好友数据进行分析

    一直就想着做个微信好友数据分析,折腾了一天总算是勉强完成了. 本文参考: 微信好友大数据分析 Python基于jieba库进行简单分词及词云功能实现方法 本文会使用到的第三方模块: itchat:微信 ...

  7. 利用Python生成漂亮的词云,云的形状由你定

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里 ...

  8. 用R语言,生成微信聊天记录词云。

     首先获取微信聊天记录:并导出为txt文件 基于R语言: #install.packages("jiebaRD") #install.packages("jiebaR&q ...

  9. 微信聊天记录提取及分析(wordcloud+pyecharts)

    0. 前言 ​ 之所以想要提取微信的聊天记录并分析是因为也开始再学习python,但是单纯看看语法什么的又很无趣,无意间看到python可以进行微信聊天记录的分析,就自己尝试做了一下,感觉还是挺有意思 ...

最新文章

  1. Chemistry.AI | 基于非线性激活的多层感知器预测分子特性
  2. php168站内统计,PHP168整站系统0DAY
  3. jdbc preparestatement 执行多条语句_jmeter获取JDBC响应做接口关联(三)
  4. .Net 垃圾回收和大对象处理
  5. 分分钟带你欣赏ES6语法糖
  6. 洛谷-DFS-1101-单词方阵-个人AC题解及公共题解的笔记
  7. idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
  8. endnotex9切换中文_EndNoteX9常用方法汇总
  9. 【刘润五分钟商学院】156对对抗思考到平行思考
  10. java分布式-一致性
  11. tomcat是干什么的
  12. 洛谷题集——乒乓球(思维、乒乓球比赛规则)
  13. 基于@Aspect实现AOP的两种方式
  14. 僵尸网络瞄准Linux服务器
  15. [Python数据分析]NBA的球星们喜欢在哪个位置出手
  16. 植树节推文如何排版?—135植树节样式上新
  17. 33岁跨专业考计算机研究生,盲目跨专业考研考上以后也不轻松
  18. 387:字符串中的第一个唯一字符
  19. 小强升职记思维导图_《小强升职记》思维导图与总结
  20. Spring中添加自定义标签

热门文章

  1. 一加8T 原装65W WARP闪充 充电功率记录
  2. varnish 4.0 官方文档翻译9-用户手册- 向Vanish下发指令
  3. 鹰潭:移动物联网产业领跑全国
  4. read函数---------详解
  5. 修行“静”的九种境界
  6. Spring Boot使用websocket实现聊天室
  7. 项目经理必须知道的7种项目管理方案
  8. c语言中char16_t是什么类型,错误[Pe167]:类型为“uint16_t *”的参数与类型为“unsigned char *”的参数不兼容...
  9. 张益唐111页论文攻克朗道-西格尔零点猜想
  10. kubernetes-1.23.6版本部署