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