玩轉itchat,實現好友信息可視化、聊天機器人及性別模型構建

前些日子,女友拿我手機玩,說我微信好友女生多,當時我就不服了(跪着認錯了),而後兩人一個個統計性別,我微信好友不算多,但也有300來個,人工統計實在費事,以後事情也就不了了之了(打了我一頓)。 昨天忽然想到itchat庫能夠獲取微信好友信息,因此又拿出來玩了一下,爲何說又了?以前用過itchat製做好友全頭像,連接(https://www.jianshu.com/p/684cbdf15874)。因此今天繼續使用itchat來玩轉好友信息。算法

涉及內容

爲了讓小白也能本身學會使用,本文涉及的內容包括如下部分:json

  • 環境安裝api

  • 小試牛刀微信

  • 微信好友統計可視化app

  • 微信機器人echarts

  • 性別預測dom

環境安裝

本人使用的是anaconda3的Python環境(該環境擁有數據科學的大部分庫,例如:numpy,pandas,sklearn),除此以外,須要安裝第三方庫。itchat用於獲取微信好友信息;pyecharts用於繪製統計圖,另外繪製地圖須要安裝地圖 js 文件,否則地圖沒法顯示;jieba用於統計詞頻,用於繪製詞雲圖。經過下面代碼一一安裝便可:post

  
  
  
   
   
            
   
   
  1. 測試

  2. 大數據

pip install itchatpip install pyechartspip install echarts-countries-pypkgpip install echarts-china-provinces-pypkgpip install echarts-china-cities-pypkgpip install echarts-china-counties-pypkgpip install echarts-china-misc-pypkgpip install jieba

小試牛刀

安裝完itchat,就能夠經過下面的代碼給文件助手發消息了,這裏給本身發沒意思,決定給女友發一個(首先你得有一個女友,其次她願意掃碼登錄)。

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

微信好友統計可視化

數據收集

首先經過itchat獲取好友的信息,第一個實際上是本身,因此保存數據須要跳過第一個好友。

  
  
  
   
   
            
   
   
friends = itchat.get_friends(update=True)[0:] #獲取數據print(friends[0])

根據分析狀況,獲取部分字段數據,並保存在csv文件中。

  
  
  
   
   
            
   
   
import csvf = 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 pddf = 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 Pieattr = ['外星人','男性', '女性']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 Maplabel = 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 restr_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.analysetags = 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 WordCloudwordcloud = WordCloud(width=800, height=620)wordcloud.add("", label[3:], attr[3:], word_size_range=[20, 100])wordcloud

微信機器人

首先,咱們須要去圖靈機器人網站(http://www.tuling123.com/)註冊機器人帳號,獲取apikey,使用本身的apikey便可運行代碼,完成微信機器人的工做。

  
  
  
   
   
            
   
   
import requestsimport itchatKEY = '這裏爲申請的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 defaultReplyitchat.auto_login(hotReload=True)itchat.run()

性別預測

最後,咱們嘗試使用用戶暱稱來構造分類模型,預測暱稱的用戶性別。

數據整理

首先導入須要的庫,接着合併數據(這裏有8份好友數據),而後篩選出用戶性別爲男和女的用戶。

  
  
  
   
   
            
   
   
import pandas as pdimport osfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBlist_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 CountVectorizercount_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)

不足與討論

因爲時間精力不足,模型預測結果有待優化,讀者可嘗試如下方法進行優化:

  • 擴大數據集

  • 文本處理

  • 算法選擇

  • 模型的優化


本文分享自微信公衆號 - 羅羅攀(luoluopan1)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索