微信聊天记录分析:用Python描绘我们之间的故事

本文最后更新于:2024年5月29日 下午

微信聊天记录是我们日常交流的点滴记录,其中蕴藏着许多有趣的信息。尤其是对于热恋中的情侣,微信聊天记录包含着很多甜蜜的对话,每一句背后都承载着深深的感情。在这个教程中,我将教你如何用Python对微信聊天记录进行分析与可视化,通过数据描绘独自属于你们之间的点滴故事。跟着这个教程,让我们一起用代码探寻爱情的奇妙之处!

一、准备数据,解锁感情密码

不同品牌的手机获取的微信聊天记录的方式会有所不同,作者的手机是小米的,这部分的实现参考了网上大神的博文

参考资料:

小米手机一次会导出所有人的聊天记录,因此,若需要导出本人和某人的特定聊天记录,需要将其他聊天记录清空,然后利用手机自带的备份功能将聊天记录备份并导出。

二、深情分析,揭秘爱情密码

首先,我们需要借助一些神奇的Python库和模块,包括pandas、numpy、jieba、wordcloud、matplotlib等,为分析之旅做好准备。

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import re
import codecs
from wordcloud import WordCloud, ImageColorGenerator
import jieba
import matplotlib.pyplot as plt
from imageio import imread
import seaborn as sns
import time

在这一步,我们将打开我们心灵深处的对话,读取微信聊天记录,准备解锁感情密码。首先,我们需要读取微信聊天记录的文本文件以及一个包含禁止词的文件。禁止词表中的词将不会纳入词云分析中。穿越禁止词,更能发现隐藏在文字背后的真情。

1
2
3
4
5
6
7
8
# 定义禁止词
stop_word_filename = './data/stopwords.txt'
stop_word = [line.strip() for line in codecs.open(stop_word_filename, 'r', 'utf-8').readlines()]

# 读取聊天记录
file = codecs.open(r'./__message.txt', 'r', 'utf-8')
content = [line.strip() for line in file.readlines()]
contentCut = '\n'.join(content)

中文分词与词云,诉说爱情的美好

用jieba进行中文分词,生成绚丽的词云图,可以展现你们聊天记录中的高频词汇。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 中文分词
segs = jieba.cut(contentCut)
words = [seg.strip().lower() for seg in segs if len(seg.strip()) > 0 and seg.strip().lower() not in stop_word]

# 词云分析
word_df = pd.DataFrame({"word": words})
word_freq = word_df['word'].value_counts()

# 生成词云
word_list = ' '.join(words)
mask = imread(r'./pic/love.png')
wordcloud = WordCloud(font_path=r'./font/STFangSong.ttf', background_color="White", mask=mask, random_state=100, max_font_size=100)
wordcloud.fit_words(dict(word_freq[:80]))
image_colors = ImageColorGenerator(mask)

# 绘制词云图
plt.figure()
plt.imshow(wordcloud.recolor(color_func=image_colors))
plt.savefig('wordcloud_emotion.png', dpi=500)
plt.axis("off")
plt.show()

除了词云,还可以读取聊天记录数据,统计消息数、表情包、图片、语音等信息,了解你们之间的交流习惯。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 读取聊天记录数据
df = pd.read_csv(r'./LN一周年.csv', encoding='utf-8')
chat_data = df.dropna(axis=0, how='all', subset=None, inplace=False)

# 统计消息数
textNum = (chat_data.type == 1).sum()
EmojisNum = (chat_data.type == 47).sum()
picNum = (chat_data.type == 3).sum()
vioceNum = (chat_data.type == 34).sum()
videoNum = (chat_data.type == 43).sum()
linkNum = (chat_data.type == 49).sum()

print(f'在我们的聊天记录中,共有{textNum}条消息,其中包含{EmojisNum}个表情包,{picNum}张图片,{vioceNum}条语音,{videoNum}段视频,{linkNum}个链接。')

太单调了?没有创意?如果这样呢,尽情发挥你的想象吧

1
2
3
4
5
6
7
8
9
# 统计消息数
textNum = np.array([len(content.strip()) for content in chat_data[chat_data.type==1].content]).sum() #文本字数
textMax = np.array([len(content.strip()) for content in chat_data[chat_data.type==1].content]).max() #最长文本的字数
print('截止%d-%02d-%02d,\n我们共发送了%d条消息,\n由泉儿的%d条,娜娜的%d条信息组成;\n其中文字有%d条,共计%d个字,\n大约聊出了%d本小王子,\n最长的一条足足有%d字,相当于%d篇高考作文'
%(time.localtime(chat_data.iloc[-1,[6]]//1000)[0], time.localtime(chat_data.iloc[-1,[6]]//1000)[1], time.localtime(chat_data.iloc[-1,[6]]//1000)[2],
chat_data.shape[0], chat_data.isSend.value_counts()[1], chat_data.isSend.value_counts()[0],
(chat_data.type==1).sum(), textNum,
textNum/17600, textMax, textMax/800)
)
1
2
3
4
5
6
截止2024-01-17,
我们共发送了66826条消息,
由我的25238条,你的41588条信息组成;
其中文字有59077条,共计350658个字,
大约聊出了19本小王子,
最长的一条足足有813字,相当于1篇高考作文

3.2 聊天频率分析

最后,通过时间分布图,将感情的旅程用数据诉说,描绘你们在不同时间段的聊天频率。在开始聊天频率分析之前,我们要知道每条信息的发送时间,“createTime”栏中的数据似乎并不是我们想要的信息,需对其进行转换

1
2
3
4
5
6
7
8
9
10
11
12
# 时间转换
t = chat_data.loc[2:]['createTime']//1000
# time.localtime(t)
year = [time.localtime(ti)[0] for ti in t]
month = [time.localtime(ti)[1] for ti in t]
day = [time.localtime(ti)[2] for ti in t]
hour = [time.localtime(ti)[3] for ti in t]
minute = [time.localtime(ti)[4] for ti in t]
# sec = [time.localtime(ti)[5] for ti in t]
week = [time.localtime(ti)[6] for ti in t]
time_freq = pd.DataFrame({'year':year, 'month':month, 'day':day, 'hour':hour, 'min':minute, 'week':week})
time_freq

做完这一切,你就可以分析任意时段的聊天频率了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 绘制聊天频率分布图
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
sns.countplot(x='month', data=time_freq)
plt.title('月度聊天频率')

plt.subplot(3, 1, 2)
sns.countplot(x='hour', data=time_freq)
plt.title('小时聊天频率')

plt.subplot(3, 1, 3)
sns.countplot(x='week', data=time_freq)
plt.title('星期聊天频率')

plt.tight_layout()
plt.show()

微信聊天记录分析:用Python描绘我们之间的故事
https://northfourta.github.io/2024/02/02/%E5%BE%AE%E4%BF%A1%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95%E5%88%86%E6%9E%90/
作者
Northfourta
发布于
2024年2月2日
许可协议