美文网首页
有效利用囤积狂的微信聊天记录

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

作者: 栽生物坑里的信息汪 | 来源:发表于2019-07-13 15:02 被阅读0次

    前言

    由于某次在某个微信群里跟大家聊到,感觉这几年这个群的聊天话题变化真的很明显,再加上自己微信记录几乎都没删掉的时候(对,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

    参考

    相关文章

      网友评论

          本文标题:有效利用囤积狂的微信聊天记录

          本文链接:https://www.haomeiwen.com/subject/lhaekctx.html