python可视化文本分析(1)—分析QQ班群聊天记录宏观

news/2024/10/18 0:20:07/

公众号文章链接

  • 前一段时间就想做简单的==可视化文本分析==玩,今天就花点时间先对整体班级的==QQ群聊天信息做一个简单的分析==。
  • 打算分两步做,本文是最简单的第一步过程
    • 1:分析整个聊天记录的时间分配。并且用matplotlib展示出来。并把整个聊天的关键词做成词云。
    • 2:融入snownlp情感分析,分析每个同学的词云分布,每个同学的发言次数情况,以及每个同学文本的情绪走势以及展示。 等等
    • 总的来说就是先试试水,然后再做第二个。用到的库有:jieba分词,wordcloud词云,numpy数组,matplotlib可视化,snownlp(第二个),re正则(很重要)。这些用不到深入的东西,只用到很简单的一小部分,都可以直接 pip install xxx。
  • 言归正传,下面说一下我的学习历程:
  1. 首先,第一步就是导出群聊消息,再qq的资源管理器上选择群可以==导出群消息==记录成txt文本。
  2. 要观察聊天记录的规则,了解==文本结构==。能够解析下列方框标注的内容很重要。
    这部分主要的文本格式为:
2018-05-05 15:55:40 2班某某(1315426911)
2018-05-07 13:48:39 2XXX<xxxx@qq.com>
复制代码
  1. 下一步就需要==正则匹配==获取相应的内容。 这个地方的正则匹配规则也很简单,因为格式固定. 但是我要分配各个聊天的时间,那么就要匹配"15:55:40"这段话,可以重写一个正则或者在原来的正则上添加,我选择重写正则,对于==正则取值==前端时间简单写过取值两个正则表达式为:
pattern=re.compile(r'(\d*)-(\d*)-(\d*) .* .*')#匹配   信息
pattern2=re.compile(r'(\d+):(\d+):\d+')#匹配 15:55:40
复制代码
  1. 既然能取到上一步骤人说的话,那么我们在下一步就需要对==数据去噪==。那些数据会对结果有影响但是我们不需要的,这里大致列了几个(要注意的是文本换行符/n,每行无论是什么都有一个换行符):
    • 空格消息
    • 红包
    • 表情
    • 撤回的消息
    • 图片
    • @全体成员
    • 个别群复读机严重适当处理
    • 其他
  2. 这样每次按行读取,添加对应的次数和文本内容和水群次数。
  3. 制作聊天时间分布图。使用matplotlib展示坐标的一些坑点已经解决。保存图片到本地。
  4. 将各个文本合并生成班级主题词云。保存图片到本地。
  5. 观察词云的词是否有不该出现的词语,分析原因对数据进行==二次去噪==。我当时就是因为第一次写的正则没有匹配"2018-05-07 13:48:39 2班xxxxxxx@qq.com"导致词云出现一个同学的名字。。后来把正则改了就决绝了。你也可能会遇到特殊情况需要经常@某个人,,你可以自行处理。

代码开箱可用,你需要把你的文件名==替换正确的路径==,还有要在同级目录下==创建img文件夹==保存生成的两张图片。各种依赖环境很简单,直接pip install xxx。 附上核心代码:

import re
import numpy as np
import matplotlib.pyplot as plt  ##绘图库
from wordcloud import WordCloud
import jieba.analyse
string="2018-05-05 15:55:40 2班某某(1315426911)"
pattern=re.compile(r'(\d*)-(\d*)-(\d*) .* .*')
#匹配   2018-05-05 15:55:40 2班某某(1315426911) 有一个坑点就是2018-05-07 13:48:39 2XXX<xxxx@qq.com>这种格式
pattern2=re.compile(r'(\d+):(\d+):\d+')#匹配 15:55:40
#pattern3=re.compile(r'(\()(.*?)(\))')#匹配    2班某某(1315426911)相关内容
f = open('E:/text.txt', 'r', encoding='utf-8')  # 要进行分词处理的文本文件 (统统按照utf8文件去处理,省得麻烦)
lines = f.readlines()
index=0
def getpicture(y):#matplotlib绘图x=[]for i in range(0,24):x.append(str(i)+':00-'+str(i+1)+':00')Xi = np.array(x)Yi = np.array(y)plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6plt.subplots_adjust(bottom=0.2)plt.scatter(Xi, Yi, color="red", label="times")plt.xlabel("时间00:00—24:00")plt.ylabel("发言次数/次")plt.xticks(range(0,24),rotation=75,fontsize=10)#设置横坐标显示24次。plt.yticks(range(0,1000,50))# plt.legend(loc='lower right')  # 绘制图例# plt.show()plt.savefig("img/hour.png",format='png')plt.close()
def getciyun(value):text=''for i in range(0,24):text+=str(value[i]['text'])args=jieba.analyse.extract_tags(text,topK=80)text=' '.join(args)wc = WordCloud(background_color="white",width=1500, height=1000,min_font_size=40,font_path="simhei.ttf",# max_font_size=300,  # 设置字体最大值random_state=40,  # 设置有多少种随机生成状态,即有多少种配色方案)  # 字体这里有个坑,一定要设这个参数。否则会显示一堆小方框wc.font_path="simhei.ttf"   # 黑体# wc.font_path="simhei.ttf"my_wordcloud = wc.generate(text)plt.imshow(my_wordcloud)plt.axis("off")plt.show()wc.to_file('img/wordcloud.png')
def analysebyhour(lines):value=[]y=[]index=0for i in range(0,24):value.append({})value[i]['time']=0value[i]['text']=''for line in lines:if line != "\n" and line.strip() != "\n" and line != None and not line.__contains__("撤回了"):line = line.replace("[表情]", " ").replace("@全体成员", " ").replace("[表情]", " ").\replace("[QQ红包]我发了一个“专享红包”,请使用新版手机QQ查收红。", "").replace("\n", " ").replace("[图片]",'')if(pattern.search(line)):#匹配到正确的对象date=pattern.search(line)hour=pattern2.search(line).group(1)#print(date.group(0),hour)value[int(hour)]['time']+=1index=hourelse:print(line)value[int(index)]['text']+=str(line)for i in range(0,24):print('time:',i,'time',value[i]['time'])y.append(value[i]['time'])getpicture(y)getciyun(value)
analysebyhour(lines)
复制代码

然后两张图片就出来了:

  • 第一个点状图可以发现我们的聊天时间11:00-12:00突出,17:00-18:00突出,因为这个时间我们没有课程在吃饭或者玩,有时候下午或者晚上或者其他的安排或者考试啥的可能会讨论。而13:00-14:00这个点我们大部分在午休一般没人聊天。但是醒了之后就会一直很活跃?。
  • 第二个词云可以看的出我们最近在聊啥,因为我的记录是5月十几才开始,记录不足,准备找一份记录足的做下一个研究。你可能通过词云发现我的其实还有挺大的不足就是QQ小冰没有过滤掉。希望如果读者有兴趣尝试可以处理一下。

通过这些简单的文本分析感觉很有趣,有兴趣等有时间把第二种也做出来,那种可能做起来比较麻烦一些。但是难道还是不大的。这些东西看似高深,其实了解api做起来很简单。

希望一起加油。

转载于:https://juejin.im/post/5cc590cd51882564113f26c3


http://www.ppmy.cn/news/581965.html

相关文章

揭露骗子利用微信“聊天记录中图片不可变”的骗局

一、起因 那是一个阴冷的夜晚&#xff0c;我的一个老乡怒气冲冲的给我拨了个微信视频&#xff0c;说他在微信上被人骗了。 他给我转发了一条骗子给他发的聊天记录&#xff0c;在点开之前是这样的&#xff1a; 图1 聊天记录 看上去是一个图片。点进去一看&#xff0c;果然是个…

QQ聊天记录器演示程序

QQ聊天记录器演示程序(可针对QQ2003和QQ2004版本) 注:本篇没有高手需要的内容(因为此文中的技术实在无新意可言,只是些简单的实现),各位高手可以就此打住,若浪费宝贵时间,吾将深感不安. 作者网站:http://asp.itdrp.com/hottey ----------------hottey 嘘!好不容易有了一点轻松…

Java Swing实现局域网QQ

写在前面 个人博客网址&#xff1a;https://jiong952.github.io/ 个人github网址&#xff1a;https://github.com/jiong952 源码地址&#xff1a;https://github.com/jiong952/QQ2.0 课程题目 实现一个带图形用户界面的 Java 版即时聊天程序。 【功能提示】 用户登录及登录…

仿QQ聊天室项目功能总结

项目源码开源在gitee&#xff08;码云&#xff09; 地址&#xff1a;https://gitee.com/xiaoclgitee/imitation-qq-chat-room 项目功能总结&#xff1a; 1、页面制作 采用Java 的Swing的Jframe 的框架进行GUI的制作 主要有三个界面&#xff1a;1、用户登录界面 2、用户聊天窗…

腾讯QQ的聊天记录中的图片记录造假

前不久和朋友在群里聊天时&#xff0c;突然出现了一个BUG&#xff0c;就是一个群友发了A图片&#xff0c;但在我这边显示得却是B图片。当时就猜测&#xff0c;腾讯为了节省流量或者手机资源的原因&#xff0c;给每一张图片弄了个唯一ID&#xff0c;遇到相同ID的就直接从本地调用…

基于 springboot+vue 进行多条件查询历史聊天记录

查询历史聊天记录 多条件查询记录是经常需要进行编写的功能&#xff0c;这里就以多条件查询历史聊天记录为例子来介绍如何进行基于关键字、日期、聊天记录类型 三种条件进行模糊查询、日期拼接、条件拼接查询。 前端 抽屉管理 首先我们控制 element ui 的 抽屉的打开与关闭 …

Vue3版本生命周期详解

介绍 vue3和vue2的生命周期改动不大,下面以图来展现两个版本的周期钩子 使用示例 配置项写法 vue3可以使用vue2版本的周期配置 准备一个HelloWord组件 使用App组件嵌套HelloWorld组件,并进行v-if判断是否卸载该组件,以此查看vue3的卸载钩子 测试: 可以看到当页面刷新后执行…

python qq群发消息_Python版QQ群发消息

PyQQ已经发布&#xff0c;利用web2qq协议&#xff0c;目前支持批量添加好友&#xff0c;批量群发消息等功能。 我的初衷是以PyQt为GUI做一个跨平台的QQ机器人&#xff0c;在win平台下不需要安装Python环境也能运行&#xff0c;能根据收到的消息自动回复。目前已经测试通过的只有…