微信(QQ)聊天记录数据挖掘以及应用设想
受朋友启发,现对聊天记录进行高频词挖掘,生成无向图,应该能找到有意思的内容。
环境介绍
软件环境: Pycharm 2019.1.3+Python3.6+Pandas0.25+jieba0.39+networkx2.5.1+wordcloud1.5.0+matplotlib3.1.1+Navicat11.1.14+楼月免费iTunes备份管理器
硬件环境: Win10 专业版64位+Intel(R)Core(TM)i5-6500 CPU @3.20GHz+20.0GB
数据获取
1.ios端
ios端数据获取比较麻烦,必须用到iTunes或者其他类似爱思这样的第三方软件对移动设备进行数据备份。
可参考: 如何用iTunes备份iPhone
下一步借助楼月iTunes备份管理器工具,将备份文件解密还原。
下载网站和指南在这里: 楼月免费iTunes备份管理器,不多赘述。
到这一步就可以得到包含以下文件夹的Documents文件夹了,其中这三个以md5值为名的文件夹包含的就是该设备登陆过的三个微信号数据。
下一步,还需要将用户数据解密为可解释的聊天记录数据。这里可以使用各种已经商用的工具(雨辰、楼月、迅捷等,但都需收费)
不想交费的话,仔细研究下这个Documents文件夹下的文件,可以发现在这个路径下有大量的sqlite文件。
这里直接用Navicat对这些sqlite文件创建连接。
就能找到大量的聊天记录表了,可是聊天对象的id又经过了md5加密。在这里,可以借助Navicat的搜索功能找出聊天对象,直接搜索最近聊天的内容,就可以找出对方的表名,然后找到这张表导出为xlsx或csv即可。
导出文件就是聊天记录数据表了。
2.安卓端
root后直接将这个文件导入Navicat: /data/data/com.tencent.mm/MicroMsg/(长字符串)/EnMicroMsg.db
之后查找指定对象聊天记录方式和ios端一致。
3.TIM/QQ(PC端)聊天记录获取与转换
参考该文: QQ/TIM聊天记录如何导出来和导进去,可获得txt格式的聊天记录,内容格式如下。
故还需要转换成上文xlsx格式文件,方便后续操作一致。
格式转换核心代码:
f = io.open(filepath, "r", encoding='utf-8')
id = 1
for line in f.readlines():
line = line.strip() # 去除首尾无意义符号
if not len(line):
continue # 空行则跳过
if line.startswith("[图片]"):# 去除无意义聊天
continue
if line.startswith("您好,我现"):# 去除无意义聊天
continue
if line.endswith("***"):# ***为本人QQ昵称,现隐去
status = 0
continue
if line.endswith("***"):# ***为聊天对象昵称,隐去
status = 1
continue
# time不用到的话,直接0填充,只是为了保持格式一致性
xls = xls.append({'time': 0, 'status': status, 'none': 0, 'id': id, 'content': line}, ignore_index=True)
id += 1
f.close
高频词网图
数据获取到后,就该使用jieba分词,networkx画图了。
分词以及计算词频核心代码:
words = pseg.cut(txt)
for word, flag in words:
if flag in ("n", "nr", "ns", "nt", "nw", "nz"):#只要名词
seg_list.append(word)
c = Counter() # 计数器
for x in seg_list:
if len(x)>1 and x not in ("\r\n"):
c[x] += 1 #计数器加一
return c.most_common(300)
高频词生成网状图核心代码:
G.add_node("我")# 创建点
node_list.append("我")
node_color_list.append('#ede85a') #设置颜色
i = 0
for j in lista[:60]:# 取前60个高频词
if i < 15:
node_color_list.append('#095dbe')# 不同颜色表频度
elif i < 30:
node_color_list.append('#5a9eed')# 不同颜色表频度
elif i < 45:
node_color_list.append('#7face1')# 不同颜色表频度
else:
node_color_list.append('#e1e8ef')# 不同颜色表频度
G.add_node(j[0])
node_list.append(j[0])
G.add_edge("我", j[0])# 连接两点的边
i += 1
最后,可得到这样的图。颜色深浅表词频度,中间多边连接点为双方共同高频词。
这张图看共同高频词,感觉很文青呢。
可以看到,结婚后的好友B聊天还是更多涉及到家庭成员,哈哈哈。
这张图就满满的科研和就业压力了。
说到科研压力微信群聊昵称颜色,就不得不看看和导师的聊天记录高频词是些什么了。
任务下达和反馈,想必我的最高频词应该是“恩恩”,哈哈哈。
词云图
个人聊天记录可以用网图直观表现,那群聊记录呢?
词云图应该是个很好的载体来体现群热点话题。
词云图生成核心代码:
cloud = WordCloud(
#设置字体,不指定就会出现乱码,文件名不支持中文
font_path = "simhei.ttf",
#设置背景色,默认为黑,可根据需要自定义为颜色
background_color='white',
#允许最大词汇
max_words=300,
#最大号字体,如果不指定则为图像高度
max_font_size=80,
#画布宽度和高度,如果设置了msak则不会生效
width=600,
height = 400,
margin = 2,
#词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1
prefer_horizontal = 0.8
).generate_from_frequencies(c)# 计算词频后的字典直接输入
plt.imshow(cloud)
plt.axis("off")
plt.show()
直接上图。
很显然,这是聊电影的群。
这是数据分析学习群。
球迷群。
应用场景
功利性的技术学习微信群聊昵称颜色,必不可少的一环就是阐述应用场景。因为这个问题我最后才来思考,所以按照我的思路顺序,也就放在了文章的最后部分。
那么词云图和network图能应用到那些领域呢?
1.根据好友A的提示,可以用于社交共同热点话题发现与推荐。
2.我自己的想法呢,就是可以用于重点政策报告的分析,挖掘未来热点。
比如对十四五规划报告内容高频词绘制词云图,为行业提前布局。
对国家基金项目立项名单绘制词云图,为项目申报方向提供参考。
对各教育部门教育改革文件绘制网状图,发现未来教育发展走向。
附件资源
本文代码、字体和原图可在这里找到:
ljyw17/Wechat_chatRecord_dataMinggithub.com
(代码未写详细注释,而且未封装成函数,需要一定基础先理解再实现)