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

前些日子,女朋友拿我手机玩,说我微信好友女生多,当时我就不服了(跪着认错了),然后两人一个个统计性别,我微信好友不算多,但也有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)
不足与讨论

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

  • 扩大数据集
  • 文本处理
  • 算法选择
  • 模型的优化
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容