日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2025/3/20 python 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

公眾號文章鏈接

第二個情感分析,主要通過python實現(xiàn)qq群消息分析,分析群成員發(fā)言總次數(shù),群成員情緒對比,單個群成員的發(fā)言詞云狀況以及單個同學的發(fā)言情感走勢。
用到一下庫:

  • re正則,matplotlib,wordcloud,numpy,jieba分詞,snownlp情感分析。
  • 上述庫的用法很簡單,安裝也很簡單,所以不需要擔心門檻。

最好結(jié)合第一篇或者先看第一篇
詳細說一下模塊的制作流程:

  • 正則匹配文本內(nèi)容,第一篇只考慮總計文本的展示,并沒有考慮到群成員的群體。所以要用字典{}講學生的qq/郵箱和昵稱存一下。還有他的發(fā)言記錄。這里有個比較重要的是他的昵稱可能是變得,你的群消息里面展示的是那個時候他的群昵稱,,可能從大演說家變成啥啥啥的。所以我的思想就是主要按照qq/郵箱這個點確定唯一,而昵稱只用第一次出現(xiàn)的。文本先相加。
  • 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紅包]我發(fā)了一個“專享紅包”,請使用新版手機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#當前用戶發(fā)言發(fā)生了更改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中,但是我想用幾個小數(shù)組分開存儲一些信息。可以稍微處理一下:
  • time=[]#次數(shù) 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)
  • 剩下就可以開始完成自己想要展示的部分了。首先,我想查看這段時間每個人到底發(fā)言多少次。因為matplotlib圖形顯示不了太多,我顯示部分(可以自己更改,只不過是效果問題),你還可以自定義排序完成排序然后再展示:
  • #展示各個同學的發(fā)言次數(shù) def getspeaktimeall(time,name):Xi = np.array(time[20:50])#根據(jù)自己展示的需要需改范圍,我們?nèi)喝藬?shù)太多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()
  • 我還想看到所有人的發(fā)言情感總的比較。那么我就將所有同學的發(fā)言成為一個大的字符串,然后用snownlp去分析,snownlp的api很簡單。
    s=SnowNLP(text)
    print(s.sentiments)就出來了,這部分的坑點是標簽的展示我以前記錄過可以結(jié)合著看,就不詳述了。這部分詳細代碼為:
  • 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='同學發(fā)言總情緒', 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()
  • 接下來我想分析的是每個人的發(fā)言詞云,這部分第一篇也講過實現(xiàn)的方式,代碼就留在完整貼了。你可以查看你討厭的人,喜歡的人,或者兩個人的聊天記錄。看看她關心啥。。嘿嘿?。
  • 我還想看的就是每個人的情感走向,這個也挺有價值的,你可以分析她或他最近的若干條的情感走勢,如果整合最小二乘法預測還能畫一條情感預測的走勢出來,這里就先不畫了。我才用的是折線圖,1代表積極,0代表消極,0.5代表中性。因為有的人發(fā)言太多,不利于圖標展示,我只去了他最近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次發(fā)言情緒走勢")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=[]#次數(shù) 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)相關內(nèi)容 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次發(fā)言情緒走勢")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, # 設置有多少種隨機生成狀態(tài),即有多少種配色方案) # 字體這里有個坑,一定要設這個參數(shù)。否則會顯示一堆小方框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='同學發(fā)言總情緒', 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() #展示各個同學的發(fā)言次數(shù) def getspeaktimeall(time,name):Xi = np.array(time[20:50])#根據(jù)自己展示的需要需改范圍,我們?nèi)喝藬?shù)太多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紅包]我發(fā)了一個“專享紅包”,請使用新版手機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#當前用戶發(fā)言發(fā)生了更改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') # 要進行分詞處理的文本文件 (統(tǒng)統(tǒng)按照utf8文件去處理,省得麻煩)lines = f.readlines()#執(zhí)行這個函數(shù)獲取分析才能解析value{}analyseinformation(lines)getmotion(value)#這個函數(shù)獲取一些name[]數(shù)組的值#核心分析函數(shù):getspeaktimeall(time,name)#選定區(qū)間的同學發(fā)言次數(shù)getemotionall(time,text,name,qq)getstudentcloudbyqq(value,'694459644')getemotionbyqq(value,'694459644')
    • 發(fā)言的次數(shù)(我專挑小的區(qū)間為了展示)
    • 情緒總的比較(跑的比較慢因為多,情緒50為正常)
    • 某個同學的發(fā)言詞云(我偷偷選了發(fā)言較多的班長。。)
    • 單個人的情感走勢(我又偷偷分析了班長的?)

      可以看到這小子最近幾次發(fā)言不太良好呢。

    其實還是有遺憾的,因為snownlp訓練的是商品評論正負語料,有的地方不一定很準。希望有機會自己能做一個情緒分析的包。哎,路還很長。

    水平優(yōu)先,比較喜歡這塊,程序不夠精簡,如有改進地方,大佬請指正!

    如果對后端、爬蟲、數(shù)據(jù)結(jié)構算法等感性趣歡迎關注我的個人公眾號交流:bigsai

    總結(jié)

    以上是生活随笔為你收集整理的python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。