简介

有时候我们想看看自己跟另一个人的时长、频率、时间等或者是聊天过程中谁更在乎谁多一点,谁是话痨,聊天性格怎么样,这时就需要一个聊天记录分析的程序。

下面的Python代码能够统计聊天记录中的时间、消息次数、文本长度、词频等信息。

当然有一些小bug,这将在将来的更新中得到修复。

原文:omegaxyz.com

使用到的Python模块

①jieba:结巴分词,用来处理聊天记录中的文本,尤其是中文文本。
②matplotlib.pyplot:用来画折线图、条形图等。
③matplotlib.*.PdfPages:用来将数据及结果生成PDF文件。
④xlwt:将词频信息写到xls中。
注意点
①QQ中的聊天记录文件的昵称是每一阶段的昵称(时间不同昵称可能不同)。
②聊天文件中的字符一定要使用utf-8编码。
③利用matplotlib画图时中文字体一定要导入到当前文件夹下(Windows系统C盘下面有字体)

QQ聊天记录的导出

环境:截止到2018年7月最新的QQ

①选择消息管理器

②导出消息记录

③保存为txt文件

注意导出后放到代码目录下即可

代码主要步骤

①变量初始化
②读取QQ聊天记录txt文件
③利用结巴模块对聊天记录进行分析
④利用matplotlib画图并导出成PDF文件
核心代码
代码有bug:

①非utf-8编码问题导致数据无法加载(使用过颜表情的记录会出现,这里需要手动清除)
②词频统计中文与英文混乱(小bug,不影响使用)
因此只给出核心代码,修复后所有代码将在未来上传至github

获取最新信息请持续关注或在首页订阅omegaxyz.com

import jieba
import re
import jieba.analyse
import xlwt
from matplotlib import font_manager
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPagesmyfont = font_manager.FontProperties(fname='simhei.ttf')
mpl.rcParams['axes.unicode_minus'] = Falsef = open("qk.txt", "r")  # 以追加的方式message = f.readlines()
name1 = 'PuzzleX'#我的昵称
name1_message = []
name2 = '输入另一个人的昵称'
name2_message = []
name1_word_count = 0
name2_word_count = 0
name1_time = []
name2_time = []
wbk = xlwt.Workbook(encoding='ascii')
sheet = wbk.add_sheet("message")  # Excel单元格名字
word_lst = []
key_list = []
pat = re.compile(r'(\d{4}-\d{1,2}-\d{1,2})')
pdf = PdfPages(name1 + '与' + 'DEMO' + '聊天记录分析' + '.pdf')
for line in message:  # 1.txt是需要分词统计的文档try:item = line.strip('\n\r').split('\t')  # 制表格切分tags = jieba.analyse.extract_tags(item[0])  # jieba分词if pat.match(str(item[0])) and name1 in str(item[0]):name1_time.append(item)elif pat.match(str(item[0])) and name2 in str(item[0]):name2_time.append(item)if (len(tags) == 7 or 6) and name1 in tags:passelif (len(tags) == 7 or 6) and name2 in tags:passelse:# print(tags)for t in tags:word_lst.append(t)except:pass#  print(word_lst)
word_dict = {}
with open("wordCount.txt", 'w') as wf2:  # 打开文件for item in word_lst:if item not in word_dict:  # 统计数量word_dict[item] = 1else:word_dict[item] += 1orderList = list(word_dict.values())orderList.sort(reverse=True)for i in range(len(orderList)):for key in word_dict:if word_dict[key] == orderList[i]:wf2.write(key + ' ' + str(word_dict[key]) + '\n')  # 写入txt文档key_list.append(key)word_dict[key] = 0for i in range(len(key_list)):sheet.write(i, 1, label=orderList[i])sheet.write(i, 0, label=key_list[i])
wbk.save('message.xls')  # 保存为 wordCount.xls文件for i in range(len(message)):if name1 in message[i]:name1_message.append(message[i+1])name1_word_count += len(message[i+1])if name2 in message[i]:name2_message.append(message[i+1])name2_word_count += len(message[i + 1])name1_count = len(name1_message)
name2_count = len(name2_message)
name1_time_do = {'0':0, '1':0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0,'12': 0, '13': 0, '14': 0, '15': 0,'16': 0, '17': 0, '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0, }
name2_time_do = {'0':0, '1':0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0,'12': 0, '13': 0, '14': 0, '15': 0, '16': 0, '17': 0, '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0, }for item in name1_time:try:name1_time_do[str(item[0])[11:13]] += 1except KeyError:name1_time_do[str(item[0])[11:12]] += 1
for item in name2_time:try:name2_time_do[str(item[0])[11:13]] += 1except KeyError:name2_time_do[str(item[0])[11:12]] += 1time_range = name1_time[0][0][:11] + '到' + name1_time[-1][0][:11]plt.figure()
plt.axis('off')
t = name1 + '与' + 'DEMO' + '的聊天记录分析' + '\nomegaxyz.com\n\n' + name1 + '的消息发送次数为: ' + str(name1_count) + '\n' + 'DEMO' + \'的消息发送次数为: ' + str(name2_count) + '\n' + name1 + '的消息发送消息字数为: ' + str(name1_word_count) + '\n' + 'DEMO' + \'的消息发送消息字数为: ' + str(name2_word_count) + '\n\n' + time_range + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'
plt.text(0, 0, t, ha='left', wrap=True, fontproperties=myfont)
pdf.savefig()
plt.close()word_T1 = ' 聊天词频分析\n'
for i in range(25):word_T1 += key_list[i]word_T1 += ':'word_T1 += str(orderList[i]) + '\n'
plt.figure()
plt.axis('off')
plt.text(0, 0, word_T1, ha='left', wrap=True, fontproperties=myfont)
pdf.savefig()
plt.close()word_T2 = ''
for i in range(25):word_T2 += key_list[i+25]word_T2 += ':'word_T2 += str(orderList[i+25]) + '\n'
plt.figure()
plt.axis('off')
plt.text(0, 0, word_T2, ha='left', wrap=True, fontproperties=myfont)
pdf.savefig()
plt.close()# print(orderList[0:10])
# print(key_list[0:10])
rects = plt.bar(range(len(orderList[0:11])), orderList[0:11], color='rgby')
# X轴标题
index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.ylim(ymax=orderList[0]*1.1, ymin=0)
plt.xticks(index, key_list[0:11], fontproperties=myfont)
plt.ylabel("次数", fontproperties=myfont)  # X轴标签
plt.title('聊天最多的词(包括表情和图片)', fontproperties=myfont)for rect in rects:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha='center', va='bottom')
plt.savefig('Top10 words.jpg')
pdf.savefig()
# plt.show()
plt.close()plt.axis([0, 23, 0, 600])
plt.ion()
# print(list(name1_time_do))
plt.plot(list(name1_time_do), list(name1_time_do.values()), color='red', label='User1')
plt.plot(list(name2_time_do), list(name2_time_do.values()), color='blue', label='User2')
plt.xlabel('时间(24小时制)', fontproperties=myfont)
plt.ylabel('频率', fontproperties=myfont)
plt.title('聊天时间分布', fontproperties=myfont)
plt.savefig('time frequency.jpg')
pdf.savefig()
# plt.show()
plt.close()pdf.close()

未来的工作

①修复bug ②GUI界面 ③利用机器学习算法推测聊天用户性格

测试

①主要信息

②词频


③聊天时间分布

④导出的PDF文件

网站所有原创代码采用 Apache 2.0 授权
网站文章采用知识共享许可协议 BY-NC-SA4.0 授权

更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

QQ聊天记录多角度分析Python实现相关推荐

  1. qq聊天记录词频查询 python实现

    为了给后期聊天机器人提供大量的聊天词汇写了这个脚本,感兴趣的朋友可以看一下 下面是代码: #-*-coding:utf8-*- import re def getWordRate(name,path, ...

  2. QQ空间说说分析 Python

    前两天看见一篇分析豆瓣上对战狼2评论的分析,觉得挺好玩,就有了这篇文章.PS:顺便吐槽一下,本来pthon对中文的支持就不很友好,然后qq好友的昵称--你懂的,在这里把我快逼疯了,一会encode一会 ...

  3. QQ聊天记录分析(R-3.5)

    对QQ聊天记录的分析 数据来源:博主的某个学习群,直接导出聊天记录到文本 #导入算法包 > if(!require("stringr")){install.packages( ...

  4. python分析qq聊天记录汉字频率

    import re# -*- coding: utf-8 -*- with open('C:\\Users\\BIMK\\Desktop\\1.txt','r+',encoding='UTF-8') ...

  5. python正则将qq聊天记录转换为html

    目录 一.需求 二.知识要点 三.全部代码 四.使用方法 五.转换效果 六.参考资料 一.需求 提取qq聊天记录中的所有图片并保存在指定的文件夹,并将聊天记录转换为html. 二.知识要点 大文件的流 ...

  6. 用Python把QQ聊天记录文件转成WORD并排版

    和女票在一起五年了,保留了几年的QQ聊天记录,偶然翻到,感觉很温暖,就想把这些文字做成一本属于我们的书,应该会很有纪念意义.然而qq备份的聊天记录是txt格式,网上找了半天也没有合适的排版工具,上百页 ...

  7. Python将我与王心凌的QQ聊天记录,生成词云(情人节的后续)

    在这个情人节前夕,我把现任对象回收掉了,这段感情积攒了太多的失望,也给了我太多的伤害,所以我看到这个活动的第一反应是拒绝的.然而人生嘛,最重要的就是体验,沉浸在过去的回忆里没有意义,积极面对才能让自己 ...

  8. 微信聊天记录深度分析,看看这一年你和谁最亲密

    原文链接: https://zhuanlan.zhihu.com/p/100084316 2019年就要过去了,想知道你平时用的最多的词是什么吗?想知道你一天中哪个时间段聊天最多吗?想知道这一年谁和你 ...

  9. emoji .png_根据我对3.5GB聊天记录的分析,Emoji开发人员使用最多

    emoji .png by Evaristo Caraballo 通过Evaristo Caraballo 根据我对3.5GB聊天记录的分析,Emoji开发人员使用最多 (The Emoji deve ...

  10. pyecharts qq聊天记录数据可视化

    数据说明 1.本次数据来源于qq群聊天记录 2.一共3123条数据,可以直接用qq导出聊天记录 3.使用到的库有pyecharts jieba 发言排行 index_id name count 1 闰 ...

最新文章

  1. linux红帽网页中文乱码解决,【linux学习笔记】安装redhat时中文显示乱码(小方框)解决方法...
  2. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置
  3. 页面怎么把关键字保留下来_怎么做seo优化,以及网站SEO优化计划!
  4. xhtml使用style属性
  5. nodejs库express是如何接收inbound json请求的
  6. c++监听键盘_想知道木马程序的键盘记录原理吗?python告诉你 !
  7. 通过keras例子理解LSTM 循环神经网络(RNN)
  8. 顺丰不顺、京东动荡,都是物流基因惹的祸?
  9. [论文阅读] Self-supervised Correction Learning for Semi-supervised Biomedical Image Segmentation
  10. php编程输出心形图案_如何用C语言先输出一段文字如何再输出心形图案?
  11. java调优随记-java对象大小
  12. Android应用程序版本号管理(官方文档中文版) 2011-08-07 22:03:36
  13. mysql双机备份最简单_简单实现MySQL数据库双机热备份的方案
  14. 石墨烯 量子计算机,《Nature Nanotech.》又是石墨烯,这次对量子计算机下手了!...
  15. wireshark常用过滤表达式
  16. ubuntu 更换桌面为 KDE
  17. chrome浏览器手机模式下不显示鼠标
  18. 养成良好的工作习惯(计划)
  19. 将被雪藏的AI算法,抛开快手和火山,YouTube的儿童APP值得学习吗?
  20. C# 保存窗口为图片(保存纵断面图)

热门文章

  1. vue-study-1 mvx模式
  2. ios- 音乐播放器(1)
  3. 【无极低码】手写一个低代码平台之二次开发Java
  4. 关键词查找器,关键词搜索查询挖掘
  5. Chrome浏览器升级80以后导致重定向自动登录失效问题记录和解决方案
  6. ROG 2022 款幻 13 评测
  7. 达梦新起点:达梦DM8化繁为简 助力数据库发展新方向
  8. 分布式事务之两阶段提交
  9. 米家扫地机器人尘盒怎么取_米家扫地机器人怎么清理灰尘盒
  10. 学生如何提高专业英文阅读能力(转自施一公博客)