Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python可视化文本分析(2)—snownlp+jieba分析QQ群成员发言情况

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

作者头像
bigsai
发布于 2019-09-24 03:52:38
发布于 2019-09-24 03:52:38
92700
代码可运行
举报
文章被收录于专栏:bigsaibigsai
运行总次数:0
代码可运行

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

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

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

  1. 正则匹配文本内容,第一篇只考虑总计文本的展示,并没有考虑到群成员的群体。所以要用字典{}讲学生的qq/邮箱和昵称存一下。还有他的发言记录。这里有个比较重要的是他的昵称可能是变得,你的群消息里面展示的是那个时候他的群昵称,,可能从大演说家变成啥啥啥的。所以我的思想就是主要按照qq/邮箱这个点确定唯一,而昵称只用第一次出现的。文本先相加。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中,但是我想用几个小数组 分开存储一些信息。可以稍微处理一下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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图形显示不了太多,我显示部分(可以自己更改,只不过是效果问题),你还可以自定义排序完成排序然后再展示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#展示各个同学的发言次数
def getspeaktimeall(time,name):
    Xi = np.array(time[20:50])#根据自己展示的需要需改范围,我们群人数太多
    Yi = np.array(name[20:50])
    x=np.arange(0,30,1)
    width=0.6
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.figure(figsize=(8, 6))  ##指定图像比例: 86
    plt.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)就出来了,这部分的坑点是标签的展示我以前记录过可以结合着看,就不详述了。这部分详细代码为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.6
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.figure(figsize=(8, 6))  ##指定图像比例: 86
    plt.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条记录,没用基于时间,如果有兴趣你还可以把时间整合进来。核心代码为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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))  ##指定图像比例: 86
    plt.plot(x,y,label='emotion status')
    plt.xlabel("最近200次发言情绪走势")
    plt.ylabel("0-1表示消极-积极")
    plt.legend()
    plt.show()

附上代码和展示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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))  ##指定图像比例: 86
    plt.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.6
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.figure(figsize=(8, 6))  ##指定图像比例: 86
    plt.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.6
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.figure(figsize=(8, 6))  ##指定图像比例: 86
    plt.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')






  • 发言的次数(我专挑小的区间为了展示)
  • 情绪总的比较(跑的比较慢因为多)
  • 某个同学的发言词云(我偷偷选了发言较多的班长。。)
  • 单个人的情感走势(我又偷偷分析了班长的?)

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bigsai 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python可视化文本分析-分析Q群聊天记录(一)
代码开箱可用,你需要把你的文件名替换正确的路径,还有要在同级目录下创建img文件夹保存生成的两张图片。各种依赖环境很简单,直接pip install xxx。 附上核心代码:
bigsai
2019/09/24
1.7K0
python可视化文本分析-分析Q群聊天记录(一)
数学建模学习笔记(十)语言情感计算( TextBlob与SnowNLP)
自然语言处理的情感分析比较复杂,这里有两个好用的python库,针对英文的TextBlob和仿照其针对中文的SnowNLP
zstar
2022/06/14
7470
常见的文本分析大汇总
文本分析的核心是自然语言处理,本文只能说是冰山一角,但是对于日常挖掘有用的文本信息也还OK,但是如果想更深层次的挖掘文本信息,还是需要寻求专业算法工程师的帮助,例如NLP实验室的同学们~
HsuHeinrich
2023/08/10
4720
常见的文本分析大汇总
python snownlp情感分析简易demo
SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。MIT许可下发行。 其 github 主页 我自己修改了上文链接中的python代码并加入些许注释,以方便你的理解:
Ryan_OVO
2023/10/18
3440
python snownlp情感分析简易demo
《小美好》短评文本情感分析+生成词云
因为最近看了一下《致我们单纯的小美好》,虽然情节是有点“二”吧,但是看了觉得真的很怀念初高中的日子,一时玩心大发,于是就想搞点有意思的东西。。。首先去爬了豆瓣上面的短评,然后就是用SnowNLP做了一
机器学习AI算法工程
2018/03/15
1.2K0
《小美好》短评文本情感分析+生成词云
使用snownlp进行评论情感分析
背景 最近项目中有一个需求,希望分析用户对某些商品的评论,以推测用户对这些商品的情感倾向,从而为运营人员管理这些商品提供依据。 这个问题属于自然语言处理的范畴,国外有很多这方面的论文。但我不是搞学术的,得想办法快速解决这个问题。 从网上看到一哥们通过微博分析女朋友的情绪,他的方案里包括分词的选择、情绪分析词典的选择、情绪值的计算等,但因为自己实现的效果比较差,最后废弃了自己的方案,直接选择了腾讯文智的情感分析收费服务。 因为最近研究过tensorflow,也了解到使用tensorflow参
jeremyxu
2018/05/10
3.2K0
手把手教你对抓取的文本进行分词、词频统计、词云可视化和情感分析
前几天星耀群有个叫【小明】的粉丝在问了一道关于Python处理文本可视化+语义分析的问题,如下图所示。
Python进阶者
2022/03/09
3K1
手把手教你对抓取的文本进行分词、词频统计、词云可视化和情感分析
用 Python分析朋友圈好友的签名
需要用到的第三方库: numpy:本例结合wordcloud使用 jieba:对中文惊进行分词 PIL: 对图像进行处理(本例与wordcloud结合使用) snowlp:对文本信息进行情感判断 wordcloud:生成词云 matplotlib:绘制2D图形 # -*- coding: utf-8 -*- """ 朋友圈朋友签名的词云生成以及 签名情感分析 想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载! """ import re,jie
py3study
2020/01/17
3910
Python 词云分析周杰伦新歌《说好不哭》
周杰伦难得出新歌 ,最近终于推出了单曲《说好不哭》,然后直接把QQ音乐服务器干崩了,天王的实力可见一斑,QQ音乐还把这个当作 今天过年
苏生不惑
2019/10/30
8480
Python 词云分析周杰伦新歌《说好不哭》
【Python】文本分析
依赖库 pip install jieba pip install matplotlib pip install wordcloud pip install snownlp 词频统计 # -*- coding: utf-8 -*- import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt # 加载自定义分词字典 jieba.load_userdict("news.txt") # 语料 corpos = "美
py3study
2020/01/14
1.2K0
【Python3爬虫】你会怎么评价复仇者
最近复仇者联盟4正在热映中,很多人都去电影院观看了电影,那么对于这部电影,看过的人都是怎么评价的呢?这时候爬虫就可以派上用场了!
py3study
2020/01/16
5210
用Python爬取了《雪中悍刀行》数据,并将其可视化分析后,终于知道它为什么这么火了~
本期是对腾讯热播剧——雪中悍刀行的一次爬虫与数据分析,耗时一个小时,总爬取条数1W条评论,很适合新人练手,值得注意的一点是评论的情绪文本分析处理,这是第一次接触的知识。
陈晨135
2022/01/04
7270
用Python爬取了《雪中悍刀行》数据,并将其可视化分析后,终于知道它为什么这么火了~
用Python爬取了《扫黑风暴》数据,并将其可视化分析后,终于知道它为什么这么火了~
本期是对腾讯热播剧——扫黑风暴的一次爬虫与数据分析,耗时两个小时,总爬取条数3W条评论,总体来说比较普通,值得注意的一点是评论的情绪文本分析处理,这是第一次接触的知识。
用户8949263
2022/04/08
5940
用Python爬取了《扫黑风暴》数据,并将其可视化分析后,终于知道它为什么这么火了~
用python实现一个豆瓣通用爬虫(登陆、爬取、可视化分析)
在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块、工具知识的使用。然而我所在的组刚好遇到的是python爬虫的小课题。
bigsai
2020/11/03
2.8K0
用python实现一个豆瓣通用爬虫(登陆、爬取、可视化分析)
哪吒票房逼近30亿,从豆瓣短评简单分析人们对哪吒的态度
看前点个关注吧! 目录 前言 分析 具体步骤 登录 爬取与存储 可视化分析 结语 前言 暑期档电影惨淡,但随着哪吒爆红开拓了新局面。这也是国产动画的首次爆红。在哪吒刚出,笔者以为最多10亿就算不错的
bigsai
2019/09/24
3780
哪吒票房逼近30亿,从豆瓣短评简单分析人们对哪吒的态度
Python人工智能 | 二十二.基于大连理工情感词典的情感分析和情绪计算
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了CNN实现中文文本分类的过程,并与贝叶斯、决策树、逻辑回归、随机森林、KNN、SVM等分类算法进行对比。这篇文章将详细讲解通过自定义情感词典(大连理工词典)实现情感分析和情绪分类的过程,并与SnowNLP进行对比,为后续深度学习和自然语言处理(情感分析、实体识别、实体对齐、知识图谱构建、文本挖掘)结合做基础,希望对您有所帮助~
Eastmount
2024/02/23
1.5K0
Python人工智能 | 二十二.基于大连理工情感词典的情感分析和情绪计算
python 中文情感分析 Snownlp库的使用
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode编码。
叶庭云
2020/09/17
12.2K0
python 中文情感分析  Snownlp库的使用
Python爬虫实战:快手数据采集与舆情分析
在短视频时代,快手作为国内领先的短视频平台之一,积累了海量的用户数据、视频内容和互动信息。这些数据对市场分析、用户行为研究、舆情监测等具有重要价值。本文将介绍如何使用Python爬虫技术采集快手数据,并基于NLP(自然语言处理)进行简单的舆情分析。
小白学大数据
2025/06/13
3331
从数据角度探究《前任3》为什么这么火爆
豆瓣上8万多人只打出了5.8的评分,其中1星-3星占比72.6%,那么问题来了,在绝大多数豆瓣粉丝都认为是“烂片”的情况下,究竟是什么让《前任3》票房意外火爆呢?
Python攻城狮
2018/08/23
4520
从数据角度探究《前任3》为什么这么火爆
Python爬虫实战:快手数据采集与舆情分析
在短视频时代,快手作为国内领先的短视频平台之一,积累了海量的用户数据、视频内容和互动信息。这些数据对市场分析、用户行为研究、舆情监测等具有重要价值。本文将介绍如何使用Python爬虫技术采集快手数据,并基于NLP(自然语言处理)进行简单的舆情分析。
小白学大数据
2025/06/12
2490
推荐阅读
相关推荐
python可视化文本分析-分析Q群聊天记录(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验