微信聊天记录是我们日常交流的点滴记录,其中蕴藏着许多有趣的信息。尤其是对于热恋中的情侣,微信聊天记录包含着很多甜蜜的对话,每一句背后都承载着深深的感情。在这个教程中,我将教你如何用Python对微信聊天记录进行分析与可视化,通过数据描绘独自属于你们之间的点滴故事。跟着这个教程,让我们一起用代码探寻爱情的奇妙之处!
一、准备数据,解锁感情密码 不同品牌的手机获取的微信聊天记录的方式会有所不同,作者的手机是小米的,这部分的实现参考了网上大神的博文
参考资料:
小米手机一次会导出所有人的聊天记录,因此,若需要导出本人和某人的特定聊天记录,需要将其他聊天记录清空,然后利用手机自带的备份功能将聊天记录备份并导出。
二、深情分析,揭秘爱情密码 首先,我们需要借助一些神奇的Python库和模块,包括pandas、numpy、jieba、wordcloud、matplotlib等,为分析之旅做好准备。
1 2 3 4 5 6 7 8 9 10 import pandas as pdimport numpy as npimport reimport codecsfrom wordcloud import WordCloud, ImageColorGeneratorimport jiebaimport matplotlib.pyplot as pltfrom imageio import imreadimport seaborn as snsimport 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 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] 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()