python分析qqチャット記録

4388 ワード

一、チャットの記録をエクスポートする.txt.
二、正規表現によるtxtマッチングにより、日付、時間、QQ番号、チャット内容の4つのリストが得られる.
正規表現解析:
1,'r'は文字のエスケープを防止するものであり,経路に't'が現れるとrを付けないと'tがエスケープされ,'r'を付けた後't'が元のままになる.raw string.
2、[]文字範囲を定義します.[d-]一致する数字と-形式の文字;s+複数のスペースに一致します.
[^]は任意の文字を表すが、任意の文字には異なる意味があり、一般的には空白の記号、改行は含まれず、場合によっては.を含む場合がある.
(?:x|y)非キャプチャパケットで、xとyのいずれかが正規表現のマッチングを完了します.)")と一致します.
import re
import wordcloud as wc
import jieba
import matplotlib.pyplot as plt
from scipy.misc import imread
re_pat = r'20[\d-]{8}\s[\d:]{7,8}\s+[^
]+(?:\d{5,11}|@\w+\.[comnetcn]{2,3})\)' # , fn = r'./in/1.txt' with open(fn, 'r', encoding='utf-8', errors='ignore') as reader: txt = reader.read() # find pattern log_title_arr = re.findall(re_pat, txt) # ['2016-06-24 15:42:52 (40**21)',…] # split pattern ,[:1] 。 , qq log_content_arr = re.split(re_pat, txt)[1:] # ['
', '


', '
…]

それぞれ4つの部分を得る.(?<=()は、文字列に「(」が必要であることを示すが、一致した戻り値には「(」が保持されず、正回顧後に断言するという.
[^)]+は")"以外の任意の文字にマッチするので、qq番号が得られます.
for i in range(int(len(log_title_arr))):
    date = re.search(r'20[\d-]{8}\s[\d:]{7,8}', log_title_arr[i]).group()  #          
    qq = re.search(r'(?<=\()[^\)]+', log_title_arr[i]).group()  #        QQ 
    content = log_content_arr[i].strip('
') # hour = re.search(r'(?<=\s)[^\:]+', date).group() # times.append(date) # hours.append(hour) # qqs.append(qq) # qq contents.append(content) # entity.append((date, qq, content))

 
三、全体のチャット内容と各ユーザーのチャット内容に対して語群を作成する.
1.qqごとに対応するチャットの記録を得る
#         
oneqq = set(qqs)
print(oneqq)
for qq in oneqq:
    contentuser = ''
    for i in range(len(entity)):
        if qq == entity[i][1]:
            contentuser += entity[i][2]

2、データの前処理:分詞してチャットで記録した「表情」と「画像」を取り除く.
all_text = contentuser.replace('
', '') all_text = all_text.replace('\u3000', '') seg_list = jieba.cut(all_text, cut_all=False) words = ' ' for seg in seg_list: if seg not in stopwords and seg != ' 'and seg != ' 'and seg !=' 'and seg !=' ': words = words + seg + ' ' print(words)

3、語群生成.wordcloudモジュール.
fontはwindowsが持参したフォントを使用します.scale語クラウドの各語の解像度は、大きくなればなるほどはっきりしますが、コンピュータはクラッシュします.
forループ保存ピクチャ'%s.jpg'%(string)フォーマットでピクチャの名前を設定します.
font = r"C:\WINDOWS\Fonts\simhei.ttf"
color_mask = imread('./3.jpg')
cloud = wc.WordCloud(scale=16,
                         font_path=font,  #     
                         background_color="white",  #     
                         max_words=500,  #          
                         mask=color_mask,  #       
                         max_font_size=100,  #      
                         width=800,
                         height=800,
                         random_state=42)
 mywc = cloud.generate(words)
 plt.imshow(mywc)
 #plt.title(qq,fontsize=20)
 #plt.savefig("%d.jpg"%(int(qq)),dpi=300) #save   show    ,          
 mywc.to_file('%s.jpg'%(qq))
 plt.show()

四、チャット時間帯の図面.xlsxからデータを読み出しpltで図を描く
#/usr/bin/env python
# -*- coding:utf-8 -*-
import xlrd
import matplotlib.pyplot as plt
import numpy as np
def fileload(filename = '   .xlsx'):
    dataset = []
    workbook = xlrd.open_workbook(filename)
    table = workbook.sheets()[0]
    for row in range(table.nrows):
        dataset.append(table.row_values(row))
    return dataset



filename = './out/1.xlsx'
a = fileload(filename)
x = []
y = []
for i in range(len(a)-1):
    x.append(a[i+1][0])
    y.append(int(a[i+1][1]))


plt.rcParams['font.sans-serif'] = ['SimHei']  #           
#plt.figure(figsize=(8, 6))  ##      : 8:6
plt.subplots_adjust(bottom=0.2)
plt.plot(x, y, color="red", label="times")
plt.xlabel("  00:00—24:00")
plt.ylabel("    / ")
plt.xticks(range(0, 24), rotation=75, fontsize=15)  #        24 。
plt.yticks(fontsize=10)
plt.show()