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

简介: 前一段时间就想做简单的可视化文本分析玩,今天就花点时间先对整体班级的QQ群聊天信息做一个简单的分析。
  • 前一段时间就想做简单的可视化文本分析玩,今天就花点时间先对整体班级的QQ群聊天信息做一个简单的分析
  • 打算分两步做,本文是最简单的第一步过程


  • 1:分析整个聊天记录的时间分配。并且用matplotlib展示出来。并把整个聊天的关键词做成词云。
  • 2:融入snownlp情感分析,分析每个同学的词云分布,每个同学的发言次数情况,以及每个同学文本的情绪走势以及展示。 等等
  • 总的来说就是先试试水,然后再做第二个。用到的库有:jieba分词,wordcloud词云,numpy数组,matplotlib可视化,snownlp(第二个),re正则(很重要)。这些用不到深入的东西,只用到很简单的一小部分,都可以直接 pip install xxx。


  • 言归正传,下面说一下我的学习历程:


  1. 首先,第一步就是导出群聊消息,再qq的资源管理器上选择群可以导出群消息记录成txt文本。


  1. 要观察聊天记录的规则,了解文本结构。能够解析下列方框标注的内容很重要。


aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAxOS80LzI4LzE2YTYzYmQ5NDAzNzhjNTQ.png


这部分主要的文本格式为:

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,每行无论是什么都有一个换行符):
  • 空格消息
  • 红包
  • 表情
  • 撤回的消息
  • 图片
  • @全体成员
  • 个别群复读机严重适当处理
  • 其他
  1. 这样每次按行读取,添加对应的次数和文本内容和水群次数。
  2. 制作聊天时间分布图。使用matplotlib展示坐标的一些坑点已经解决。保存图片到本地。
  3. 将各个文本合并生成班级主题词云。保存图片到本地。
  4. 观察词云的词是否有不该出现的词语,分析原因对数据进行二次去噪。我当时就是因为第一次写的正则没有匹配"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:6
    plt.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=0
    for i in range(0,24):
        value.append({})
        value[i]['time']=0
        value[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']+=1
                index=hour
           else:
               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)


然后两张图片就出来了:


aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAxOS80LzI4LzE2YTYzYmQ5NDFhYzJiYWM.pngaHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAxOS80LzI4LzE2YTYzYmQ5NDI0MTZkZmE.png


  • 第一个点状图可以发现我们的聊天时间11:00-12:00突出,17:00-18:00突出,因为这个时间我们没有课程在吃饭或者玩,有时候下午或者晚上或者其他的安排或者考试啥的可能会讨论。而13:00-14:00这个点我们大部分在午休一般没人聊天。但是醒了之后就会一直很活跃?。


  • 第二个词云可以看的出我们最近在聊啥,因为我的记录是5月十几才开始,记录不足,准备找一份记录足的做下一个研究。你可能通过词云发现我的其实还有挺大的不足就是QQ小冰没有过滤掉。希望如果读者有兴趣尝试可以处理一下。


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


希望一起加油。

目录
相关文章
|
5天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
22天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
7天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
14天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
55 7
|
13天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
22 3
|
14天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
31 2
|
19天前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
21天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
48 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
30天前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
45 2
|
8天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。