赞
踩
话说这微信真是的,不支持导出聊天记录,费了不少劲,也踩了很多坑,才摸索出一条完美的路,话不多说,直接开始。
1)备份聊天记录至苹果设备
由于此方法利用到软件只支持苹果设备,因此,如果是Android用户,需要将微信聊天记录备份至iphone或者ipad上,iPhone用户可忽略此步骤。该过程利用微信自带的工具即可简单实现,具体路径是:我 -> 设置 -> 聊天 -> 聊天记录备份和迁移 -> 迁移到另一台设备上。注意,可以只备份自己女朋友的聊天记录即可,以免花费过长时间。
2)连接Mac,对iPhone或者ipad设备进行备份
将ipad连接到mac,并打开Mac的itunes开始对ipad进行备份,如下图,注意不要选择加密,否则后续将无法识别。另外,要找到备份文件存储的地方:/Users/yourname/Library/Application Support/MobileSync/Backup,Library(资源库)文件夹默认是隐藏的,百度下怎么显示出来。
3)利用WX Back工具进行聊天记录的导出。
WX Back是一款良心软件,无广告,免安装,且可以秒导出,下载地址为 http://wxbackup.imxfd.com/ ,提供了Mac和Windows版本的,但Windows版本可能有bug,我最后导出是乱码的,Mac版本亲测没问题。将步骤2中得到的备份文件夹拷贝(move也可)到某个固定的路径下,如桌面,并放到名为MobileSyns的文件夹中,即:/Users/yourname/Desktop/MobileSyns/Backup路径,该步骤较为重要,务必确保成功。接着双击下载好的WX Back文件即可,会提示手动切换路径,填写/Users/yourname/Desktop/MobileSyns/Backup即可。
最后,将会成功导出聊天记录,如下图:
可以切换微信号,也可指定联系人,最后将聊天记录输出到制定的路径中即可。
4)聊天记录一览
格式整齐,我太喜欢了,其中index.html是聊天记录的前端展示,可在线展示所有记录;js和css里面是展示所用到的脚本,js里面保存这文字聊天记录相关的内容,audio、video和image里面分别保存这语音、视频和图片的相关信息。
至此,微信聊天记录导出完成!
Talk is cheap, Here is the code
1) 解析聊天记录
步骤1中js文件夹下的message.js文件即为所有的聊天记录,包含文字、语音、emoji、图片、视频等各种信息,词典msg_type_cnt可以帮你统计你们发送的各种信息的条数,变量msg_word_num记录了你们的聊天字数,函数最后返回文字聊天的所有句子。注意,此步骤中,需要打开message.js文件,并将第一行中的“var data = ”字符删除,这样该文件中内容才是json格式,以便被python处理。
''' m_uiMessageType 表示了聊天类型 1: 文字, 3: 图片, 47: emoji, 34: 语音, 43: 视频, 49: 分享, 10000: 撤回 ''' def read_chat_rec(file): stences = [] with open(file, 'r') as f: s = f.read() f.close() s1 = json.loads(s) message = s1['message'] print "total num of chat is: ", len(message) msg_type_cnt = {} msg_word_num = 0 ### msg_word_num 记录聊天中汉字的数量, msg_type_cnt记录聊天的类型 for i in range(len(message)): item = message[i]["m_nsContent"] itype = int(message[i]["m_uiMessageType"]) usr = message[i]["m_nsFromUsr"] ### usr 字段用来区分身份,为空则代表自己,否则是对方 ### 此处是解析自己的聊天记录,若是解析对方的,可改为:usr == "" if usr != "": continue if itype not in msg_type_cnt: msg_type_cnt[itype] = 1 else: msg_type_cnt[itype] += 1 if itype == 1: msg_word_num += cal_ch_num(item) stences.append(item.encode('utf8')) print "msg_word_num is %d, msg_type_cnt is %s:" %(msg_word_num, msg_type_cnt) return stences
2)分词
分词采用了结巴分词,效果还不错,这里面会设计到中文编码的坑,以下的代码较为精简,但是效果很不错,返回聊天原文,以及他们的分词结果。
def get_chat_words(texts, stop_words): text2words= [] for t in texts: try: words = jieba.cut(t.decode('utf8')) except: continue res = [] for w in words: if w.encode('utf8') in stop_words: continue ## 此处比较关键,需先解码为Unicode,才能判断长度 if len(w.decode('utf8')) <= 1: continue res.append(w.encode('utf8')) text2words.append((t, set(res))) return text2words
结果示例如下图
网上有些免费的生成工具,但要么收费,要么不能批量导入,所以干脆自己写一个吧,有现成的包wordcloud,导入即可用,可以根据单词的频率生成词云,也可以特定图片生成特定的形状,代码如下:
def gen_word_cloud(wc_file, input_pic_name, output_pic_name): word_count = get_word_cnt(wc_file) print ("word_count", len(word_count)) mk = imageio.imread(input_pic_name) wc = WordCloud( font_path="./SimHei.ttf", max_words=1000, # 词云中最多显示的词数 background_color="white", # 背景颜色 width = 1500, # 图片宽度 height= 960, # 图片高度 margin= 10, # 图片边缘 mask = mk, # 根据输入图片生成词云的形状 random_state=1, contour_width=1, # 设置图片的边缘,最好加上,否则轮廓不明显 contour_color='blueviolet' # 边缘线条颜色 ) wc.generate_from_frequencies(word_count) # 从字典生成词云 plt.imshow(wc) plt.axis('off') # 关闭坐标轴 plt.show() wc.to_file(output_pic_name) # 保存图片
结果示例如下图:
其实有了统计数据,你可以得出来很多有意思的结论,比如分析top1的词,top10的词,分析排名接近的词,比较你和对方用词的差异……,我是做了一个简单的ppt:
总之,大家发挥自己的聪明才智吧,从聊天记录中发现专属你们两个的浪漫和甜蜜!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。