Python制作词云丨分析QQ群聊信息,记录词频并制作词云

举报
AXYZdong 发表于 2022/02/19 09:59:42 2022/02/19
【摘要】 【Python制作词云,分析QQ群聊信息,记录词频并制作词云】正则表达,提取群成员消息,词汇处理,制作词云。

Author:AXYZdong 自动化专业 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!


在这里插入图片描述

▲ 果然 @全体成员 最多

环境:Python 3.7
开发工具:自带的IDLE


一、前期准备

1.提取QQ聊天记录

1、QQ 聊天框打开消息管理
在这里插入图片描述

2、选择需要提取聊天记录的群,然后右击选择导出聊天记录

在这里插入图片描述


3、选择保存为 .txt 格式

在这里插入图片描述


4、保存后打开是这个样子:

在这里插入图片描述

记得把这个 .txt 文件保存到与后面建立的 .py 文件的同一个目录里面

2.准备相关的库

pip install xxx 就可以了

import jieba
import re
import collections
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator  
from PIL import Image
import matplotlib.pyplot as plt 

wordcloud 这个安装时可能会报错,可以尝试以下方法:

  • 这里 手动下载
  • cp37表示Python3.7版本,后面win32和win_amd64表示32位和64位
  • 对应自己的Python版本和位数,选择合适的下载

    在这里插入图片描述

二、正则表达提取消息文本


file = open("**通知群.txt", "r", encoding="utf-8")
one_name = ["***"]
two_name = ["***"]
timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}")

1、设置编码格式,使用 utf-8 编码:

file = open("**通知群.txt", "r", encoding="utf-8")

2、正则表达匹配日期,格式为 年/月/日 或者 年-月-日

  • \d 表示任意一个位的数字(0~9)
  • \d{4} 表示这个数字为 4 个长度,比如 2020
  • \d{1,2} 表示 1~2 个长度,比如 6,06
\d{4}-\d{1,2}-\d{1,2}

三、提取群成员的消息


flag = 0
lines = file.readlines()
one_s = []
two_s = []
for line in lines:
	line = line.replace("[图片]", "")
	line = line.replace("[表情]", "")
	line = line.replace("\n", "")
	if flag == "one":
		one_s.append(line)
		flag = 0
	if flag == "two":
		two_s.append(line)
		flag = 0
	if re.search(timepat, line):
		for w in one_name:
			if w in line:
				flag = "one"
				break
		for w in two_name:
			if w in line:
				flag = "two"
				break
 
print(len(one_s))	# 打印输出one这个成员消息条数
print(len(two_s))	# 打印输出twe这个成员消息条数
print(one_s[0:99])	# 打印输出one这个成员的所有消息

将群成员发的消息保存至列表中,遍历所有消息,符合时间正则的留下,并用 flag 进行标记,从而将特定的群成员消息提取出来。

四、词汇处理


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 two_s:
	thelist = jieba.cut(s, cut_all = False)
	for word in thelist:
		if word not in remove_words:
			if len(word) > 1:
				words.append(word)
 
word_counts = collections.Counter(words)
words_top10 = word_counts.most_common(10)
print(words_top10)      #打印前10词频
  • jieba.cut() 进行分词,如果是常见词 (remove_words) 跳过,如果大于1的话就放入列表
  • collections.Counter(words) 将经过分词过得消息进行词频统计
  • word_counts.most_common(10) 统计前10词频

五、制作词云


## 制作词云
backgroud_Image = plt.imread('面纱.jpg')  #选择背景图片,图片要与.py文件同一目录
print('加载图片成功!')

## 设置词云样式  
wc = WordCloud(  
    background_color='white',   # 设置背景颜色  
    mask=backgroud_Image,       # 设置背景图片  
    font_path='C:\Windows\Fonts\msyhl.ttc', # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字  
    max_words=2000,     # 设置最大现实的字数  
    stopwords=STOPWORDS,        # 设置停用词  
    max_font_size=150,  # 设置字体最大值  
    random_state=30     # 设置有多少种随机生成状态,即有多少种配色方案  
)

wc.generate_from_frequencies(word_counts)  #通过频率生成词云
print('开始加载文本')  

img_colors = ImageColorGenerator(backgroud_Image)       #改变字体颜色  
  
wc.recolor(color_func=img_colors)       #字体颜色为背景图片的颜色
 
plt.imshow(wc)  # 显示词云图
plt.axis('off') # 是否显示x轴、y轴下标  
plt.show()
print('生成词云成功!')

六、效果

在这里插入图片描述

当然这个背景、字体啥的都可以自己设置的。


七、总结

  • 没事做的时候可以统计一下群里龙王发了多少条消息,哈哈哈,再做个词云
  • python拥有强大的库,库与库之间相互配合,相互协作,造就了丰富的可视化图形
  • 在进行代码移植时,可能会出现不兼容现象,不同的开发工具的规则不同,按照规则来问题不会很大

  本次的分享就到这里


11

好书不厌百回读,熟读自知其中意。将学习成为习惯,用知识改变命运,用博客见证成长,用行动证明努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满呦!^ _ ^

**码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了👉关注👈我哦!


如果以上内容有任何错误或者不准确的地方,欢迎在下面👇留个言。或者你有更好的想法,欢迎一起交流学习~~~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。