python分析qqチャット記録
4388 ワード
一、チャットの記録をエクスポートする.txt.
二、正規表現によるtxtマッチングにより、日付、時間、QQ番号、チャット内容の4つのリストが得られる.
正規表現解析:
1,'r'は文字のエスケープを防止するものであり,経路に't'が現れるとrを付けないと'tがエスケープされ,'r'を付けた後't'が元のままになる.raw string.
2、[]文字範囲を定義します.[d-]一致する数字と-形式の文字;s+複数のスペースに一致します.
[^]は任意の文字を表すが、任意の文字には異なる意味があり、一般的には空白の記号、改行は含まれず、場合によっては.を含む場合がある.
(?:x|y)非キャプチャパケットで、xとyのいずれかが正規表現のマッチングを完了します.)")と一致します.
それぞれ4つの部分を得る.(?<=()は、文字列に「(」が必要であることを示すが、一致した戻り値には「(」が保持されず、正回顧後に断言するという.
[^)]+は")"以外の任意の文字にマッチするので、qq番号が得られます.
三、全体のチャット内容と各ユーザーのチャット内容に対して語群を作成する.
1.qqごとに対応するチャットの記録を得る
2、データの前処理:分詞してチャットで記録した「表情」と「画像」を取り除く.
3、語群生成.wordcloudモジュール.
fontはwindowsが持参したフォントを使用します.scale語クラウドの各語の解像度は、大きくなればなるほどはっきりしますが、コンピュータはクラッシュします.
forループ保存ピクチャ'%s.jpg'%(string)フォーマットでピクチャの名前を設定します.
四、チャット時間帯の図面.xlsxからデータを読み出しpltで図を描く
二、正規表現による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()