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()

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值