0%

微信聊天记录制作词云图

本文记录了从微信聊天记录导出到制作完成词云图的过程

利用了python,GitHub开源项目完成,默认了解python和mysql基础知识。

设备:Windows、ipad

导出微信聊天记录(有IOS/IpadOS设备)

首先我们需要将手机端的聊天记录(手机端的聊天记录比较完整)传送到微信端,这一步需要大家首先有一台苹果设备,利用iTunes备份聊天信息。

  1. (安卓用户)打开微信,找到设置->聊天->聊天记录备份与迁移->迁移聊天记录到另一台设备,然后选择想要的聊天记录,最后用苹果设备扫描出现的二维码,等待传输完成即可。

  2. 当苹果设备备份完成后,下载iTunes,用电脑连接苹果设备,这时候在iTunes上会出现一个设备图标,点击并打开

  3. 点击摘要->备份->本电脑->立即备份,等待片刻使其备份完成。

  4. 在Windows中,聊天记录一般在C:\Users\用户名\AppData\Roaming\Apple Computer\MobileSync\Backup内,使用WechatExporter-WindowsWechatExporter-MacOS来解析文件,之后图片及聊天记录就会存在选定的文件夹中。若仅需要聊天记录文件的txt文件,则在格式中选择文本即可。

聊天记录入库

至此文件解析成功,接下来就是使用python对聊天记录导出的内容进行清洗过滤,得到发送时间用户名聊天内容,并保存到数据库中(当然也可以不用,自己对代码进行修改即可)如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import pymysql
from pymysql.converters import escape_string
import re
import time


def convert_time(time_str):
"""将12小时日期时间转化为24小时制时间
Args: time_str (str): 12小时日期时间字符串,例如:2021-03-30 10:00:33 PM
Returns: str: 24小时制日期时间,例如:2021-03-30 22:00:33
"""
str1 = time_str[-2:] # 格式
data = time_str[:-3] # 时间
if str1.lower() == "am" and int(time_str[-11:-9]) == 12:
hour = "00"
data = time_str[0:11] + hour + time_str[-9:-3]
if str1.lower() == "pm":
if int(time_str[-11:-9]) < 12:
hour = str(int(time_str[-11:-9])+12)
else: # int(time_str[-11:-9]) == 12
hour = "12"
data = time_str[0:11] + hour + time_str[-9:-3]
str2 = time.mktime(time.strptime(data, "%Y-%m-%d %H:%M:%S")) # 转换为时间戳
finally_result = str(time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime(str2))) # 转换为指定格式
return finally_result


filter_lines = [] # 最终的聊天信息
with open(r"你的聊天记录路径.txt", encoding='utf-8') as f:
lines = f.readlines()
reg = "^.+[\u4E00-\u9FFF]\s\(.+\):"

for line in lines:
# 仅保留互相发送的信息记录
if (line.startswith('对方的用户名') or line.startswith('你的用户名')) and re.match(reg, line):
filter_lines.append(line.strip())

# 连接数据库
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='wechat_report', # 需要先建好
charset='utf8mb4',
port=3306)

# 创建游标
cur = conn.cursor()

# 创建数据表
create_sql = """
CREATE TABLE `log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user` varchar(100) DEFAULT NULL,
`datetime` datetime DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=222187 DEFAULT CHARSET=utf8mb4;
"""
cur.execute(create_sql)

# 写入数据表
for line in filter_lines:
s1 = line.find(" ")
s2 = line.find("):")
name = line[:s1] # 发送者
chattime = line[s1 + 2:s2] # 带有am/pm的12小时制时间
chattime = convert_time(chattime) # 转化为24小时制时间
content = line[s2 + 2:] # 聊天内容
insert_sql = f"insert into log(user,datetime,content) values ('{name}','{chattime}' ,'{escape_string(content)}')"
cur.execute(insert_sql)
conn.commit()

print(f'一共有{len(lines)}条聊天记录')

聊天记录分词,计算词频

从数据库中将数据读出,并使用jieba进行分词,统计每个词出现的次数,整理成{'word': str, 'count':number}的格式,并按照词频大小进行排序。

导出为使用;隔开的csv格式

jieba分词的效果还是不错的,但是其实分析聊天记录的时候更想要的是关于句意吧,所以其实并没有达到我的预期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import functools
import pymysql
import jieba
import json


# 连接数据库
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='wechat_report',
charset='utf8mb4',
port=3306)

# 建立游标
cur = conn.cursor()

cur.execute("select * from log")
r = cur.fetchall() # 获得全部聊天记录

result = {}

# 获得最长的一句话
max_item = None
for item in r:
content = item[3]
if (max_item is None or len(content) > len(max_item[3])) and content.find('http') == -1:
max_item = item
print(max_item)

# 进行分词
word_arr = []
for item in r:
content = item[3]
seg_list = jieba.cut(content)
word_arr = word_arr + list(seg_list)

# 计算词频
word_count_map = {}
for word in word_arr:
if word in word_count_map:
word_count_map[word] = word_count_map[word] + 1
else:
word_count_map[word] = 1

# 组合成字典
word_count_arr = []
for word in word_count_map:
o = {
'word': word,
'count': word_count_map[word]
}
word_count_arr.append(o)

# 按词频排序


def custom_sort(x, y):
if x['count'] > y['count']:
return -1
if x['count'] < y['count']:
return 1
return 0


result['word'] = sorted(word_count_arr, key=functools.cmp_to_key(custom_sort))

# with open("wechat-report\bin\result.json", "w", encoding="utf-8") as f:
# f.write(
# json.dumps(result, ensure_ascii=False)
# )

# 使用分号隔开写入csv文件
with open(r"wechat-report\bin\result.csv", "w", encoding="utf-8") as f:
for i in result['word']:
f.write(i['word']+';'+str(i['count'])+'\n')

制作词云

词云的制作利用了一个还不错的网站Word Art

  1. words中使用import导入使用分号隔开的csv文件(复制粘贴进来);
  2. shapes可以选择形状;
  3. fonts中记得导入中文字体,该网站默认仅支持英文字体;
  4. 其他的自己探索吧,我也没仔细设置,点击上方中间红色按钮Visualize生成词云,下载项中可以免费下载普通画质的,也还可以了。

参考内容

myth984/wechat-report: 微信聊天记录年度报告 (github.com)

BlueMatthew/WechatExporter: Wechat Chat History Exporter 微信聊天记录导出程序 (github.com)

Word Art - Edit - WordArt.com

[沐瑶软笔手写体(Muyao-Softbrush)_TTF字体下载-字魂网 (izihun.com)](https://izihun.com/zitixiazai-450.html?from_code=10033)

------ 本文结束------