微信群画像,利用词云图分析微信群热点

    微信上有很多个群,不少群都是做了免打扰设置,但有的时候又想知道群里在讨论什么热点问题。利用词云图分析是一个了解某个微信群热点的方法。
    本文通过itchat 采集微信群聊记录,用jieba做分词,用wordcloud生成词云图,主界面用wxPython完成。分析结果如下图:

对隐私内容马赛克处理了。

微信群画像,利用词云图分析微信群热点_第1张图片

微信群画像,利用词云图分析微信群热点_第2张图片

 

一、准备工作

首选,先要确定你的微信能登录微信网页版。只有能成功登录微信网页版,才能用 itchat 去分析群信息。
如果不能登录,只能借用其他的微信号进行研究了。


接下来配置好开发环境,安装相关库。

Python 3.7.3

itchat            1.3.10
jieba             0.42.1
Pypubsub          4.0.3
wordcloud         1.6.0
wxPython          4.0.6


二、过程:


1、创建数据表 

import SqliteLib as sl

db = sl.WorkDb('db.db')
# 建立数据表 微信群表
sql_str = '''
create table wxq(id integer primary key autoincrement
                , wxq_name string unique
                , wxq_uid  string
                , wxq_time string
              )
'''
db.run_sql(sql_str)

# 建立数据表 微信群聊信息表
sql_str = '''
create table wxq_msg(id integer primary key autoincrement
                , wxq_id string
                , wxq_name string
                , wxq_member string
                , wxq_time string
                , wxq_msg  string
              )
'''
db.run_sql(sql_str)

2、主页面

主界面就一个文本框。

 

微信群画像,利用词云图分析微信群热点_第3张图片

3、数据显示

用以前开发过的数据显示模块显示。

    def OnWxgM(self,event):
        fld = 'wxq_name,wxq_time'
        fld_head = '群名|最后活跃时间'
        table_name = 'wxq'
        wb_tbl = {'name': table_name, 'fld': fld, 'key': " ", 'order': 'order by id desc'}
        wb_tbl['value'] = ()
        wb_tbl['fld_head'] = fld_head
        wb_tbl['srch_fld'] = 'wxq_name'
        wb_tbl['Title'] = '微信群列表'
        wb_tbl['info'] = '点击鼠标右键查看群画像'
        wb_tbl['col_len'] = [300, 200]
        wb_tbl['scr_size'] = [800, 400]
        wb_tbl['work_id'] = 'set_wx_group'
        frame = DSFrame(wb_tbl)
        frame.Show()

微信群画像,利用词云图分析微信群热点_第4张图片

4、微信信息处理

 

    def Listen_Wx(self):
        # 监控微信群信息
        @itchat.msg_register(TEXT, isGroupChat=True)  # 这里的TEXT表示如果有人发送文本消息,那么就会调用下面的方法
        def simple_reply(msg):
            message = ''
            msg_group = ''
            msg_member = '本机登录用户'
            try:
                try:
                    group = itchat.get_chatrooms(update=True)
                    wx_group = {}
                    for g in group:
                        m_dict = {}
                        for menb in g['MemberList']:
                            m_dict[menb['UserName']] = menb['NickName']
                        wx_group[g['UserName']] = {'name': g['NickName'], 'member': m_dict}
                    msg_group = wx_group[msg['FromUserName']]['name']
                    if msg['ActualNickName'] == wx_group[msg['FromUserName']]['member'][msg['ActualUserName']]:
                        msg_member = msg['ActualNickName']
                    else:
                        msg_member = "{}[{}]".format(msg['ActualNickName'],wx_group[msg['FromUserName']]['member'][msg['ActualUserName']])
                except Exception as e:
                    self.debug_log(repr(e))
                try:
                    if msg_group == '':
                        msg_group = msg['User']['NickName']
                except Exception as e:
                    self.debug_log(repr(e))

                t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(msg['CreateTime'])))
                message = msg['Content']
                # pub.sendMessage("update", mstatus=message)
                m_show = "{}\n{} {} \n{}".format(t_now, msg_group, msg_member, message )
                # 更新群活跃时间
                self.ldb.save_wxg_info((msg_group, t_now))
                #'保存微信信息'
                wx_msg = (msg_group, msg_member, t_now, message)
                wx_msg_id = self.ldb.insert_wx_msg(wx_msg)
                pub.sendMessage("update", mstatus=m_show)

            except Exception as e:
                f_e = open('error.log', 'a', encoding='utf-8')
                t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(time.time())))
                f_e.write("\n{}\n{}".format(t_now, repr(e)))
                f_e.close()

        itchat.auto_login(hotReload=True)
        auth_flag = 'ok'
        if auth_flag == 'ok':
            t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(time.time())))
            itchat.send('登录{}'.format(t_now), toUserName='filehelper')
            pub.sendMessage("update", mstatus='loginok')
            itchat.run()
        else:
            itchat.logout()

 

5、词云显示

词云部分参考了 HateMath归来 的博文 https://www.cnblogs.com/hatemath/p/10238145.html

# 去掉符号
    resultword=re.sub("[\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%]", "",word)
    wordlist_after_jieba = jieba.cut(resultword)
    wl_space_split = " ".join(wordlist_after_jieba)

    # 设置停用词
    sw = set(STOPWORDS)
    sw.add("通知")

    # 建立词云图
    my_wordcloud = WordCloud(scale=4,font_path=font,stopwords=sw,background_color='white',
                             max_words = 100,max_font_size = 60,random_state=20).generate(wl_space_split)

    #显示生成的词云
    fig = plt.figure(figsize=(8, 5))
    fig.canvas.set_window_title(wxg)
    plt.imshow(my_wordcloud)
    plt.axis("off")
    plt.show()

 

三、使用

启动后,登录微信,需要用手机端微信扫描弹出的二维码,登录后,自动记录群聊消息。可以通过菜单查看,搜索群聊记录。

在群列表中,点击鼠标右键,可以生成词云。

 

四、后记

目前的代码,是分析群所有聊天记录。后续开发可以考虑增加以下功能:

1、增加剔除关键字维护, 比如群主的名字 :)。

2、增加分析时间段。

3、清除数据

4、增加重要消息关键字维护,有匹配上的关键字信息,转发到手机微信的 文件传输助手。

有其他的需求或者建议欢迎和我联络。

微信群画像,利用词云图分析微信群热点_第5张图片

 

 

你可能感兴趣的:(Python)