QQ聊天记录多角度分析Python实现

2023-05-16

简介

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

下面的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 PdfPages

myfont = font_manager.FontProperties(fname='simhei.ttf')
mpl.rcParams['axes.unicode_minus'] = False

f = 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:
                pass
            elif (len(tags) == 7 or 6) and name2 in tags:
                pass
            else:
                # 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] = 1
        else:
            word_dict[item] += 1

    orderList = 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] = 0

for 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]] += 1
    except KeyError:
        name1_time_do[str(item[0])[11:12]] += 1
for item in name2_time:
    try:
        name2_time_do[str(item[0])[11:13]] += 1
    except KeyError:
        name2_time_do[str(item[0])[11:12]] += 1

time_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-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QQ聊天记录多角度分析Python实现 的相关文章

随机推荐

  • wxpython控件自适应窗口大小

    问题 xff1a wxpython作的窗口 xff0c 点击窗口最大化 xff0c 就会出问题 xff0c 1 窗口控件并不一起最大化 2 最大化后有些控件找不着了 xff0c 再恢复窗口 xff0c 那些消失的控件一样找不到 wxPyth
  • Python统计磁盘代码文件行数

    听说简历要求10万行代码经验 于是写了个Python脚本用来计算电脑磁盘内代码的行数 主要功能 xff1a 统计指定代码的总行数 统计每个代码单独的行数 自定义设置存储路径 设计思路 xff1a 将文件转化为txt文档 xff0c 对txt
  • 第一个Android程序

    Android Studio 是一个Android集成开发工具 xff0c 基于IntelliJ IDEA 类似 Eclipse ADT xff0c Android Studio 提供了集成的 Android 开发工具用于开发和调试 在ID
  • 面向过程与面向对象代码实例对比

    面向过程式代码 xff08 使用数据结构的代码 xff09 便于在不改动既有数据结构的前提下添加新函数 面向对象代码便于在不改动既有函数前提下添加新类 过程式代码难以添加数据结构 xff0c 因为必须修改所有函数 面向对象代码难以添加新函数
  • 机器学习

    文章目录 机器学习基本理论 基本术语与方法特征选择概述多目标优化问题 分类算法 经典算法 分类算法NSGA2算法粒子群优化算法 xff08 PSO xff09 聚类算法蚁群算法 xff08 ACO xff09 其它算法 前沿算法 NSGA2
  • 英文字母信息熵与冗余度计算Python实现

    26个英文字母在平均出现时的信息熵是4 7BIT 而去掉冗余度后的英文字母的信息熵是4 03BIT 公式 H 信息熵 61 Pi log2 Pi Pi 为每个字母在信息中出现的概率 计算公式并不复杂 取以2为底的对数的道理也很简单 因为如果
  • C++静态成员详解

    静态成员是解决同一个类的不同对象之间数据和函数共享问题的 实例属性 xff1a 一个类的所有对象具有相同的属性 xff0c 属性值可以不同 类属性 xff1a 描述类的所有对象共同特征 xff0c 对于任何对象其属性值相同 静态数据成员 用
  • 混淆矩阵简介与Python实现

    什么是混淆矩阵 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表 xff0c 以矩阵形式将数据集中的记录按照真实的类别与分类模型作出的分类判断两个标准进行汇总 这个名字来源于它可以非常容易的表明多个类别是否有混淆 xff08 也就是一个
  • JAVA CPU占用过高问题排查

    1 查找进程 top查看进程占用资源情况 明显看出java的两个进程22714 xff0c 12406占用过高cpu 2 查找线程 使用top H p lt pid gt 查看线程占用情况 3 查找java的堆栈信息 将线程id转换成十六进
  • 【译】Python3.8官方Logging文档(完整版)

    注 xff1a 文章很长 xff0c 约一万字左右 xff0c 可以先收藏慢慢看哟 01 基础部分 日志是用来的记录程序运行事件的工具 当程序员可以通过添加日志打印的代码来记录程序运行过程中发生的某些事件时 这些事件包含了诸如变量数据在内的
  • C语言银行家算法

    算法简介 银行家算法 xff08 Banker s Algorithm xff09 是一个避免死锁 xff08 Deadlock xff09 的著名算法 xff0c 是由艾兹格 迪杰斯特拉在1965年为T H E系统设计的一种避免死锁产生的
  • 操作系统动态优先级调度算法C语言实现

    动态优先级算法 动态优先数是指在进程创建时先确定一个初始优先数 xff0c 以后在进程运行中随着进程特性的改变不断修改优先数 xff0c 这样 xff0c 由于开始优先数很低而得不到CPU的进程 xff0c 就能因为等待时间的增长而优先数变
  • 软件工程-软件小组的组织形式

    为什么要形成软件小组 大多数软件产品由一个软件专业人员不可能在有限时间内单独完成 因而 xff0c 产品必须分配给一组专业人员 xff0c 形成一个小组 在具体说软件小组的组织形式之前先介绍一下布鲁克斯法则 布鲁克斯法则 布鲁克斯是上世纪6
  • 差分分组的合作协同进化的大规模优化算法详解

    合作协同进化已经引入协同进化算法 xff0c 目的是通过分而治之的范式解决日益复杂的优化问题 理论上 xff0c 协同改 变子成分的想法是十分适合解决大规模优化问题的 然而在实践中 xff0c 没有关于问题的先验知识 xff0c 问题应如何
  • 软件工程内聚详解

    简介 内聚标志一个模块内各个元素彼此结合的紧密程度 xff0c 它是信息隐蔽和局部化概念的自然扩展 内聚是从功能角度来度量模块内的联系 xff0c 一个好的内聚模块应当恰好做一件事 它描述的是模块内的功能联系 内聚和耦合是密切相关的 xff
  • Python使用matplotlib画动态图

    机器学习需要使用python实现相应的算法 xff0c 因此学习了Matplotlib中的画图 更多内容访问omegaxyz com 当然为了能显示机器学习中每次迭代的效果与收敛速度 xff0c 需要画出动态图形 下面给出两个例子 xff0
  • JavaScript模拟终端输出

    利用JavaScript 43 CSS能够模拟出终端输入画面 xff08 类似于Linux终端画面 xff09 当然更好的代码也可以模拟出黑客帝国那样的输出画面 CSS设置 xff1a height auto表示随着输出字数的增加 xff0
  • 机器学习分类与回归

    分类 xff0c 即classification xff1a a process in which you put something into the group or class it belongs to xff0c 这是指将某物放入
  • 边缘计算与嵌入式系统

    文章目录 边缘计算简介 边缘计算的起源 嵌入式系统与边缘计算 3 1 嵌入式系统概述 3 2 嵌入式系统的发展历史 3 3 嵌入式系统应用到边缘计算 3 4 嵌入式硬件的要求 3 5 边缘计算环境下嵌入式系统与人工智能 观点与看法 4 1
  • QQ聊天记录多角度分析Python实现

    简介 有时候我们想看看自己跟另一个人的时长 频率 时间等或者是聊天过程中谁更在乎谁多一点 xff0c 谁是话痨 xff0c 聊天性格怎么样 xff0c 这时就需要一个聊天记录分析的程序 下面的Python代码能够统计聊天记录中的时间 消息次