【趣味案例】谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图
说到词云应该不陌生,不知道的童靴往下看
词云,就是把网络文本中出现频率较高的
"关键词"予以视觉上的突出
浏览者只要一眼扫过文本就可以领略其主旨
瞧 这是不是一个有声音、有画面的小爱心~
今天 我们采集情侣们之间的聊天日常
用此制作一份只属于你们的小浪漫!
第一步,我们需要导出自己和对象的数据~
微信的备份功能并不能直接给你导出文本格式,它导出来其实是一种叫sqlite的数据库。如果说用网上流传的方法提取文本数据,iOS则需要下载itunes备份整机,安卓则需要本机的root权限,无论是哪种都非常麻烦,在这里给大家介绍一种不需要整机备份和本机root权限,只导出和对象的聊天数据的方法。
那就是使用安卓模拟器导出,这样既能ios/安卓通用,又能够避免对本机造成不良影响,首先需要用电脑版的微信备份你和你对象的聊天记录。以windows系统为例:
1. 下载夜神模拟器
2. 在夜神模拟器中下载微信
3. 使用windows客户端版的微信进行备份,如图左下角
4. 点击备份聊天记录至电脑
5. 手机端选择备份的对象
点击进入下方的选择聊天记录,然后选择和你对象的记录就可以啦
6. 导出完毕后打开模拟器,登录模拟器的微信
7. 登录成功后返回电脑版微信登录,打开备份与恢复,选择恢复聊天记录到手机
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 **的软件读取数据
在这之前,我们还需要知道该数据库的密码,根据前人的经验,该密码的公式如下
字符串 " 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后不允许导出,非常不好用,因此还不如我们自己写一个:
在学习过程中有什么不懂得可以加我的
python学习qun,855408893
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容 #!/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')
# 将筛选结果写入 聊天记录.txtdata.close()
cursor.close()
conn.close()
# 关闭连接
记得把csv文件的编码格式转换成utf-8哦,不然可能会运行不下去:
当然你还可以用正则表达式去除以下内容
- 微信送的数据:wxid.*
- 表情:[.*]
不过我觉得这些也是必要的聊天信息之一,留着也无妨,因此在这里就不加入进去啦
最后得到的文本格式就是一行一句聊天内容,处理后我们就准备好进入下一个环节了!那就是令人激动的!生成词云
第二步,根据第一步得到的聊天数据生成词云
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 如下,附有详细的解析:
在学习过程中有什么不懂得可以加我的
python学习qun,855408893
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容 # 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 WordClouddef 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 segmentdef 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_countwords_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学习扣QUN:⑧⑤⑤-④零⑧-⑧⑨③从零基础开始到Python各领域的项目实战教程、开发工具与电子书籍。与你分享企业当下对于python人才需求及学好python的高效技巧,不停更新最新教程!点击加入我们的 python学习圈
【趣味案例】谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图相关推荐
- 谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图
明天又双叒叕是一年一度的七夕恋爱节了! 又是一波绝好的机会!恩爱秀起来! 购物车清空!礼物送起来!朋友圈晒起来! 需要Python软件工具和学习资料的小伙伴可以点击下方链接自行获取 http://no ...
- 程序员的浪漫,你值得拥有!
作者 | 小游子: 来源 | CSDN 博客 今天我们就来盘点一下 GitHub 程序员开源的情人节表白的代码.来一睹大牛们是怎么过情人节的,是怎么跟自己的女朋友表白的?(文中图片均来自项目本身) 前 ...
- object转成实体对象_程序员的浪漫,new一个对象
程序员都喜欢 面向对象编程,但如果你没有对象怎么办?当然是 new 一个对象出来. 面向对象编程 是一种程序设计思想,而不是真正的面向你的对象去编程.如果你真的这么做了,恭喜你获得:你爱我还是爱电脑? ...
- python浪漫代码-使用Python代码的程序员也浪漫
原标题:使用Python代码的程序员也浪漫 代码也浪漫:用Python放一场圣诞节烟花秀! 天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法 ...
- 她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!
css蛋糕 谁说程序员不懂得浪漫,只是程序员的浪漫你不懂!PS:人家都不懂,你再浪漫有啥用,最后还不是单身狗? 说实在的,以前也分享过一个程序员用纯CSS画的一个MAC,代码就三千多行,这个蛋糕虽然代 ...
- Java程序员情人节_盘点程序员情人节的表白,前端程序员最浪漫,后端不服来战...
今天是 2 月 14 日情人节,我看公众号后台有好多人在回复关键字:情人节表白代码.我想,我作为大家的校长,必须给大家送一波福利代码啊!我是真没想到,竟然很多程序员都想用代码表白,还整的挺浪漫的,看来 ...
- 生日快乐程序员的浪漫代码_python告白代码,只属于程序员的浪漫
不知何时,不知何因,程序员这个行业成为大家茶余饭后取乐的无辜群体.只要说到程序员,脑海中就浮现出刻板印象,标配穿搭:格子衫,牛仔裤,黑框眼镜.当然秃顶也是必须的,更狠的吐槽还有邋里邋遢,不懂浪漫,不知 ...
- c++获取子类窗口句柄位置_干货分享:用一百行代码做一个C/C++表白小程序,程序员的浪漫!...
前言:很多时候,当别人听到你是程序员的时候.第一印象就是,格子衫.不浪漫.直男.但是程序员一旦浪漫起来,真的没其他人什么事了.什么纪念日,生日,情人节,礼物怎么送? 做一个浪漫的程序给她,放上你们照片 ...
- OSChina 周一乱弹 —— 程序员的浪漫你不懂
2019独角兽企业重金招聘Python工程师标准>>> 又是新的一周了,你们周末过得怎样呢?你们是在好好地陪妹子玩耍,还是在撸代码? 本人苦逼男程一枚,异地恋.每次女友打电话问我在干 ...
最新文章
- 《机器学习》 梯度下降
- HTML5新特性之WebRTC
- ITK:创建高斯导数内核
- python高手之路(第3版)_Python高手之路(第3版)
- 【笔记】LR录制方式和常用函数
- 【转载国外好文】代工开发一个iOS应用没有那么容易
- P4145 上帝造题的七分钟2 / BZOJ3211花神游历各国
- nodejs真的是单线程吗?
- jquery weui 上拉加载,下拉刷新,问题解答。
- coreos 安装 mysql_在 UOS 上体验 CoreOS
- 电气防火限流式保护器应用场景及选型指南
- Win10登陆界面卡住,进去后无法打开网络相关的设置,谷歌浏览器无法上网
- grasps什么意思中文_中文和日文微信名字是什么意思 163个
- 【项目实战】Python基于孤立森林算法(IsolationForest)实现数据异常值检测项目实战
- 影视后期制作需要用到哪些软件?
- 警告关于测试人员的职场生存,千万要避开这5个坑(不看后悔)
- JS实现将汉字转成拼音实例
- BZOJ 1941: [Sdoi2010]Hide and Seek KDtree + 估价函数
- Mac环境下pandas的安装与学习
- 张小龙现场“约战”跳一跳,发布2018微信全新计划(内附演讲全文)
热门文章
- pytorch torch.Storage学习
- 【计算机网络】万字总结
- 89s52单片机的硬件资源基本使用
- 计算机桌面组成部分教案,‘教案’计算机教案
- xp系统无法自动修复此计算机该怎么解决,xp系统启动修复无法自动修复此计算机的具体办法...
- 饭局上领导劝你喝酒,别说“我不能喝”,高手都用这4种拒酒话术
- spark运行自带例子_运行spark自带的例子出错及解决
- [吴恩达机器学习笔记]11机器学习系统设计3-4/查全率/查准率/F1分数
- poi操作Word创建超链接
- Dr16DT7的使用方法