谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图

明天又双叒叕是一年一度的七夕恋爱节了!python

又是一波绝好的机会!恩爱秀起来!ios

购物车清空!礼物送起来!朋友圈晒起来!正则表达式


 

等等! 什么?!sql

你还没准备好七夕礼物么?shell

但其实你不知道要送啥?数据库

原来又双叒叕要到了windows

全民不知道送什么礼物的系列日子了…数组

须要Python软件工具和学习资料的小伙伴能够点击下方连接自行获取浏览器

http://note.youdao.com/noteshare?id=7e3c432b74512d52b75aafc4609451b9微信

哎呦 大家这些

磨人的小(lao)妖(you)精(tiao)!

Python却是以为你还能够抢救一下!

说到词云应该不陌生,不知道的童靴往下看

词云,就是把网络文本中出现频率较高的

"关键词"予以视觉上的突出

浏览者只要一眼扫过文本就能够领略其主旨

瞧 这是否是一个有声音、有画面的小爱心~

今天 咱们采集情侣们之间的聊天平常

用此制做一份只属于大家的小浪漫!


第一步,咱们须要导出本身和对象的数据~

微信的备份功能并不能直接给你导出文本格式,它导出来实际上是一种叫sqlite的数据库。若是说用网上流传的方法提取文本数据,iOS则须要下载itunes备份整机,安卓则须要本机的root权限,不管是哪一种都很是麻烦,在这里给你们介绍一种不须要整机备份和本机root权限,只导出和对象的聊天数据的方法。

那就是使用安卓模拟器导出,这样既能ios/安卓通用,又可以避免对本机形成不良影响,首先须要用电脑版的微信备份你和你对象的聊天记录。以windows系统为例:

1. 下载夜神模拟器
2. 在夜神模拟器中下载微信
3. 使用windows客户端版的微信进行备份,如图左下角
4. 点击备份聊天记录至电脑
5. 手机端选择备份的对象

点击进入下方的选择聊天记录,而后选择和你对象的记录就能够啦

6. 导出完毕后打开模拟器,登陆模拟器的微信
7. 登陆成功后返回电脑版微信登陆,打开备份与恢复,选择恢复聊天记录到手机
  1. 勾选咱们刚刚导出的聊天记录,并在手机上点击开始恢复
9. 打开夜神模拟器的root权限
10. 用模拟器的浏览器百度搜索RE文件管理器,下载(图一)安装后打开,会弹出对话框让你给予root权限,选择永久给予,打开RE文件管理器(图二),进入如下文件夹(图三), 这是应用存放数据的地方。

/data/data/com.tencent.mm/MicroMsg

而后进入一个由数字和字母组合而成的文件夹,如上 图三 的 4262333387ddefc95fee35aa68003cc5

11. 找到该文件夹下的EnMicroMsg.db文件,将其复制到夜神模拟器的共享文件夹(图四)。共享文件夹的位置为 /mnt/shell/emulated/0/others ( 图五 ),如今访问windows的 C:\Users\你的用户名\Nox_share\OtherShare 获取该数据库
12. 导出该数据库后,使用一款叫 **sqlcipher **的软件读取数据(连接: https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ提取码: ka4z)

在这以前,咱们还须要知道该数据库的密码,根据前人的经验,该密码的公式以下

字符串 " IMEI (手机序列号) UIN(用户信息号)"

将该字符串进行MD5计算后的前七位即是该数据的密码,如 "355757010761231 857456862" 实际上中间没有空格,而后放入MD5计算取前面七位数字,后续会详细介绍。

哇,真是“简单易懂”啊,不要紧,接下来告诉你们IMEI和UIN怎么得到。

首先是IMEI,在模拟器右上角的系统设置 —— 属性设置里就能够找获得啦,如图所示。

如今咱们得到了IMEI号,那UIN号呢?

一样地,用RE文件管理器打开这个文件

/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

长按改文件,点击右上角的三个点—选择打开方式—文本浏览器,找到default_uin,后面的数字就是了 !

获得这两串数字后,就能够开始计算密码啦,若是个人IMEI是355757010762041,Uin是857749862,那么合起来就是355757010762041857749862,将这串数字放入免费MD5在线计算

获得的数字的前七位就是咱们的密码了,像这一串就是 6782538.

而后咱们就能够进入咱们的核心环节:使用 **sqlcipher **导出聊天文本数据!

点击 File - open database - 选择咱们刚刚的数据库文件,会弹出框框让你输入密码,咱们输入刚刚获得的七位密码,就能够进入到数据库了,选择message表格,这就是你与你的对象的聊天记录!

咱们能够将它导出成csv文件:File - export - table as csv.

接下来,咱们将使用Python代码,将里面真正的聊天内容:content信息提取出来,以下所示。虽然这个软件也容许select,可是它select后不容许导出,很是很差用,所以还不如咱们本身写一个:

#!/usr/bin/python import pandas import csv, sqlite3 conn= sqlite3.connect('chat_log.db') # 新建数据库为 chat_log.db df = pandas.read_csv('chat_logs.csv', sep=",") # 读取咱们上一步提取出来的csv文件,这里要改为你本身的文件名 df.to_sql('my_chat', conn, if_exists='append', index=False) # 存入my_chat表中 conn = sqlite3.connect('chat_log.db') # 链接数据库 cursor = conn.cursor() # 得到游标 cursor.execute('select content from my_chat where length(content)<30') # 将content长度限定30如下,由于content中有时候会有微信发过来的东西 value=cursor.fetchall() # fetchall返回筛选结果 data=open("聊天记录.txt",'w+',encoding='utf-8') for i in value: data.write(i[0]+'\n') # 将筛选结果写入 聊天记录.txt data.close() cursor.close() conn.close() # 关闭链接 

记得把csv文件的编码格式转换成utf-8哦,否则可能会运行不下去:

固然你还能够用正则表达式去除如下内容

  1. 微信发送的数据:wxid.*
  2. 表情:[.]*

不过我以为这些也是必要的聊天信息之一,留着也无妨,所以在这里就不加入进去啦

最后获得的文本格式就是一行一句聊天内容,处理后咱们就准备好进入下一个环节了!那就是使人激动的!生成词云

第二步,根据第一步获得的聊天数据生成词云

1. 导入咱们的聊天记录,并对每一行进行分词

聊天记录是一行一行的句子,咱们须要使用分词工具把这一行行句子分解成由词语组成的数组,这时候咱们就须要用到结巴分词了。

分词后咱们还须要去除词语里一些语气词、标点符号等等(停用词),而后还要自定义一些词典,好比说大家之间恩恩爱爱的话,通常结巴分词是没法识别出来的,须要你自行定义,好比说:小傻瓜别感冒了,通常分词结果是

小/傻瓜/别/感冒/了

若是你把“小傻瓜”加入到自定义词典里(咱们下面的例子里是mywords.txt),则分词结果则会是

小傻瓜/别/感冒/了

下面对咱们的聊天记录进行分词:

# segment.py import jieba import codecs def load_file_segment(): # 读取文本文件并分词 jieba.load_userdict("mywords.txt") # 加载咱们本身的词典 f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8') # 打开文件 content = f.read() # 读取文件到content中 f.close() # 关闭文件 segment=[] # 保存分词结果 segs=jieba.cut(content) # 对总体进行分词 for seg in segs: if len(seg) > 1 and seg != '\r\n': # 若是说分词获得的结果非单字,且不是换行符,则加入到数组中 segment.append(seg) return segment print(load_file_segment()) 

在这个函数里,咱们使用了codecs打开咱们的聊天记录文件,而后进行结巴分词,最终返回一个包含全部词语的数组。记得运行前要安装jieba分词包,默认你已经安装了python3.

windows打开CMD/macOS系统打开Terminal 输入:

pip install jieba

安装完成后,在编辑器中输入咱们刚刚的python代码,我将其命名为segment.py,切记在同个目录下放置 聊天记录.txt 及 自定义词表 mywords.txt, 而后在CMD/Terminal中输入命令运行

python segment.py

你就能够看见大家的聊天记录分词后的效果啦

2. 计算分词后的词语对应的频数

为了方便计算,咱们须要引入一个叫pandas的包,而后为了计算每一个词的个数,咱们还要引入一个叫numpy的包,cmd/terminal中输入如下命令安装pandas和numpy:

  • pip install pandas
  • pip install numpy

详细的解析我都写在下方的注释里啦,你们能够自行阅读并实践。不过须要注意的是,里面的load_file_segment()是咱们第一步里的函数,若是你不知道如何把这两个步骤合在一块儿,不要紧,最后咱们会提供一份完整的代码.

import pandas import numpy def get_words_count_dict(): segment = load_file_segment() # 得到分词结果 df = pandas.DataFrame({'segment':segment}) # 将分词数组转化为pandas数据结构 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}) # 按词分组,计算每一个词的个数 words_count = words_count.reset_index().sort_values(by="计数",ascending=False) # reset_index是为了保留segment字段,排序,数字大的在前面 return words_count print(get_words_count_dict()) 

同第一步同样,运行这份代码你就能够看到每一个词语及其对应的频数。须要注意的是,这里有个加载停用词的操做,你须要把停用词表放在当前文件夹下,咱们这里提供一份停用词表下载:stopwords.txt

3. 生成词云

终于到了最后一部分啦!你是否是开心而又满怀激动的心情呢(滑稽,在这一步开始以前,咱们须要先安装须要使用的包,咱们须要用到的包有:

  • pip install matplot
  • pip install scipy
  • pip install wordcloud

打开CMD/Terminal 输入以上命令便可安装,加上以前两个步骤的包,有:

  • pip install jieba
  • pip install codecs
  • pip install pandas
  • pip install numpy

若是你在安装这些包的时候出现了什么问题,请记得在咱们下方评论区提出,咱们会一一解答的哦。

运行目录的文件结构以下:

  • 聊天记录.txt
  • mywords.txt(若是你没有自定义的词的话能够为空)
  • stopwords.txt
  • wordCloud.py
  • ai.jpg (能够为任意的图片,你喜欢就行)

完整代码,wordCloud.py 以下,附有详细的解析:

# coding:utf-8 import jieba import numpy import codecs import pandas import matplotlib.pyplot as plt from scipy.misc import imread import matplotlib.pyplot as plt from wordcloud import WordCloud, ImageColorGenerator from wordcloud import WordCloud def load_file_segment(): # 读取文本文件并分词 jieba.load_userdict("mywords.txt") # 加载咱们本身的词典 f = codecs.open(u"聊天记录.txt",'r',encoding='utf-8') # 打开文件 content = f.read() # 读取文件到content中 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() # 得到分词结果 df = pandas.DataFrame({'segment':segment}) # 将分词数组转化为pandas数据结构 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}) # 按词分组,计算每一个词的个数 words_count = words_count.reset_index().sort_values(by="计数",ascending=False) # reset_index是为了保留segment字段,排序,数字大的在前面 return words_count words_count = get_words_count_dict() # 得到词语和频数 bimg = imread('ai.jpg') # 读取咱们想要生成词云的模板图片 wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf') # 得到词云对象,设定词云背景颜色及其图片和字体 # 若是你的背景色是透明的,请用这两条语句替换上面两条 # bimg = imread('ai.png') # wordcloud = WordCloud(background_color=None, mode='RGBA', 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() 

值得注意的是这里面的bimg和wordcloud对象的生成,咱们知道png格式背景通常是透明的,所以若是你的图像是png格式的话,其生成词云的时候背景色应该设为None,而后mode应该设为RGBA。

咱们还能够控制词云字体的大小和数目的多少,使用下面这两个参数:

max_font_size=60, max_words=3000

将其放入 wordcloud = WordCloud(background_color='white', mask=bimg, max_font_size=60, max_words=3000, font_path='simhei.ttf') 便可

运行前,确保安装了全部的包,而且当前目录下有咱们所须要的全部文件哦

下面就能够用咱们的聊天记录,画心型词云啦!!!

CMD/Terminal 进入代码所在文件夹,运行:python wordcloud.py

获得的图像以下:

喜欢吗?喜欢就拿去用吧!

怎么样,是否是很好看,若是你想要这些图片的原图作一个属于本身的词云的话,请访问python实用宝典的官网的置顶文章,或者点击下方阅读原文直达!还有源代码等着你哦!最后,祝你们有情人众人眷属!七夕完美相会!

相关文章
相关标签/搜索