Python QQ聊天記錄詞頻分析並製作詞雲

簡介

使用Python jieba / wordcloud 等對聊天記錄進行整理和分析,並生成詞雲

聊天記錄準備和提取

QQ導出聊天記錄

在QQ聊天框的消息記錄中,打開消息管理,右擊打開導出消息記錄,選擇txt形式

打開大概是這個亞子

正則表達式提取消息文本

發現裏面有空行,有消息日期暱稱等,而且並不是你一句我一句,所以用正則表達式進行提取

首先讀入文件(注意utf-8中文)區分暱稱(即哪一句是你,哪一句是對方)定義日期的正則表達式(這樣就能知道哪一行是日期)

f1 = open("滾去學習(2377919782).txt", "r", encoding="utf-8")
zhr_name = ["東都大白兔", "name=main", "今天必須早睡"]
zyf_name = ["洛安。", "帆大訊飛", "小帆訊飛", "別找她!舔狗!", "別生氣,別衝動,別理她", "快去學習", "滾去學習"]
timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}")

關於正則,d{n}的意思是n個整數,即按照文件中的日期格式,如果出現4個整數-1或2個-1或2個

 

句子和詞彙處理

句子分流

將每個聊天句子根據人進行分類

nzyf = 0
nzhr = 0
flag = 0
lines = f1.readlines()
zyf_s = []
zhr_s = []
for line in lines:
	line = line.replace("[圖片]", "")
	line = line.replace("[表情]", "")
	line = line.replace("\n", "")
	if flag == "zyf":
		zyf_s.append(line)
		flag = 0
	if flag == "zhr":
		zhr_s.append(line)
		flag = 0
	if re.search(timepat, line):
		for w in zyf_name:
			if w in line:
				flag = "zyf"
				break
		for w in zhr_name:
			if w in line:
				flag = "zhr"
				break

遍歷每個句子,如果是符合時間正則,則判斷後面的暱稱是誰,並將flag進行標記,如果for循環看到flag爲zyf或者zhr,則將其放到對應的列表中。因爲for中只有三個if,所以其他情況直接跳過

詞彙處理

remove_words = [u'的', u',',u'和', u'是', u'隨着', u'對於', u'對',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
                u'通常',u'如果',u'我們',u'需要',u'我',u'你',u'?',u"",u" ",u"就",u"不","啊",
                u"吧",u"也",u"不是",u"就是",u"什麼",u"怎麼",u"這個",u"這麼",u"一個"]

k = 0
words = []
for s in zyf_s:
	if "趙先生" in s:
		words.append("趙先生")
	k += 1
	thelist = jieba.cut(s, cut_all = False)
	for word in thelist:
		if word not in remove_words:
			if len(word) > 1:
				words.append(word)
			if k < 20:
				print(word)

word_counts = collections.Counter(words)
words_top10 = word_counts.most_common(50)
print(words_top10)

我們這裏只統計zyf說的話,遍歷列表中每一句話,可以添加自定義的詞,比如“趙先生”,這樣jieba就不會拆分開(當然也可使用結巴自定義詞典)

jieba.cut進行分詞,如果是常見詞(remove_words)跳過,如果大於1的話,放入列表

詞雲製作

mask = np.array(Image.open("cloud2.jpeg"))
wc = wordcloud.WordCloud(
	background_color="black",
	font_path='zi.ttf',
	mask=mask,
	max_words=200,
	max_font_size=500
	)

wc.generate_from_frequencies(word_counts)
image_colors = wordcloud.ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
plt.imshow(wc)
plt.axis('off')
plt.savefig("zyf2.png", dpi=1000)
plt.show()

mask定義爲作爲詞雲背景的圖片,使用np轉爲向量形式

wc爲詞雲參數定義,font_path爲字體文件,可百度ttf文件下載,max_font_size爲最大的詞尺寸,使用plt進行繪製

效果

代碼

import jieba
import re
import collections
import wordcloud
from PIL import Image
import matplotlib.pyplot as plt 
import numpy as np 

f1 = open("滾去學習(2377919782).txt", "r", encoding="utf-8")
zhr_name = ["東都大白兔", "name=main", "今天必須早睡"]
zyf_name = ["洛安。", "帆大訊飛", "小帆訊飛", "別找她!舔狗!", "別生氣,別衝動,別理她", "快去學習", "滾去學習"]
timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}")

nzyf = 0
nzhr = 0
flag = 0
lines = f1.readlines()
zyf_s = []
zhr_s = []
for line in lines:
	line = line.replace("[圖片]", "")
	line = line.replace("[表情]", "")
	line = line.replace("\n", "")
	if flag == "zyf":
		zyf_s.append(line)
		flag = 0
	if flag == "zhr":
		zhr_s.append(line)
		flag = 0
	if re.search(timepat, line):
		for w in zyf_name:
			if w in line:
				flag = "zyf"
				break
		for w in zhr_name:
			if w in line:
				flag = "zhr"
				break

print(len(zhr_s))
print(len(zyf_s))
print(zhr_s[0:20])

remove_words = [u'的', u',',u'和', u'是', u'隨着', u'對於', u'對',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
                u'通常',u'如果',u'我們',u'需要',u'我',u'你',u'?',u"",u" ",u"就",u"不","啊",
                u"吧",u"也",u"不是",u"就是",u"什麼",u"怎麼",u"這個",u"這麼",u"一個"]
k = 0
words = []
for s in zyf_s:
	if "趙先生" in s:
		words.append("趙先生")
	k += 1
	thelist = jieba.cut(s, cut_all = False)
	for word in thelist:
		if word not in remove_words:
			if len(word) > 1:
				words.append(word)
			if k < 20:
				print(word)

word_counts = collections.Counter(words)
words_top10 = word_counts.most_common(50)
print(words_top10)

mask = np.array(Image.open("cloud2.jpeg"))
wc = wordcloud.WordCloud(
	background_color="black",
	font_path='zi.ttf',
	mask=mask,
	max_words=200,
	max_font_size=500
	)

wc.generate_from_frequencies(word_counts)
image_colors = wordcloud.ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)
plt.imshow(wc)
plt.axis('off')
plt.savefig("zyf2.png", dpi=1000)
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章