python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况
公众号文章链接
第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势。
用到一下库:
- re正则,matplotlib,wordcloud,numpy,jieba分词,snownlp情感分析。
- 上述库的用法很简单,安装也很简单,所以不需要担心门槛。
最好结合第一篇或者先看第一篇
详细说一下模块的制作流程:
- 正则匹配文本内容,第一篇只考虑总计文本的展示,并没有考虑到群成员的群体。所以要用字典{}讲学生的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))
- 上面就说讲所有有用的信息放到字典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)
- 剩下就可以开始完成自己想要展示的部分了。首先,我想查看这段时间每个人到底发言多少次。因为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()
- 我还想看到所有人的发言情感总的比较。那么我就将所有同学的发言成为一个大的字符串,然后用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代表积极,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群成员发言情况相关推荐
- python爬取qq群成员_Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码...
一位伙计自己开了个游戏室,想在群里拉点人,就用所学知识帮帮忙,于是就有了这篇文章,今天小编特此通过实例代码给大家介绍下Python selenium 加载并保存QQ群成员去除其群主.管理员信息的示例代 ...
- Python随笔|抓取QQ群成员头像
最近需要用到QQ群成员的头像,但是,一个一个点开大家的头像再保存太麻烦了,所以就写了一段代码抓取一下. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...
- python 获取qq群成员信息_用Python编写工具获取QQ群成员的昵称和号码,使用,及,小...
使用火狐浏览器进行数据的抓取,火狐浏览器对json比较友好 进入QQ群官网: 登录后,点击成员管理: 先随机选择一个群,抓取一下信息,找一下规律 打开浏览器控制台,重新刷新网页: 这是我们想要的一些信 ...
- python qq群自动加入_Python实现向QQ群成员自动发邮件的方法
本文实例讲述了Python实现向QQ群成员自动发邮件的方法.分享给大家供大家参考.具体实现方法如下: 原理: 我们需要先获取QQ群中的所有成员并保存到一个txt文本中去,然后再由python读取文件然 ...
- python自动发送qq群消息_Python实现向QQ群成员自动发邮件的方法
本文实例讲述了Python实现向QQ群成员自动发邮件的方法.分享给大家供大家参考.具体实现方法如下: 原理: 我们需要先获取QQ群中的所有成员并保存到一个txt文本中去,然后再由python读取文件然 ...
- python 写脚本 获取qq好友地理位置_Python获取统计自己的qq群成员信息的方法
这篇文章主要介绍了Python获取统计自己的qq群成员信息的方法,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 首先说明一下需要使用的工具以及技术:python3 + ...
- 利用python获取自己的qq群成员信息!
利用python获取自己的qq群成员信息! 首先说明一下需要使用的工具以及技术:python3 + selenium ,如有兴趣可以加群交流噢 selenium安装方法:pip install sel ...
- python抓取qq群消息_Python获取统计自己的qq群成员信息的方法
首先说明一下需要使用的工具以及技术:python3 + selenium selenium安装方法:pip install selenium 前提:获取自己的qq群成员信息,自己必须是群主或者管理员, ...
- python可视化文本分析(1)—分析QQ班群聊天记录宏观
公众号文章链接 前一段时间就想做简单的可视化文本分析玩,今天就花点时间先对整体班级的QQ群聊天信息做一个简单的分析. 打算分两步做,本文是最简单的第一步过程 1:分析整个聊天记录的时间分配.并且用ma ...
最新文章
- 卷积神经网络中的各种池化操作
- 详解让人闹心的C++语句 cout<<“Hello“<<endl;
- 计算机基础知识作业答案,计算机基础与应用作业答案ID及计算机基础知识笔试题.doc...
- 可手工拖拽alv行记录的实例
- Android开源项目:GifView——Android显示GIF动画
- linux命令详解:file命令
- 【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
- 深入理解PHP内核(十二)函数-函数的定义、传参及返回值
- 【容器化部署简介】 基于腾讯云TKE: kubernetes(k8s), github actions, devops
- 智能药盒的设计与实现
- You have not concluded your merge (MERGE_HEAD exists).
- 和岳父岳母的有效沟通
- .net5 开启Lucene的全文搜索之旅
- iOS 项目源码大全 github 国内外大神
- CLion: rsync is not installed or not avaiable in PATH on remote host
- 接口测试-使用Postman发送请求
- BootLoader启动过程分析
- 根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试?
- 在Metamask中添加支持RIF币种
- Hive(20):Hive的函数之窗口函数