美文网首页@IT·互联网大数据 爬虫Python AI Sql机器学习与数据挖掘
玩转itchat,实现好友信息可视化、聊天机器人及性别模型构建

玩转itchat,实现好友信息可视化、聊天机器人及性别模型构建

作者: 罗罗攀 | 来源:发表于2018-08-01 10:09 被阅读54次

    前些日子,女朋友拿我手机玩,说我微信好友女生多,当时我就不服了(跪着认错了),然后两人一个个统计性别,我微信好友不算多,但也有300来个,人工统计实在费事,之后事情也就不了了之了(打了我一顿)。
    昨天突然想到itchat库可以获取微信好友信息,所以又拿出来玩了一下,为什么说又了?之前用过itchat制作好友全头像,链接(https://www.jianshu.com/p/684cbdf15874)。所以今天继续使用itchat来玩转好友信息。

    涉及内容

    为了让小白也能自己学会使用,本文涉及的内容包括以下部分:

    • 环境安装
    • 小试牛刀
    • 微信好友统计可视化
    • 微信机器人
    • 性别预测

    环境安装

    本人使用的是anaconda3的Python环境(该环境拥有数据科学的大部分库,例如:numpy,pandas,sklearn),除此之外,需要安装第三方库。itchat用于获取微信好友信息;pyecharts用于绘制统计图,另外绘制地图需要安装地图 js 文件,不然地图无法显示;jieba用于统计词频,用于绘制词云图。通过下面代码一一安装即可:

    pip install itchat
    pip install pyecharts
    pip install echarts-countries-pypkg
    pip install echarts-china-provinces-pypkg
    pip install echarts-china-cities-pypkg
    pip install echarts-china-counties-pypkg
    pip install echarts-china-misc-pypkg
    pip install jieba
    

    小试牛刀

    安装完itchat,就可以通过下面的代码给文件助手发消息了,这里给自己发没意思,决定给女朋友发一个(首先你得有一个女朋友,其次她愿意扫码登陆)。

    import itchat
    
    itchat.auto_login()  ##登陆
    
    itchat.send('美女', toUserName='filehelper')
    itchat.send('早上好', toUserName='filehelper')
    

    微信好友统计可视化

    数据收集

    首先通过itchat获取好友的信息,第一个其实是自己,所以保存数据需要跳过第一个好友。

    friends = itchat.get_friends(update=True)[0:] #获取数据
    print(friends[0])
    

    根据分析情况,获取部分字段数据,并保存在csv文件中。

    import csv
    
    f = open('C:/Users/LP/Desktop/1.csv','w+',encoding='utf-8',newline='')
    writer = csv.writer(f)
    writer.writerow(['NickName','Sex','City','Province','Signature'])
    
    for i in friends[1:]:
        writer.writerow([i['NickName'],i['Sex'],i['City'],i['Province'],i['Signature']])
    
    #pandas读数据
    import pandas as pd
    
    df = pd.read_csv(open('C:/Users/LP/Desktop/1.csv',encoding='utf-8'))
    df.head()
    
    性别分布

    首先对性别进行统计(慌得一匹),并使用pyecharts库进行可视化分析。如图可以看出,男性比例还是更多一些的,外星人是没有设置性别的好友。

    data1 = df.groupby('Sex')['Sex'].count()
    
    from pyecharts import Pie
    
    attr = ['外星人','男性', '女性']
    v1 = list(data1)
    pie = Pie('微信好友性别分布')
    pie.add("", attr, v1, is_label_show=True)
    pie
    
    地区分布

    地区字段有缺失值,我们通过布尔选择过滤到缺失值后,通过groupby统计个数,利用pyecharts库进行可视化。
    由于本人是湖南人,并且求学一直都没有离开过湖南,所以湖南的人数最多,其他省份的人数都是较少的。

    new_df2 = df[df['Province'].notnull()]
    
    data = new_df2.groupby('Province')['Province'].count()
    # 绘图
    from pyecharts import Map
    
    label = list(data.index)
    value = list(data)
    map = Map('微信好友地区分布情况', width=1200, height=600)
    map.add("", label, value, maptype='china', is_visualmap=True,
            visual_text_color='#000')
    map
    
    词云图

    最后,通过jieba分词,计算词频,绘制好友个性签名的词云图。曾经我们90后的杀马特QQ昵称、个性签名,大家是否还记得?情殇、浅唱、爱你就是一辈子....还记得我最早的QQ昵称是泷太子...
    这里可以看到本人微信好友英语不错的样子,各种英语秀的我头皮发麻,他们时而愤青(个性、随意),不远随波逐流;
    时而低落(浅醉、唯心),为生活颠簸;
    最后不得而变得中庸(平凡,留不住)。

    str_data = ''
    for i in range(new_df.shape[0]):
        str_data = str_data + new_df.iloc[i,4]
    
    # 正则去掉部分非法字符
    import re
    str_data = re.sub('span', '',str_data,re.S)
    str_data = re.sub('class', '',str_data,re.S)
    str_data = re.sub('emoji', '',str_data,re.S)
    
    # jieba分词统计
    import jieba.analyse
    tags = jieba.analyse.extract_tags(str_data, topK=50, withWeight=True)
    label = []
    attr = []
    for item in tags:
        label.append(item[0])
        attr.append(int(item[1]*1000))
    
    # 绘图
    from pyecharts import WordCloud
    
    wordcloud = WordCloud(width=800, height=620)
    wordcloud.add("", label[3:], attr[3:], word_size_range=[20, 100])
    wordcloud
    

    微信机器人

    首先,我们需要去图灵机器人网站(http://www.tuling123.com/)注册机器人账号,获取apikey,使用自己的apikey即可运行代码,完成微信机器人的工作。

    import requests
    import itchat
    
    KEY = '这里为申请的apikey'
    
    def get_response(msg):
        apiUrl = 'http://www.tuling123.com/openapi/api'
        data = {
            'key'    : KEY,
            'info'   : msg,
            'userid' : 'wechat-robot',
        }
        try:
            r = requests.post(apiUrl, data=data).json()
            return r.get('text')
        except:
            return
    
    @itchat.msg_register(itchat.content.TEXT)
    def tuling_reply(msg):
        defaultReply = 'I received: ' + msg['Text']
        reply = get_response(msg['Text'])
        return reply or defaultReply
    
    itchat.auto_login(hotReload=True)
    itchat.run()
    

    性别预测

    最后,我们尝试使用用户昵称来构造分类模型,预测昵称的用户性别。

    数据整理

    首先导入需要的库,接着合并数据(这里有8份好友数据),然后筛选出用户性别为男和女的用户。

    import pandas as pd
    import os
    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import cross_val_score
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.naive_bayes import MultinomialNB
    
    list_all = os.listdir('C:/Users/LP/Desktop/info_friend')
    all_list = []
    for i in list_all:
        path = 'C:/Users/LP/Desktop/info_friend/' + i
        df = pd.read_csv(open(path,encoding='utf-8'))
        all_list.append(df)
    all_data = pd.concat([all_list[0],all_list[1],all_list[2],all_list[3],all_list[4],all_list[5],all_list[6],all_list[7]])
    
    df = all_data[(all_data['Sex'] == 1) | (all_data['Sex'] == 2)]
    
    数据预处理

    这里划分数据集,并通过CountVectorizer将数据转换为词向量。

    X_train, X_test, Y_train, Y_test = train_test_split(df['NickName'], df['Sex'], test_size=0.2, random_state=22)
    
    from sklearn.feature_extraction.text import CountVectorizer
    count_vect = CountVectorizer()
    X_train_cov = count_vect.fit_transform(X_train)
    
    模型训练及评价

    用最简单的朴素贝叶斯来进行建模,并进行模型评价。通过结果看出,数据在训练样本精度很高,而在测试样本严重欠拟合。

    clf = MultinomialNB(alpha=0.0001)
    clf.fit(X_train_cov, Y_train)
    
    clf.score(X_train_cov, Y_train)
    
    X_test_cov = count_vect.transform(X_test)
    clf.score(X_test_cov, Y_test)
    
    test = ['陈傻逼','罗罗攀','ace','我是小仙女']
    X = count_vect.transform(test)
    clf.predict(X)
    
    不足与讨论

    由于时间精力不足,模型预测结果有待优化,读者可尝试以下方法进行优化:

    • 扩大数据集
    • 文本处理
    • 算法选择
    • 模型的优化

    相关文章

      网友评论

        本文标题:玩转itchat,实现好友信息可视化、聊天机器人及性别模型构建

        本文链接:https://www.haomeiwen.com/subject/jgclvftx.html