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#

再次感謝文章提到的所有作者和參考代碼。
祝大家生活愉快,每天有愛。

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