写点什么

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

作者:AXYZdong
  • 2022 年 7 月 12 日
  • 本文字数:3547 字

    阅读完需:约 12 分钟

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

Author:AXYZdong

自动化专业 工科男

有一点思考,有一点想法,有一点理性!

定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!

更多精彩文章前往:👉 个人主页


▲ 果然 @全体成员 最多


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

一、前期准备

1.提取 QQ 聊天记录

1、QQ 聊天框打开消息管理



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



3、选择保存为 .txt 格式



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



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

2.准备相关的库

pip install xxx 就可以了


import jiebaimport reimport collectionsfrom wordcloud import WordCloud, STOPWORDS, ImageColorGenerator  from PIL import Imageimport 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 = 0lines = 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 进行标记,从而将特定的群成员消息提取出来。<br>

四、词汇处理

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 = 0words = []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 词频<br>

五、制作词云

## 制作词云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('生成词云成功!')
复制代码

六、效果


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

七、完整代码

# =============================================# --*-- coding: utf-8 --*--# @Time    : 2020-06-08# @Author  : AXYZdong# @CSDN    : https://blog.csdn.net/qq_43328313# @FileName: wc.py# @Software: Python3.7# =============================================
import jiebaimport reimport collectionsfrom wordcloud import WordCloud, STOPWORDS, ImageColorGenerator from PIL import Imageimport matplotlib.pyplot as plt
file = open("**通知群.txt", "r", encoding="utf-8")one_name = ["***"]two_name = ["***"]timepat = re.compile(r"\d{4}-\d{1,2}-\d{1,2}") ## 分析群聊天记录,并通过jieba分词flag = 0lines = 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))print(len(two_s))##print(one_s[0:99]) 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 = 0words = []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词频
## 制作词云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 拥有强大的库,库与库之间相互配合,相互协作,造就了丰富的可视化图形

  • 在进行代码移植时,可能会出现不兼容现象,不同的开发工具的规则不同,按照规则来问题不会很大


【参考文献】

[1] https://blog.csdn.net/zhr1030635594/article/details/105348459

[2] https://blog.csdn.net/fly910905/article/details/77763086


本次的分享就到这里


如果我的文章对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!

听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满呦!^ _ ^

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

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


发布于: 刚刚阅读数: 4
用户头像

AXYZdong

关注

没有伞的孩子要学会奔跑! 2020.06.01 加入

自动化专业 工科男 有一点思考,有一点想法,有一点理性。 定个小小目标,努力成为习惯。

评论

发布
暂无评论
Python|分析QQ群聊信息,记录词频并制作词云_Python_AXYZdong_InfoQ写作社区