簡介
使用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()