公众号文章链接

第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势。
用到一下库:

  • re正则,matplotlib,wordcloud,numpy,jieba分词,snownlp情感分析。
  • 上述库的用法很简单,安装也很简单,所以不需要担心门槛。

最好结合第一篇或者先看第一篇
详细说一下模块的制作流程:

  1. 正则匹配文本内容,第一篇只考虑总计文本的展示,并没有考虑到群成员的群体。所以要用字典{}讲学生的qq/邮箱和昵称存一下。还有他的发言记录。这里有个比较重要的是他的昵称可能是变得,你的群消息里面展示的是那个时候他的群昵称,,可能从大演说家变成啥啥啥的。所以我的思想就是主要按照qq/邮箱这个点确定唯一,而昵称只用第一次出现的。文本先相加。
value={}
def analyseinformation(lines):qqnow=''#qq或者email当前用户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):#匹配到正确的对象# print(line)if pattern3.search(line):qq1=str(pattern3.search(line).group(3))namenow=str(pattern3.search(line).group(1))if  not qq1 in value.keys():value[qq1]={'name':namenow,'qq':qq1,'text':[]}qqnow=qq1#当前用户发言发生了更改elif pattern4.search(line):email=str(pattern4.search(line).group(2))namenow=str(pattern4.search(line).group(1))if  not email in value.keys():value[email]={'name':namenow,'qq': email,'text':[]}qqnow=email# print(name)elif not qqnow.__eq__(''):#初始化的时候的坑,初始化为'',前几行没用文本直接过滤value[qqnow]['text'].append(str(line))
  1. 上面就说讲所有有用的信息放到字典value中,但是我想用几个小数组分开存储一些信息。可以稍微处理一下:
time=[]#次数
text=[]#文本
name=[]#姓名
qq=[]#qq或者邮箱提取
def getmotion(values):for key in values:print(values[key])time.append(values[key]['text'].__len__())usertxt=''for txt in values[key]['text']:usertxt+=txt+' 'text.append(usertxt)name.append(values[key]['name'])qq.append(key)
  1. 剩下就可以开始完成自己想要展示的部分了。首先,我想查看这段时间每个人到底发言多少次。因为matplotlib图形显示不了太多,我显示部分(可以自己更改,只不过是效果问题),你还可以自定义排序完成排序然后再展示:
#展示各个同学的发言次数
def getspeaktimeall(time,name):Xi = np.array(time[20:50])#根据自己展示的需要需改范围,我们群人数太多Yi = np.array(name[20:50])x=np.arange(0,30,1)width=0.6plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6plt.barh(x , Xi, width, color='SkyBlue',alpha=0.8)plt.xlabel("time")plt.ylabel("name")for a,b,c in zip(Xi,Yi,x):print(a,b,c)plt.text(a+10,c-0.4,'%d'%int(a),ha='center',va='bottom')plt.yticks(x,Yi)# plt.legend()plt.show()plt.close()
  1. 我还想看到所有人的发言情感总的比较。那么我就将所有同学的发言成为一个大的字符串,然后用snownlp去分析,snownlp的api很简单。
    s=SnowNLP(text)
    print(s.sentiments)就出来了,这部分的坑点是标签的展示我以前记录过可以结合着看,就不详述了。这部分详细代码为:
def getemotionall(time,text,name,qq):emotion=[]for i in range(0,len(qq)):print(name[i],text[i])s=SnowNLP(text[i])emotion.append(s.sentiments*100)print(len(name),len(emotion))Xi = np.array(emotion[10:40])Yi = np.array(name[10:40])x = np.arange(0, 30, 1)width = 0.6plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6plt.barh(x, Xi, width, color='red',label='同学发言总情绪', alpha=0.8)plt.xlabel("emotion")plt.ylabel("name")for a, b, c in zip(Xi, Yi, x):print(a, b, c)plt.text(a + 2, c - 0.4, '%d' % int(a), ha='center', va='bottom')plt.yticks(x, Yi)# plt.legend()plt.show()plt.close()
  1. 接下来我想分析的是每个人的发言词云,这部分第一篇也讲过实现的方式,代码就留在完整贴了。你可以查看你讨厌的人,喜欢的人,或者两个人的聊天记录。看看她关心啥。。嘿嘿?。
  2. 我还想看的就是每个人的情感走向,这个也挺有价值的,你可以分析她或他最近的若干条的情感走势,如果整合最小二乘法预测还能画一条情感预测的走势出来,这里就先不画了。我才用的是折线图,1代表积极,0代表消极,0.5代表中性。因为有的人发言太多,不利于图标展示,我只去了他最近200条记录,没用基于时间,如果有兴趣你还可以把时间整合进来。核心代码为:
def getemotionbyqq(value,qq):va=value[qq]['text']emotion=[]for q in va[len(va)-200:len(va)]:s = SnowNLP(q)emotion.append(s.sentiments)#print(s.sentiments)x=np.arange(len(emotion))y=np.array(emotion)plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(12, 6))  ##指定图像比例: 8:6plt.plot(x,y,label='emotion status')plt.xlabel("最近200次发言情绪走势")plt.ylabel("0-1表示消极-积极")plt.legend()plt.show()

附上代码和展示:

import re
from snownlp import SnowNLP
import numpy as np
import matplotlib.pyplot as plt  ##绘图库
from wordcloud import WordCloud
import jieba.analyse
time=[]#次数
text=[]#文本
name=[]#姓名
qq=[]#qq或者邮箱提取
value={}
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'(\S+)(\()(.*?)(\))')#匹配    2班某某(1315426911)相关内容
pattern4=re.compile(r'(\S+)[<](.*)[>]')
def getemotionbyqq(value,qq):va=value[qq]['text']emotion=[]for q in va[len(va)-200:len(va)]:s = SnowNLP(q)emotion.append(s.sentiments)#print(s.sentiments)x=np.arange(len(emotion))y=np.array(emotion)plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(12, 6))  ##指定图像比例: 8:6plt.plot(x,y,label='emotion status')plt.xlabel("最近200次发言情绪走势")plt.ylabel("0-1表示消极-积极")plt.legend()plt.show()
def getstudentcloudbyqq(value,qq):va=value[qq]['text']text=''for q in va:text+=q+' 'print(text)ags = jieba.analyse.extract_tags(text, topK=40)text=' '.join(ags)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()plt.close()
def getemotionall(time,text,name,qq):emotion=[]for i in range(0,len(qq)):print(name[i],text[i])s=SnowNLP(text[i])emotion.append(s.sentiments*100)print(len(name),len(emotion))Xi = np.array(emotion[10:40])Yi = np.array(name[10:40])x = np.arange(0, 30, 1)width = 0.6plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6plt.barh(x, Xi, width, color='red',label='同学发言总情绪', alpha=0.8)plt.xlabel("emotion")plt.ylabel("name")for a, b, c in zip(Xi, Yi, x):print(a, b, c)plt.text(a + 2, c - 0.4, '%d' % int(a), ha='center', va='bottom')plt.yticks(x, Yi)# plt.legend()plt.show()plt.close()
#展示各个同学的发言次数
def getspeaktimeall(time,name):Xi = np.array(time[20:50])#根据自己展示的需要需改范围,我们群人数太多Yi = np.array(name[20:50])x=np.arange(0,30,1)width=0.6plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6plt.barh(x , Xi, width, color='SkyBlue',alpha=0.8)plt.xlabel("time")plt.ylabel("name")for a,b,c in zip(Xi,Yi,x):print(a,b,c)plt.text(a+10,c-0.4,'%d'%int(a),ha='center',va='bottom')plt.yticks(x,Yi)# plt.legend()plt.show()plt.close()def getmotion(values):for key in values:print(values[key])time.append(values[key]['text'].__len__())usertxt=''for txt in values[key]['text']:usertxt+=txt+' 'text.append(usertxt)name.append(values[key]['name'])qq.append(key)#getmatplotlibtime(time,text,name,qq)# getmatplotlibemotion(time,text,name,qq)# print(time)
def analyseinformation(lines):qqnow=''#qq或者email当前用户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):#匹配到正确的对象# print(line)if pattern3.search(line):qq1=str(pattern3.search(line).group(3))namenow=str(pattern3.search(line).group(1))if  not qq1 in value.keys():value[qq1]={'name':namenow,'qq':qq1,'text':[]}qqnow=qq1#当前用户发言发生了更改elif pattern4.search(line):email=str(pattern4.search(line).group(2))namenow=str(pattern4.search(line).group(1))if  not email in value.keys():value[email]={'name':namenow,'qq': email,'text':[]}qqnow=email# print(name)elif not qqnow.__eq__(''):#初始化的时候的坑,初始化为'',前几行没用文本直接过滤value[qqnow]['text'].append(str(line))# print(name)#print(value[name])
if __name__ == '__main__':f = open('E:/text.txt', 'r', encoding='utf-8')  # 要进行分词处理的文本文件 (统统按照utf8文件去处理,省得麻烦)lines = f.readlines()#执行这个函数获取分析才能解析value{}analyseinformation(lines)getmotion(value)#这个函数获取一些name[]数组的值#核心分析函数:getspeaktimeall(time,name)#选定区间的同学发言次数getemotionall(time,text,name,qq)getstudentcloudbyqq(value,'694459644')getemotionbyqq(value,'694459644')
  • 发言的次数(我专挑小的区间为了展示)
  • 情绪总的比较(跑的比较慢因为多,情绪50为正常)
  • 某个同学的发言词云(我偷偷选了发言较多的班长。。)
  • 单个人的情感走势(我又偷偷分析了班长的?)

    可以看到这小子最近几次发言不太良好呢。

其实还是有遗憾的,因为snownlp训练的是商品评论正负语料,有的地方不一定很准。希望有机会自己能做一个情绪分析的包。哎,路还很长。

水平优先,比较喜欢这块,程序不够精简,如有改进地方,大佬请指正!

如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai

python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况相关推荐

  1. python爬取qq群成员_Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码...

    一位伙计自己开了个游戏室,想在群里拉点人,就用所学知识帮帮忙,于是就有了这篇文章,今天小编特此通过实例代码给大家介绍下Python selenium 加载并保存QQ群成员去除其群主.管理员信息的示例代 ...

  2. Python随笔|抓取QQ群成员头像

    最近需要用到QQ群成员的头像,但是,一个一个点开大家的头像再保存太麻烦了,所以就写了一段代码抓取一下. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...

  3. python 获取qq群成员信息_用Python编写工具获取QQ群成员的昵称和号码,使用,及,小...

    使用火狐浏览器进行数据的抓取,火狐浏览器对json比较友好 进入QQ群官网: 登录后,点击成员管理: 先随机选择一个群,抓取一下信息,找一下规律 打开浏览器控制台,重新刷新网页: 这是我们想要的一些信 ...

  4. python qq群自动加入_Python实现向QQ群成员自动发邮件的方法

    本文实例讲述了Python实现向QQ群成员自动发邮件的方法.分享给大家供大家参考.具体实现方法如下: 原理: 我们需要先获取QQ群中的所有成员并保存到一个txt文本中去,然后再由python读取文件然 ...

  5. python自动发送qq群消息_Python实现向QQ群成员自动发邮件的方法

    本文实例讲述了Python实现向QQ群成员自动发邮件的方法.分享给大家供大家参考.具体实现方法如下: 原理: 我们需要先获取QQ群中的所有成员并保存到一个txt文本中去,然后再由python读取文件然 ...

  6. python 写脚本 获取qq好友地理位置_Python获取统计自己的qq群成员信息的方法

    这篇文章主要介绍了Python获取统计自己的qq群成员信息的方法,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 首先说明一下需要使用的工具以及技术:python3 + ...

  7. 利用python获取自己的qq群成员信息!

    利用python获取自己的qq群成员信息! 首先说明一下需要使用的工具以及技术:python3 + selenium ,如有兴趣可以加群交流噢 selenium安装方法:pip install sel ...

  8. python抓取qq群消息_Python获取统计自己的qq群成员信息的方法

    首先说明一下需要使用的工具以及技术:python3 + selenium selenium安装方法:pip install selenium 前提:获取自己的qq群成员信息,自己必须是群主或者管理员, ...

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

    公众号文章链接 前一段时间就想做简单的可视化文本分析玩,今天就花点时间先对整体班级的QQ群聊天信息做一个简单的分析. 打算分两步做,本文是最简单的第一步过程 1:分析整个聊天记录的时间分配.并且用ma ...

最新文章

  1. 卷积神经网络中的各种池化操作
  2. 详解让人闹心的C++语句 cout<<“Hello“<<endl;
  3. 计算机基础知识作业答案,计算机基础与应用作业答案ID及计算机基础知识笔试题.doc...
  4. 可手工拖拽alv行记录的实例
  5. Android开源项目:GifView——Android显示GIF动画
  6. linux命令详解:file命令
  7. 【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
  8. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
  9. 【容器化部署简介】 基于腾讯云TKE: kubernetes(k8s), github actions, devops
  10. 智能药盒的设计与实现
  11. You have not concluded your merge (MERGE_HEAD exists).
  12. 和岳父岳母的有效沟通
  13. .net5 开启Lucene的全文搜索之旅
  14. iOS 项目源码大全 github 国内外大神
  15. CLion: rsync is not installed or not avaiable in PATH on remote host
  16. 接口测试-使用Postman发送请求
  17. BootLoader启动过程分析
  18. 根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试?
  19. 在Metamask中添加支持RIF币种
  20. Hive(20):Hive的函数之窗口函数

热门文章

  1. 微众WeCross 跨链平台(10)使用场景
  2. Hyperledger Fabric 智能合约实战 (5) go语言开发
  3. Hyperledger Fabric 链码(1) 类型
  4. 2022年美国大学生数学建模竞赛各题型常见参考代码汇总
  5. IDA无法反编译 and 提示错误
  6. redis的安装和运行
  7. python—多线程之数据混乱问题
  8. linux 静态编译 yara
  9. wxWidgets 编译 ICON 资源
  10. deedeedee crazy 寒假逆向生涯(11/100)