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

第二个情感分析写出来,主要通过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.6
   plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
   plt.figure(figsize=(8, 6))  ##指定图像比例: 8:6
   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)就出来了,这部分的坑点是标签的展示我以前记录过可以结合着看,就不详述了。这部分详细代码为:

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))  ##指定图像比例: 8:6
   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. 接下来我想分析的是每个人的发言词云,这部分第一篇也讲过实现的方式,代码就留在完整贴了。你可以查看你讨厌的人,喜欢的人,或者两个人的聊天记录。看看她关心啥。。嘿嘿

上一篇:jieba词频统计


下一篇:Python 基础 jieba库——词性标注与筛选