从安卓手机ROOT提取微信聊天记录到利用Python进行词云分析全过程

刚刚来到了2018年,正值女票生日将近。想想这一年来我俩的聊天记录也不少(导出后一看十个月的微信文字聊天记录将近8万条 ^-^),于是就有了将我们的聊天记录导出来制作成词云,或者分析一下她说的最多的一句话是什么?还打算做个预测模型,输入一个句子然后让模型预测下是她说的还是我说的,哈哈,想想还有点小激动呢。其中的一个难点在于微信的聊天记录不能直接导出,需要手机root后再用数据库解密才行,由于以前对手机root不熟悉,什么线刷、卡刷、成砖等概念也略模糊,这个过程也是我花时间最长的地方。加班加点一共折腾了两天,总算是有点小成果,下面跟大家分享一下这个过程中踩过的坑以及整个流程,相信能给以后有这种想法的人一点借鉴。第一次写,不喜勿喷。

目录

 

 

1.手机ROOT

首先声明,本人所用的手机型号为华为荣耀8 FRD-AL10。其他型号的安卓机root过程请自行百度,root完成后再接着看后面几节的内容。以下为ROOT五部曲,其他的安卓机大同小异。

1.1备份!

要root的同学注意了!一旦你有了要root 的想法,在动手之前一定要先备份。用数据线将手机连接电脑,打开开发者模式的usb调试(找不到开发者模式的在 系统设置->关于手机->版本号 处狂戳即可)。然后用华为手机助手备份通讯录、APP数据、相册等。如下图 


 

谁说解锁不会清空手机所有数据的!我会跟你说我就是以为解锁不会清空数据所以导致手机所有数据都没了吗?没了吗?了吗?吗? 
那有人就会说了,数据都被清空了还分析个p啊,洗洗睡吧!幸亏我刚好在微信电脑客户端备份了和女票了聊天记录,而且只备份了她的,导致损失一下子降到百分之十了,哈哈。有朋友想问微信聊天记录在哪备份的,见下图(备份与恢复那) 


这里写图片描述

 

1.2 获取解锁码

首先声明一下,解锁可能会让你的手机失去保修,慎重考虑! 
华为手机想要root要先解锁,点击解锁地址后,用华为账号登入,点击同意协议并下一步,这里要输入手机相关的信息来获取解锁密码。 


 

如果你的手机系统已经升级到最新版本(EMUI5.0之后),请在第一项做相应的选择。之后的序列号等都很容易填,不会填的点相应文本框后面的如何填写即可。 
点击提交后便可得到十六位解锁密码。

1.3 华为手机助手将系统回退到可以root的系统版本

在解锁前,请确保你的手机系统版本是支持root的,一般如果你已经升级到最新版的系统,那是不能root的,需要将系统回退到可以root 的旧版本。以下是目前可root的系统版本号。 


 

切记!如果你的系统不在这上面,那就先做系统回退,再解锁!否则,你还得重新上锁做系统回退再解锁。。。可怜的我就是这样子白费了好多功夫。。 
接下来是怎么做系统回退,我是将系统回退到图中的EMUI 5.0 B368。 


 

系统回退在华为手机助手电脑端:系统更新->切换到其他版本->恢复 这样它会退到刚买的新手机时的版本,之后我们同样在系统更新这里再将其升级到5.0 B368版本。 


 

 


 

 


 

1.4 下载fastboot并解锁

先下载adb 工具包链接在这,然后按照官网解锁教程一步一步解锁即可。 
在cmd中要先用cd命令进入adb工具包的文件夹里。 


 

1.5 用YoRoot_V1.1一键root

一键root的教程请移步这里,这里说的很清楚明白。当然,有些人在这里一下就成功了,有些人在这会出现各种莫名的问题,我就属于后者,各位就各安天命,如果实在有解决不了的问题,那就花点钱请人帮忙吧。在这随便展示几张图仅供参考 


 


 

 


 

仅针对荣耀8的手机root部分就讲到这了,以下部分就是通用的了。

2.提取微信聊天记录并导出

这部分参考知乎上DADAman的高票回答来做。但是!其中有一些坑我说一下,供各位参考。

2.1 首先

针对评论中提到的新版微信的uin存放的文件夹改变的事,我觉得在Chrome采用抓包的查看方式更方便,请看这里

2.2 其次

有相当相当多的人在评论中提到,通过IMEI和UIN得到的数据库密码不对!如下图,这个问题我也纠结了好久好久,看到下图,一开始我以为IMEI和UIN之间要用“-”分隔。实际上,原来楼主的uin是负数,所以造成了这种假象,我们要做的只需要把两者直接连到一起,中间不需要任何分隔符。 
这里写图片描述

2.3 最后

原文中的sql语句只能显示结果,并不能导出到csv或者txt文件。评论中有相当一部分人烦恼这个问题。经过探索,我发现要将查询语句换成创建表的sql语句,代码如下:

create table 聊天记录 as select datetime(subStr(cast(m.createTime as text),1,10),'unixepoch', 'localtime') as theTime,
case m.isSend when 0 then r.nickname when 1 then '我'end as person,
m.content
from message m inner join rcontact r
on m.talker = r.username
where m.type=1 and r.nickname='对方微信昵称';

执行之后就会创建“聊天记录”这个表,通过 File->Export->Table as csv File 找到“聊天记录”并导出。 
这里写图片描述

3.用Python制作词云

直接上code,不解释。 
额,还是说明一下,由于聊天记录中不仅有文字,还有各种奇怪的表情符号,因此,‘gbk’不能解码时,可以用解码能力更广的‘gb18030’解码。

3.1 探索数据

首先,导入pandas解析上一节导出的聊天记录 
这里写图片描述

接下来,来看看我们说的最多的话和次数 -^–^- 
带有中括号的表示表情符号 
“。。。”居然说的比晚安还多,我擦 


 

还好有些话就说了1次,吓死宝宝了。。

 


 

好啦,不逗比了,开始制作词云吧

3.2 准备工作

制作词云需要引入wordcloud包和中文分词包jieba。不会安装的看这里。jieba安装更简单,直接输入:pip install jieba

###将各自的话分开保存####
df1 = df[df.person=='我']
df2 = df[df.person=='Pluto']
df1.content.to_csv('MyWords.txt',index=False)
df2.content.to_csv('HerWords.txt',index=False)

####自定义词云色调#########
#自定义调色调的
from numpy import  *
def color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    """
    :param word:
    :param font_size:
    :param position:
    :param orientation:
    :param random_state:
    :param kwargs:
    :return:
    Description:
        调配词云中文字的颜色
    """
    return "hsl(210, 100%%, %d%%)" % random.randint(10, 80)  # 这里以蓝色为基本色调

3.3 生成词云

###生成她的词云###############
from wordcloud import WordCloud,ImageColorGenerator
import codecs
import jieba.finalseg
#import jieba.analyse as analyse
from scipy.misc import imread
import os
from os import path
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont


# 绘制词云
def draw_wordcloud():
    #读入一个txt文件
    comment_text = open('HerWords.txt','r',encoding='utf-8').read()
    #结巴分词,生成字符串,如果不通过分词,无法直接生成正确的中文词云
    cut_text = " ".join(jieba.cut(comment_text))
    #d = path.dirname(__file__) # 当前文件文件夹所在目录
    color_mask = imread("爱心.jpg") # 读取背景图片
    cloud = WordCloud(
        #设置字体,不指定就会出现乱码
        #font_path="hwxk.ttf",
        font_path = 'C:/Users/Windows/fonts/msyh.ttf',
        #font_path=path.join(d,'simsun.ttc'),
        #设置背景色
        background_color='white',
        #词云形状
        mask=color_mask,
        #允许最大词汇
        max_words=2000,
        #最大号字体
        max_font_size=40
    )
    #print(cut_text)
    word_cloud = cloud.generate(cut_text) # 产生词云
    word_cloud.to_file("herWordCloud.jpg") #保存图片
    #  显示词云图片
    plt.imshow(word_cloud)

    #使词云颜色跟背景图片颜色一致
    img_color = ImageColorGenerator(color_mask)
    #word_cloud_color = cloud.recolor(color_func=img_color) #图片色调
    word_cloud_color = cloud.recolor(color_func=color_func) #自定义色调
    plt.imshow(word_cloud_color)
    word_cloud_color.to_file("herWordCloud_color.jpg")

    plt.axis('off')
    plt.show()
draw_wordcloud()
########生成我的词云#############
from wordcloud import WordCloud,ImageColorGenerator
import codecs
import jieba.finalseg
#import jieba.analyse as analyse
from scipy.misc import imread
import os
from os import path
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont


# 绘制词云
def draw_wordcloud():
    #读入一个txt文件
    comment_text = open('MyWords.txt','r',encoding='utf-8').read()
    #结巴分词,生成字符串,如果不通过分词,无法直接生成正确的中文词云
    cut_text = " ".join(jieba.cut(comment_text))
    #d = path.dirname(__file__) # 当前文件文件夹所在目录
    color_mask = imread("爱心.jpg") # 读取背景图片
    cloud = WordCloud(
        #设置字体,不指定就会出现乱码
        #font_path="hwxk.ttf",
        font_path = 'C:/Users/Windows/fonts/msyh.ttf',
        #font_path=path.join(d,'simsun.ttc'),
        #设置背景色
        background_color='white',
        #词云形状
        mask=color_mask,
        #允许最大词汇
        max_words=2000,
        #最大号字体
        max_font_size=40
    )
    #print(cut_text)
    word_cloud = cloud.generate(cut_text) # 产生词云
    word_cloud.to_file("MyWordCloud.jpg") #保存图片
    #  显示词云图片
    plt.imshow(word_cloud)

    #使词云颜色跟背景图片颜色一致
    img_color = ImageColorGenerator(color_mask)
    #word_cloud_color = cloud.recolor(color_func=img_color) #图片色调
    word_cloud_color = cloud.recolor(color_func=color_func) #自定义色调
    plt.imshow(word_cloud_color)
    word_cloud_color.to_file("MyWordCloud_color.jpg")
    plt.axis('off')
    plt.show()
draw_wordcloud()

此处解释一下,如果想生成特定形状的词云,需要一张图片,如代码中的“爱心.jpg”。该图片必须以白色为背景,则生成的形状为该图非白色区域。至于怎么得到这样一张白色背景,特定形状的图片,有很多p图软件可以做到,比如最简单的美图秀秀。。。

3.4 词云效果

分享下我生成的几张图 


 

 

 


 

后面会更新利用朴素贝叶斯模型,输入一句话预测是我说的还是女票说的,请移步这里

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值