导出和女友的微信聊天记录,我用词云分析了我们在说些什么
导出和女友的微信聊天记录,我用词云分析了我们在说些什么
一次有趣的尝试
前言
众所周知,微信聊天数据库是加密的,但并不是无法解密。 目前主流的获取微信聊天记录的方法是用已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

image.png
不知道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
再次感谢文章提到的所有作者和参考代码。 祝大家生活愉快,每天有爱。