banner
毅种循环

毅种循环

头顶铁锅接收宇宙能量

导出和女友的微信聊天记录,我用词云分析了我们在说些什么

一次有趣的尝试

前言#

众所周知,微信聊天数据库是加密的,但并不是无法解密。
目前主流的获取微信聊天记录的方法是用已 ROOT 的手机提取,;第二种为通过 Apple iTunes 备份(非加密,非侵入式备份然后获取)。
这里所说的两种办法网上都有很多文章,感兴趣的读者可以搜索看,我不在累叙这个过程,此文章主要说明一种侵入式的,PC 客户端可以做到的方法。

过程:#

微信聊天记录存储在数据库中,格式为 sqlite,也就是后缀为 DB。
但是加密了,所以需要先获取到解密密钥。解密密钥的获取一般都是在内存中,所以需要微信在登录状态下才能获取到。

解密数据库:#

微信数据默认情况下位于 C:\Users\xxx\Documents\WeChat Files\,而聊天记录数据库位于该目录下面的 wxid_xxxx\Msg\Multi。聊天记录文件命名一般是 MSG.db,超出 240MB 会自动生成 MSG1.db,以此类推
image.png

参考 GitHub 脚本利用:https://github.com/0xlane/wechat-dump-rs
目前我的微信版本是 3.9.7.25,到这个版本都是可以解密的,作者更新的基址也同样有效。
执行 - a 之后应该会在 temp 目录生成一个不加密的 MSG.db 文件。
可以用 navicat 之类的打开。
image.png
聊天记录部分是存在与 MSG 表里,大概如下:

image.png
需要关注的字段有:
strtalker: 发送人微信 iD
StrContent:消息关键字

不知道 ID 怎么办 也很简单 全局搜索你曾经发送过的聊天记录,找到后筛选该值的所有匹配,
然后使用转储即可,我这里建议转储到 xlsx 表格里面。

到表格里面就更简单了,筛选出 StrContent 那一行到 TXT 里面,去除所有的字符和英文即可(并不严谨)
我是用了 python 处理了表格,参考代码如下:

import pandas as pd
import re

# 读取表格数据
df = pd.read_excel('cy.xlsx', sheet_name='Sheet1')

# 定义函数去除非中文字符
def remove_non_chinese(text):
    pattern = re.compile(r'[^\u4e00-\u9fa5]')  # 匹配非中文字符的正则表达式
    return re.sub(pattern, '', str(text))  # 使用正则表达式替换非中文字符为空字符串

    # 应用函数去除非中文字符
df['yue'] = df['yue'].apply(remove_non_chinese)  # 将'column_name'替换为你要处理的列名

# 保存处理后的表格数据到新的Excel文件
df.to_excel('processed_file.xlsx', index=False)  # 将'processed_file.xlsx'替换为你想要保存的文件名

print("处理后的表格数据已保存到 processed_file.xlsx 文件中。")

处理后的结果大概是这样的,比如我的聊天记录:
image.png

统计词频并分词#

分词需要用到中文停词表,我这里使用的哈工大的停词表
该项目地址如下:https://github.com/goto456/stopwords/blob/master/hit_stopwords.txt
提供一个分词代码:

import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from collections import Counter

# 读取文档数据
df = pd.read_excel('processed_file.xlsx', sheet_name='Sheet1')

# 去除无效的空行数据
df = df.dropna(subset=['yue'])  # 将'column_name'替换为你要处理的列名

# 获取文档内容
documents = df['yue'].tolist()  # 将'column_name'替换为你要处理的列名

# 加载中文停用词表
with open('hit_stopwords.txt', 'r', encoding='utf-8') as file:
    stop_words = [line.strip() for line in file]

# 分词和去除停用词
tokenized_documents = [word_tokenize(doc) for doc in documents]
filtered_documents = [[word for word in doc if word not in stop_words] for doc in tokenized_documents]

# 计算词频
word_frequencies = Counter([word for doc in filtered_documents for word in doc])

# 创建词频DataFrame
df_word_freq = pd.DataFrame(list(word_frequencies.items()), columns=['词语', '词频'])

# 按词频降序排序
df_word_freq = df_word_freq.sort_values(by='词频', ascending=False)

# 保存结果到新的Excel文件
df_word_freq.to_excel('word_frequencies.xlsx', index=False)

print("词频结果已保存到 word_frequencies.xlsx 文件中。")

结果如下:
image.png

哈哈哈哈,还挺快乐的。

生成词云#

网上有很多项目可以生成词云,但是我找来找去没找到合适的,适合中文的,用了一个在线的服务,感兴趣的可以自行斟酌使用在线服务,如果有好的词云分析的可以留言推荐给我。
大概内容如下:

image.png

说明我们之间聊天真的很有意思,每天都是哈哈哈(bushi。

End#

再次感谢文章提到的所有作者和参考代码。
祝大家生活愉快,每天有爱。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。