导出多年微信聊天记录,我用可视化分析了出自己的口头禅

为了能让读者对本文实现的效果有最直观的感受,本文中有四个实践案例,最后生成的图片如下:

准备工作:为了全面分析聊天记录,我们先要进行数据同步。将移动设备上的聊天记录都同步到MacBook上。在移动设备上点击「设置>通用>聊天记录迁移与备份>迁移」并根据实际情况选择「迁移全部聊天记录」或者「迁移指定聊天记录」。以笔者的52GB聊天记录为例,花了50分钟左右。

目前macOS平台有Intel和arm两种架构,两个构架使用的获取密钥的方法不同,请根据自己的MacBookCPU构架,选择对应的解密方式操作。

加密密钥在第二行,也就是353e开头的那行,但是这个十六进制的密钥,所以在实际使用的时候,需要在前面加上0x这两个字符,下一步使用这个密钥的时候会再具体说明。

安装lldb:lldb是Xcode内置的开发者工具,可以用来调试C/OC/C++/Swift程序的调试器。为了能够使用lldb,需要先安装一下开发者工具。在终端中执行lldb命令,弹出如下所示的提示框,那就是说明没有安装过lldb,根据指示进行安装即可。如果以前执行过xcode-select--install或者已经安装过Homebrew的话,电脑上应该已经有了这个工具。

正确安装lldb之后可以尝试输出版本号,如果能够正确输出版本号,就代表着安装成功了。如下图所示作者使用的lldb版本是:lldb-1403.0.17.67

输入命令brset-nsqlite3_key即可,lldb回显:Breakpoint1:2locations.,说明lldb已经成功在这两个地方打上了断点。

然后继续输入命令c回车即可,lldb回显:Process59241resuming,此处的c即为continue,执行完这条命令之后,程序就能正常继续向下执行,直到触发断点。

最后一步,输出内存里的密钥值。在日常生活中,大家可能听说过:「电脑上临时存储数据,经常会说把数据存在内存里,因为这样比较快等类似的话」。但是很少有人会直接跟内存去打交道。但是现在在lldb的帮助下,就可以直接读取到内存的值,此处要读取的就是数据库的密钥。

IntelCPU构架命令memoryread--size1--formatx--count32$rsi

armCPU架构命令memoryread--size1--formatx--count32$x1

对比上一个小节,使用ptrsx-dumper获取的密钥:353e9afab4b6422981d110d65e6d555557f1aca0afaa4431a5dab66fef384596,除了开头需要手动补全的0x之外完全一致。

在打开的Finder中,向外回退两层目录,所有的msg_数字.db里面存储的都是聊天记录。

#在桌面上创建WeChatDB目录mkdir~/Desktop/WeChatDB#切换到数据库文件所在的目录,不要直接复制此处的路径,直接从Finder拉到终端里cd/Users/james/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\Support/com.tencent.xinWeChat/2.0b4.0.9/5a22781f14219edfffa333cb38aa92cf/Message#把所有的msg数据库文件拷贝到WeChatDB目录cpmsg*.db~/Desktop/WeChatDB#在WeChatDB目录里创建空文件夹,从db0到db9mkdir~/Desktop/WeChatDB/db{0..9}最终效果如下图所示,把所有的db数据库文件都拷贝到新建的WeChatDB目录下,并创建了从db0到db9十个空文件夹。

使用DBBrowserforSQLite任意打开一个数据库文件,此处有三个注意点:

密码类型:选择「原始密钥」

密码,第一种使用ptrsx-dumper获取到的密码前面没有0x字符,需要自己手动加上,第二种Python解析出来的密码可以直接使用,例如此处作者填写的密码就是:0x353e9afab4b6422981d110d65e6d555557f1aca0afaa4431a5dab66fef384596

加密设置:选择「SQLCipher3默认」

切换到「浏览数据」选项,通过选择不同表就可以查看和不同好友之间的聊天记录,如下所示就是一份聊天记录。其中模糊部分就是聊天信息的具体内容。

但是这样的浏览意义有限,可以将所有的聊天记录都导出JSON,以便接下来使用Python进行数据分析。前往「文件>导出」,点击「表到JSON…」

在弹出的表选择框中,按下command+A选择全部的数据表,也就是全部的聊天记录,继续点击「保存」。

如下图所示,就是全部数据库都导出之后的效果

接下来将会大量使用Python来实现绘制词云,绘制表格,生成Excel等功能,所以为了避免缺少各种库而导致报错,可以提前将环境都准备,使用如下命令安装所有依赖库:

pip3installwordcloudmatplotlibpandasjiebamplfontsimageioopenpyxlnumpy如果读者是使用conda来配置虚拟环境,也可以通过conda来创建虚拟环境来运行脚本:

使用完成之后如果退出删除环境,使用以下两条命令:

前置知识有了,就可以开始动手写代码了。制作词云图片,只需要提取出所有messageType等于1的记录,并把这些聊天记录进行分词之后,就可以制作词云了。

那么新的问题来了,如何快速找到那个好友/群聊对应的JSON文件?使用grep命令即可。找到想要生成词云的群聊,任意选择一句聊天记录,只要和别的群有一定区分度即可。例如图中的「每次放烟雾弹都有你」就是一句比较有区分度的话,其他群里不太可能有人发过类似的话。

打开终端,使用grep命令指定在WeChatDB目录下搜索这句话出现在哪个文件里即可,命令如下:

快速写一个Python脚本验证一下想法,但是可以看到,msgContent除了记录消息信息之外,还在第一行标记了是谁发的这条消息,这并不是期望的结果,所以需要对程序进行调整。

上图中,捂脸、偷笑、破涕为笑这几个都是表情,由于大家经常发这几个表情,所以占了比较大的面积。但是这样的词不具有生成词云的意义。所以可以引入wordcloud的stopwords停止词功能,将这些不太重要的词排除掉。

不少人会使用词云来生成和爱人的聊天记录图片,在这种场景下,可以在词云参数里配置一张爱心图片的遮罩,会更加符合使用场景需求。接下来就要开始设置爱心遮罩了。首先需要一个爱心的图片,网上的图片由于清晰度不够,生成的效果欠佳,所以可以自己绘制一个。将两个圆的半圆部分和正方形混合,再设置一下颜色,旋转315度即可得到一个高清自制的爱心图片。步骤截图如下:

更新后的代码如下所示:

自定义完了形状,为了让这张图片更加贴合主题,还可以再给它换一个背景颜色。单独摘出词云背景颜色的定义参数来看,只需要传入对应颜色名字即可修改背景颜色。除此之外还可以传入六位十六进制的RGB值,通过hexcode直接定义颜色,用这种方法可以定义任意一种颜色。

用#f0c9cf替换原来代码中的skyblue,就可以替换背景颜色了,效果图如下。

关键词出现频率分析完了,再对刚才忽略掉的表情进行专门统计。在上一小节的操作中,已经获取到了所有的表情定义,但是还不能直接拿来使用。重新放一下刚才上面这张配图,注意看它的表情是放在方括号里的。所以为了准确统计到每个表情数量,需要对原始表情文本重新加工一下。

此处依旧使用sed来处理一下表情数据,把它们变成带方括号的元素形式,方便接下来在Python中统计。

但是同时也发现了一些不足之处,有一部分表情从来都没发过,它们的计数是0,没有统计意义需要直接剔除掉。只需要一行代码即可实现:

接下来这部分pandas的代码都是ChatGPT实现的,如果读者有自己的个性化筛选或者排序需求,也可以试试让ChatGPT实现。对于pandas这种有固定语法且资料丰富的开源库来说,使用ChatGPT来生成对应代码的效率和准确性还是比较高的。

将数据复制到Numbers里,生成二维条形图,根据自己的喜欢修改一下颜色,添加必要的文字说明。此处为了做出的图表便于展示,只选择了前30条数据制作图表。

刚在上面的步骤中,为了演示添加指定单词统计的功能,将「哈哈」这个单词添加到了统计数据里。如下图所示,「哈哈」这个单词加起来的数量,已经比前三个表情的总和还多了,说明这个群聊气氛还是比较欢乐的。

再看到旺柴表情包,在表情的统计数量里也是一骑绝尘,断崖式地领先于其他各个表情包。特地算了一下,旺柴表情包在所有表情包里发送占比33%

如果想要更直观地体会一下如何从UnixTime转换到方便阅读的日期文本,可用使用命令brewinstallcoreutils安装GNU核心工具包,然后就可以使用gdate命令来转换UnixTime了。

经过上面的数据清洗、时刻分区和时刻排序之后,现在已经得到了「时刻-消息数量」关系字典,对于这样的x-y数据,使用matplotlib来生成二维柱状图是不错的选择。但是在此之前,还是和wordcloud一样的操作,需要配置一下中文字体,使得图片上能够正常显示中文。

此处配置中文字体的方式与wordcloud有所不同,matplotlib有专门用于管理字体的程序。在「环境配置」小节中已经安装过了,只要初始化一下就可以使用,命令如下:

#初始化mplfontsmplfontsinit如果稍后发现依旧无法正常显示中文,还有另一种解决方式,通过mplfonts导入本地的其他中文字体。例如在项目目录下有一个SIMSUN.ttf字体文件,使用如下命令也可以添加这个字体。

#导入本地字体mplfontsinstall--updateSIMSUN.ttf只需要以上简单的一条命令,即可完成中文字体的配置。maplotlib这一部分的代码比较简单,直接上代码来看:

直接上代码,读取文件,读取msgCreateTime的值,使用datetime库去解析UnixTime,这是上一个小节的内容,此处不再赘述。但是值得注意的是,此处作者将UnixTime解析成了%Y%W的格式。%Y是用四位数字表示的年份,%W是用两位数字表示的周数,例如当前的写稿日期2023年8月23日,是今年的第35周,那就标记为202335。

在week变量的后面加上了一个数字1,这是因为datetime库里第一周是用00表示,此处加一让它变为01更加符合大众的计数习惯。

下面就是一个数据结果的例子。拿202328这条数据来看,后面跟着[0,0,0,0,0,38,0]这样一个数组,代表周一发了7条消息,周二3条,周三周四0条,周五28条,周六0条,周末31条。

{202328:[7,3,0,0,28,0,31],202329:[20,0,0,16,0,0,0],202330:[0,0,78,10,7,0,0]}接下来就是代码实现,因为上面定义的statistics_dict里没有任何key,如何直接去set这个value会报错找不到这个key。所以要先判断一下当前循环的「年份周数」key是否存在,如何不存在就先进行初始化,然后再赋值。下面这段代码中从6到9行就是「年份周数」key的初始化。初始化完成之后,将对应天数的索引位置数值+1。在datetime库中使用%w来表示解析的日期是星期几,从0–6分别代表从周一到周末。

最后打印一下statistics_dict字典,可以看到已经正确收集到了所有的统计数据。

直接上代码,将元组里第0个元素追加到y_labels,第1个元素追加到values,可以看到最终的结果符合预期。

THE END
1.数据清洗的重要性与技巧:提升大数据分析的准确性和效率提升模型性能:在机器学习和数据分析领域,模型的性能在很大程度上依赖于输入数据的质量。数据清洗包括特征选择和特征工程,这些步骤可以帮助模型更好地识别数据中的模式,从而提高模型的预测能力。 节省时间和资源:在数据分析的早期阶段进行数据清洗可以避免在后续阶段进行昂贵的修正。自动化数据清洗流程可以进一步节省时间和资https://blog.csdn.net/Shaidou_Data/article/details/144110971
2.国外客商数据清洗示例不完整的数据会污染数据库,降低其业务质量。 数据清洗,通常也称为数据清理,实际上不是对数据库的单个活动,而是涉及多种技术使用的整个过程。他们的目标是:拥有一个干净、可靠、一致和完整的数据库。干净的数据无非就是高质量的数据,我们可以信任的数据,并可以根据这些数据做出正确的决策。在商业领域,据估计每年有25https://36kr.com/p/2707385155614849
3.数据清洗的概念及实战案例(配图)!!!51CTO博客# 数据分析的过程和别的过程没什么区别 只要明确思路 其他都不难 拿做菜举例 # 类比定义 数据分析过程 做菜过程 明确需求 明确做什么菜品 收集采集 去菜市场买菜 数据清洗 洗菜切菜配菜 数据分析 炒菜 数据报告 + 数据可视化 拍照发朋友圈吃 # 专业定义 https://blog.51cto.com/u_15127637/4278148
4.数据清洗HRTechChina.com如何清洗人力资源分析数据?给你6个详细的步骤指南!数据清理是人力资源分析中的关键因素。在你分析数据之前,你需要对数据进行 "清洁"。在这篇数据清理指南中,我们将解释为什么数据清理很重要,以及你如何进行数据清理。在文章的底部,我们附上了一个有用的数据清洗信息图。 在数据分析中常说的一句话是。"垃圾进,垃圾https://www.hrtechchina.com/tag/%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97/
5.如何进行数据清洗和预处理?如何进行数据清洗和预处理? 收藏 在数据分析和机器学习任务中,数据清洗和预处理是非常重要的步骤。这些过程可以帮助我们从原始数据中提取有价值的信息,并减少由于数据质量问题导致的误差和偏差。 本文将介绍数据清洗和预处理的基本步骤和技术,并提供一些实践建议和例子。https://www.cda.cn/bigdata/202679.html
6.“是什么让我们‘一见钟情’?”——基于“快速约会”数据的分析及我们常说“一见钟情”,但又是什么因素导致了一见钟情呢?哥伦比亚大学的一项基于一次“快速约会”结果的实验数据给我们提供了丰富的研究背景。利用一些数据科学中基本的数据处理手段以及R中的可视化工具,我们获得了许多有趣的结论。 二、数据清洗 此数据集原本有195列数据。但是考虑到我们的目标是预测两人配对http://www.stat.tsinghua.edu.cn/student-achievement-display/%E6%98%AF%E4%BB%80%E4%B9%88%E8%AE%A9%E6%88%91%E4%BB%AC%E4%B8%80%E8%A7%81%E9%92%9F%E6%83%85%EF%BC%9F-%E5%9F%BA%E4%BA%8E%E5%BF%AB%E9%80%9F/
7.Prompt用得好,增长工作下班早1.数据清洗 你是一位资深数据分析师,具备深厚的数据分析技能与行业经验。你擅长应用各种数据分析工具和技术,对数据进行挖掘、整合、分析,现在我有一份销售数据,是jason格式的,帮我把数据处理一下,直接输出表格。 2.找数据分析思路 你是一位XX行业的市场营销分析专家,请根据这份数据集合,给出4个不同方向的分析主题https://www.niaogebiji.com/article-645093-1.html
8.玩转逻辑回归之金融评分卡模型消费金融风控联盟数据预处理主要包括数据清洗,变量分箱和 WOE 编码三个步骤。 2.3.1 数据清洗 数据清洗主要是对原始数据中脏数据,缺失值,异常值进行处理。关于对缺失值和异常值的处理,我们采用的方法非常简单粗暴,即删除缺失率超过某一阈值(阈值自行设定,可以为30%,50%,90%等)的变量,将剩余变量中的缺失值和异常值作为一种状态https://www.shangyexinzhi.com/article/5177142.html
9.如何用Excel实现多重条件匹配与分段计价日记2、生成的Excel不能直接使用,需要数据清洗。大概就是: a、去掉样式,去掉空白行列。 b、替换无法识别的字符,数据转为纯数字。 c、从文本中识别数据,比如要将9行和11行的包裹类型、长、宽、高提取出来,转化为我们需要的标准化数据表格式,这种格式能够被函数识别并匹配包裹类型和报价。 https://m.douban.com/note/815266757
10.机器学习数据清洗之识别异常点数据是现代社会中的一种宝贵资源,但在利用数据之前,我们需要进行数据清洗以确保数据的质量和准确性。 异常值是数据中常见的问题之一,它们可能会对分析和建模产生负面影响,因此识别和处理异常值是数据清洗过程中的重要步骤之一。 本文将介绍异常值的概念、危害以及与缺失值的比较,并探讨了多种识别异常值的方法,包括基于https://www.jianshu.com/p/6676be6cdae4