有效利用囤积狂的微信聊天记录

前言

由于某次在某个微信群里跟大家聊到,感觉这几年这个群的聊天话题变化真的很明显,再加上自己微信记录几乎都没删掉的时候(对,po主本质上是个仓鼠,信息都是无价的),就提到了可以拿出来做一下分析,然后就产生了这篇文章/教程。
btw 大家也请不要拿这个去做坏事情,并且这里也事先声明,很多微信中涉及的ID什么的大家尽可能不要透露给陌生人,虽然微信没有给出更多的API,但ID本身毕竟还是比名字还可靠地。

这篇文章只是给大家一点小的尝试,通过学习这篇文章的话,大家应该可以学会如何拿到微信记录,并且大概了解了微信记录是怎么储存的,并且了解时间戳与如何对时间序列的数据进行resample,从而获得不同时间间隔的数据。并分时间段的去生成词云。 大概像这样,因为微信记录太多个人信息了,我就放了个高糊的图了

然后文本分析绝对不仅仅这么点东西,大家可以继续挖掘,甚至可以做主题分析,或者进行词语偏好的分析,甚至可以作为定制化的聊天机器人的训练材料,反正只有想不到,没有做不到啦(:з」∠),欢迎大家多玩蛇共同学习python。

大纲

正如把大象放进冰箱只需要三步一样,那么利用微信聊天记录也只有三步

  1. 导出聊天记录
    • IOS系统
  2. 解析导出文件
    • python
  3. 画图

正文

那么利用微信记录的话,我们肯定就很难在手机/平板上进行操作,毕竟又要越狱或者安装语言,就很麻烦,而且手机上的目录结构也比较复杂,这一点我们直接略过。。。所以我选择了从手机上把聊天记录导出到电脑上,来进行操作。

导出记录

关于导出聊天记录的方法其实有很多。。。(大家请小心使用,避免造成数据丢失以及下了流氓软件)


导出微信聊天记录

但是真正能够用来做文本分析的却并不多。。
为什么呢??

就说微信官方的备份与恢复

备份与恢复

其实最后导出的结果,是一个加密后的数据库文件,所以单单凭借这个导出的备份,我们几乎无法做文本分析。

而关于使用安卓系统的,网上也很多,但是似乎大多也是要经过复杂的解密操作,而且首先也必须需要进行ROOT,再加上po主也没有安卓手机,这里就放一些网上的教程好了。

最后终于终于进入这个部分的正题。
简单地说

通过itunes的IOS备份,再加上一个软件wx backup,就可以实现导出微信聊天记录并在电脑上阅读/分析的目的

复杂的操作大家可以详见这个链接,btw现在是win+mac系统都可用这软件的

最后导出来的文件大概长这样。。。


大家直接打开index.html就可以看到导出的聊天记录,其中也可以看到曾经分享过的照片、视频。(音频似乎没有成功导出来)

而我们要使用的则是js/message.js

其中也分享一个小技巧,因为现在大家的手机都普遍容量巨大,而大家的电脑可能都是些固态硬盘256G的,所以对于这种无差别IOS备份的操作,很有可能会使电脑容量不足!尤其是itunes这种无法选择备份目录,只能备份到C盘的“流氓”软件。 反正我手机备份下来有60G+
Win7下更改iTunes备份路径最便捷的方法(收藏一下总没错)
这个亲测win10 + win8也都可以啦,简单地说

通过软链接 (快捷方式)的方式,将原本itunes默认使用的备份地址,链接到一个更大空间的可以自定义的地方(例如移动硬盘之类的)

解析导出的聊天记录

由于这里要使用python的代码去解析,所以要求使用的人有一点python的编程能力,当然抄源代码也是没问题的,就是得知道怎么在自己电脑上安装anaconda, ipython之类的软件了。甚至还得知道怎么安装github上的仓库

简单说一下以上步骤好了

  1. 下载合适自己电脑系统的anaconda
  2. 按图索骥的安装程序
  3. 使用这个app,输入pip install jieba pandas numpy tqdm (后续要使用的软件)
  4. 还是使用上面提到的app,输入jupyter lab
  5. 然后就可以开始愉快的代码之旅了。。
    只要五步就可以学会使用python,买不了吃亏买不了上当了
message_odir = "D:\\Desktop\\微信导出\\群名+id"   # 看导出的文件夹名字
message_path = message_odir + "\\js\\message.js"
data = {}
message = open(message_path,'r',encoding='utf-8').read()
exec(message.replace('var ',''))

由于在js\message.js中,仅仅声明一个变量data,而且这个data中含有类似于python的dict的数据结构,所以我直接使用exec进行执行,并且载入了所有的消息数据到data

进行ID到名字的转化,毕竟大家都看不懂一个ID,还是看名字比较熟悉一点

# chartroom ID
gID = data["owner"]['user']
gname = data["owner"]['name']
# For chatroom
# get all user ID and its name
members = data["member"]
mid2username = {mid: members[mid]['name'] for mid in members}
mid2username.pop(gID)
message部分长这样

大家可以通过自己的方式,观察这个data中的结构,但以下是一个将这个数据转化为一个方便后续使用的DataFrame的方法,因为后面会涉及到时间的分块,所以我还是将其转为数据框来后续使用

all_messages_df = pd.DataFrame.from_records(data['message'])
all_messages_df.loc[:,'fromWho'] = [mid2username.get(record,'碎碎念达人')
# 碎碎念达人 是po主的用户名
                                    for record in all_messages_df.loc[:,"m_nsRealChatUsr"]]
all_messages_df.loc[:,'datetime'] = [get_time(record)
                                     for record in all_messages_df.loc[:,"m_uiCreateTime"]]

all_messages_df= all_messages_df.loc[:,["fromWho","datetime","m_nsContent"]]
all_messages_df = all_messages_df.set_index("datetime")

上面是基本的数据处理过程,这里再讲一下大家所重点想看的一点。
文本分析在获取数据并清洗数据之后,当然要开始做分词处理(不是必需的一步,但是是重要的一步)
这里使用“结巴”中文分词:做最好的 Python 中文分词组件
作为分词的工具包,使用起来也十分方便,如果实在上述的pd.DataFrame的情况下的话,再结合amueller/word_cloud,只需要以下的一丢丢的代码。

total_seg_word = jieba.lcut(' '.join(all_messages_df.loc[:,'m_nsContent']))
filtered_seg_word = remove_word(total_seg_word)  # 非必需的一步,需要自己定义停用词

import wordcloud
txt = ' '.join(filtered_seg_word)
w = wordcloud.WordCloud(font_path = 'msyh.ttc' , 
                        width = 2000, 
                        height = 1400, 
                        background_color = 'white',
                        collocations=False,
                        colormap ='cividis',
                       max_words =500) #使用微软雅黑字体
w.generate(txt)
w.to_file(message_odir + '\\total.png')

就可以画出一个词云图片来。
形如

词云demo

关于停用词
由于日常交流的语言中存在大量的无意义、语气、语法助词,所以需要一个词汇表去记录这些词,这个词汇表我们可以称之为停用词表,如果不去除的话,最后生成的词云中会存在大量的。。。。就像下面这个一样

不去除停用词的后果

关于画图和代码

代码部分我觉得还是jupyter notebook展示会好一点,所以把整个完整的流程包括停用词表都放到github上了。
以下是到那个notebook的链接(部分结果我去掉了output,避免出现个人信息之类的(:з」∠),有意见我也没办法)
note book demo
wechat dig

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容