前些日子,女友拿我手機玩,說我微信好友女生多,當時我就不服了(跪着認錯了),而後兩人一個個統計性別,我微信好友不算多,但也有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
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。