python可視化文本分析(1)—分析QQ班羣聊天記錄宏觀

公衆號文章連接前端

  • 前一段時間就想作簡單的==可視化文本分析==玩,今天就花點時間先對總體班級的==QQ羣聊天信息作一個簡單的分析==。
  • 打算分兩步作,本文是最簡單的第一步過程
    • 1:分析整個聊天記錄的時間分配。而且用matplotlib展現出來。並把整個聊天的關鍵詞作成詞雲。
    • 2:融入snownlp情感分析,分析每一個同窗的詞雲分佈,每一個同窗的發言次數狀況,以及每一個同窗文本的情緒走勢以及展現。 等等
    • 總的來講就是先試試水,而後再作第二個。用到的庫有:jieba分詞,wordcloud詞雲,numpy數組,matplotlib可視化,snownlp(第二個),re正則(很重要)。這些用不到深刻的東西,只用到很簡單的一小部分,均可以直接 pip install xxx。
  • 言歸正傳,下面說一下個人學習歷程:
  1. 首先,第一步就是導出羣聊消息,再qq的資源管理器上選擇羣能夠==導出羣消息==記錄成txt文本。
  2. 要觀察聊天記錄的規則,瞭解==文本結構==。可以解析下列方框標註的內容很重要。
    在這裏插入圖片描述
    這部分主要的文本格式爲:
2018-05-05 15:55:40 2班某某(1315426911)
2018-05-07 13:48:39 2XXX<xxxx@qq.com>
複製代碼
  1. 下一步就須要==正則匹配==獲取相應的內容。 這個地方的正則匹配規則也很簡單,由於格式固定. 可是我要分配各個聊天的時間,那麼就要匹配"15:55:40"這段話,能夠重寫一個正則或者在原來的正則上添加,我選擇重寫正則,對於==正則取值==前端時間簡單寫過取值兩個正則表達式爲:
pattern=re.compile(r'(\d*)-(\d*)-(\d*) .* .*')#匹配 信息
pattern2=re.compile(r'(\d+):(\d+):\d+')#匹配 15:55:40
複製代碼
  1. 既然能取到上一步驟人說的話,那麼咱們在下一步就須要對==數據去噪==。那些數據會對結果有影響可是咱們不須要的,這裏大體列了幾個(要注意的是文本換行符/n,每行不管是什麼都有一個換行符):
    • 空格消息
    • 紅包
    • 表情
    • 撤回的消息
    • 圖片
    • @全體成員
    • 個別羣復讀機嚴重適當處理
    • 其餘
  2. 這樣每次按行讀取,添加對應的次數和文本內容和水羣次數。
  3. 製做聊天時間分佈圖。使用matplotlib展現座標的一些坑點已經解決。保存圖片到本地。
  4. 將各個文本合併生成班級主題詞雲。保存圖片到本地。
  5. 觀察詞雲的詞是否有不應出現的詞語,分析緣由對數據進行==二次去噪==。我當時就是由於第一次寫的正則沒有匹配"2018-05-07 13:48:39 2班xxxxxxx@qq.com"致使詞雲出現一個同窗的名字。。後來把正則改了就決絕了。你也可能會遇到特殊狀況須要常常@某我的,,你能夠自行處理。

代碼開箱可用,你須要把你的文件名==替換正確的路徑==,還有要在同級目錄下==建立img文件夾==保存生成的兩張圖片。各類依賴環境很簡單,直接pip install xxx。 附上核心代碼:python

import re
import numpy as np
import matplotlib.pyplot as plt  ##繪圖庫
from wordcloud import WordCloud
import jieba.analyse
string="2018-05-05 15:55:40 2班某某(1315426911)"
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'(\()(.*?)(\))')#匹配 2班某某(1315426911)相關內容
f = open('E:/text.txt', 'r', encoding='utf-8')  # 要進行分詞處理的文本文件 (通通按照utf8文件去處理,免得麻煩)
lines = f.readlines()
index=0
def getpicture(y):#matplotlib繪圖
    x=[]
    for i in range(0,24):
        x.append(str(i)+':00-'+str(i+1)+':00')
    Xi = np.array(x)
    Yi = np.array(y)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤
    plt.figure(figsize=(8, 6))  ##指定圖像比例: 8:6
    plt.subplots_adjust(bottom=0.2)
    plt.scatter(Xi, Yi, color="red", label="times")
    plt.xlabel("時間00:00—24:00")
    plt.ylabel("發言次數/次")
    plt.xticks(range(0,24),rotation=75,fontsize=10)#設置橫座標顯示24次。
    plt.yticks(range(0,1000,50))
   # plt.legend(loc='lower right') # 繪製圖例
   # plt.show()
    plt.savefig("img/hour.png",format='png')
    plt.close()
def getciyun(value):
    text=''
    for i in range(0,24):
        text+=str(value[i]['text'])
    args=jieba.analyse.extract_tags(text,topK=80)
    text=' '.join(args)
    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()
    wc.to_file('img/wordcloud.png')
def analysebyhour(lines):
    value=[]
    y=[]
    index=0
    for i in range(0,24):
        value.append({})
        value[i]['time']=0
        value[i]['text']=''
    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)):#匹配到正確的對象
                date=pattern.search(line)
                hour=pattern2.search(line).group(1)
                #print(date.group(0),hour)
                value[int(hour)]['time']+=1
                index=hour
           else:
               print(line)
               value[int(index)]['text']+=str(line)
    for i in range(0,24):
        print('time:',i,'time',value[i]['time'])
        y.append(value[i]['time'])
    getpicture(y)
    getciyun(value)
analysebyhour(lines)
複製代碼

而後兩張圖片就出來了: 正則表達式

在這裏插入圖片描述
在這裏插入圖片描述

  • 第一個點狀圖能夠發現咱們的聊天時間11:00-12:00突出,17:00-18:00突出,由於這個時間咱們沒有課程在吃飯或者玩,有時候下午或者晚上或者其餘的安排或者考試啥的可能會討論。而13:00-14:00這個點咱們大部分在午休通常沒人聊天。可是醒了以後就會一直很活躍😀。
  • 第二個詞雲能夠看的出咱們最近在聊啥,由於個人記錄是5月十幾纔開始,記錄不足,準備找一份記錄足的作下一個研究。你可能經過詞雲發現個人其實還有挺大的不足就是QQ小冰沒有過濾掉。但願若是讀者有興趣嘗試能夠處理一下。

經過這些簡單的文本分析感受頗有趣,有興趣等有時間把第二種也作出來,那種可能作起來比較麻煩一些。可是難道仍是不大的。這些東西看似高深,其實瞭解api作起來很簡單。api

但願一塊兒加油。數組

相關文章
相關標籤/搜索