當 Python 遇到了你的微信好友

這次我們直奔主題,本文要做的是以下幾件事:

分析微信好友的總人數(shù)、男生數(shù)、女生數(shù)、男女比

分析好友的地域分布

利用?自然語言處理?的方法分析出你好友的情感傾向

獲取微信好友的頭像并拼接成指定圖片

準備

還是老樣子,做實驗前,先做好準備工作,實驗環(huán)境如下:

Python 3.6 (虛擬環(huán)境的管理為Pipenv)

Pycharm

主要使用到的包有:

itchat

pyecharts

baidu-aip

photomosaic

pillow

對Pipenv這個虛擬環(huán)境管理工具不熟悉的可以去看我之前的文章:?《Python 管理哪家強?》,里面對于 Pipenv 這個虛擬環(huán)境管理工具有一些介紹。

itchat是一個開源的微信個人號接口,可以讓我們使用python來調用微信

pyecharts是python+echarts的結合,用于進行數(shù)據(jù)的可視化

baidu-aip是百度推出的一個nlp的包

photomosaic是用來生成蒙太奇馬賽克圖片的

大家獲取到源碼之后只需要將?Pipfile?復制到你們的項目根路徑下,然后再終端執(zhí)行 pipenv install 即可創(chuàng)建一個安裝好所有包的虛擬環(huán)境了(前提是你的電腦上已經(jīng)安裝了pipenv了)

做好準備工作后我們就開始吧。


開始

1. 初始化 itchat

只需一行代碼即可初始化 itchat:

itchat.auto_login(hotReload=True)

復制代碼

hotReload(熱加載),True表示其短時間內不需要再次掃碼登陸

2. 獲取好友列表

同樣的也只需要一行代碼即可獲?。?/p>

friends = itchat.get_friends(update=True)[0:]

復制代碼

返回的數(shù)據(jù)是類 JSON 格式的,我們用 Python可以很方便的解析,因為篇幅原因,返回的示例我就不展示了,你們自己輸出查看就可以了。

3. 分析男女分布情況

首先我們需要獲取好友的性別信息,通過分析返回的 JSON 字符串我們發(fā)現(xiàn),在好友的信息中有 Sex 標簽,其規(guī)律是當其值為1是表示男生,2表示女生,0表示沒有填寫的,因而我們可以這樣

# 對好友數(shù)進行分析

def analyze_friends_num(friends):

# 初始化性別的變量(男、女、其他,其他表示的是注冊時沒有填寫性別信息的)

male = female = others = 0

# 循環(huán)得到的全部好友

# 在好友的信息中有Sex標簽,發(fā)現(xiàn)規(guī)律是當其值為1是表示男生,2表示女生,0表示沒有填寫的

for i in friends[1:]:

sex = i['Sex']

if sex == 1:

male += 1

elif sex == 2:

female += 1

else:

others += 1

# 總人數(shù)

total = len(friends[2:])

print("總人數(shù)為", total, "其中男性", male, "人,女性", female, "人,男女比為", round((male / female), 2), ":1")

復制代碼

執(zhí)行的結果為:

總人數(shù)為 387 其中男性 228 人,女性 116 人,男女比為 1.97 :1

復制代碼

更加直觀的顯示如下(可視化的代碼在?utiils?包下,這里就不放出了,有需要的自己看源碼):

我的好友里男女比竟然是 2:1(那些沒填性別信息的人里面不知道還有多少男生),活該沒有女朋友啊,看來下次要多加一些女生的微信了。




小編給大家推薦一個學習氛圍超好的地方,python交流企鵝裙:【611+530+101】適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙里有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程




4. 好友地域分布

這里我們只要獲取到好友的地域信息,然后用兩個?dict?(分別是省和市)保存即可,key 為地域, value 為該地域的好友數(shù),循環(huán)遍歷 friends 最后用餅圖表示分布最多的5個省,用柱狀圖表示分布最多的15個市,代碼如下:

# 分析好友的地域分布

def analyze_friends_location(friends):

province = {}

city = {}

for i in friends[1:]:

if i['Province'] == '':

i['Province'] = '其他'

if i['City'] == '':

i['City'] = '其他'

province[i['Province']] = province.get(i['Province'], 0) + 1

city[i['City']] = city.get(i['City'], 0) + 1

sorted_province = sorted(province.items(), key=lambda item: item[1], reverse=True)

sorted_city = sorted(city.items(), key=lambda item: item[1], reverse=True)

# 畫出分布圖

draw_friends_location(sorted_province[0:5], sorted_city[0:15])

復制代碼

結果如下:

看到這大家應該也能猜到我主要的活動區(qū)域是哪了吧,有興趣的大家可以猜一猜然后在文末留言哦。

5. 好友情感分析

當你想要了解一個人心態(tài)(注意是心態(tài)而不是動態(tài))的時候,你往往都會去看他的簽名而不是朋友圈,因為簽名更改的頻率很低,很大程度上會反映這個人的情緒和心態(tài)。相比之下,朋友圈更新的頻率較高,因為是要分享自己近期的動態(tài)的(我就見過有的女生一條朋友圈分成好幾條發(fā),每次只發(fā)幾個字)。因此對好友的簽名進行分析是可以分析出她的情緒的,那么我們該如何分析情感呢?

這里實名夸獎一下百度,作為國內技術的老大哥,很久之前百度就已經(jīng)?免費開放?了他的一些人工智能接口,其中就有情感傾向分析,官網(wǎng)是?ai.baidu.com/tech/nlp_ap…?,這些?免費的?人工智能接口的開放對于我們這些個人開發(fā)者無疑是個福音。下面是他的功能演示截圖:

他的用法也很簡單,安裝好?baidu-aip?包之后,申請下appkey、appid和secretkey后即可使用:

client = AipNlp(APP_ID, API_KEY, SECRET_KEY)

def analyze_text(text):

res = client.sentimentClassify(text.strip())

return res['items'][0]['sentiment']

復制代碼

因此我們要做的無非就是獲取好友的簽名,然后傳入 analyze_text 函數(shù)即可:

# 分析好友的簽名

def analyze_friends_signature(friends):

positive = 0

negative = 0

others = 0

print('簽名情感分析中,請稍后......')

for index, item in enumerate(friends[1:]):

text = item['Signature']

if text != '':

try:

print('正在分析第', index, '條簽名:', text, '他的作者是:', item['NickName'], '你給他的備注是:', item['RemarkName'])

res = analyze_text(text)

if res == 0:

negative = negative + 1

if res == 1:

others = others + 1

if res == 2:

positive = positive + 1

except:

continue

復制代碼

看到這有人會有疑問了,我的好友人數(shù)有上千,免費的接口能用這么多次嗎?事實上,他真的可以用這么多次:joy:

看到這我突然想給百度打call,這也太良心了吧。請問貴公司還缺實習生嗎,我想去應聘:joy:。然后我們來看看我的好友的情緒分析圖吧。

沒想到我的好友里面竟然還有17.83%的人有消極情緒,看來必要的時候得"we need to talk"了。


小編給大家推薦一個學習氛圍超好的地方,python交流企鵝裙:【611+530+101】適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙里有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程


6. 利用好友的微信頭像生成指定的照片

看標題你們可能不懂是什么意思,直接放圖你們就明白了:

這張圖遠看是一張一個人跳舞的圖片,其實仔細看就知道了,構成這張圖的是我的 300 多張微信好友的圖像,這里我使用到了一個名為 photomosaic 的庫,它是專門用來制作這種蒙太奇馬賽克風格的圖片的,是我無意中在知乎上看到的,所以大家有事沒事還是逛逛知乎,多少能發(fā)現(xiàn)些好玩意。

接下來我們來看看如何生成上述圖片。

第一步,我們先獲取好友的頭像:

# 獲取好友頭像

def get_friends_avatar(friends):

for index, item in enumerate(friends):

print("正在下載第 %d 張頭像" % index)

img = itchat.get_head_img(userName=item["UserName"])

file_image = open(os.getcwd() + "/app/temp/" + item["UserName"] + ".jpg", 'wb')

file_image.write(img)

file_image.close()

復制代碼

也很簡單,直接調用itchat的 get_head_img 方法然后保存到本地指定文件夾下即可。

第二步,利用photomosaic生成目標圖片

# 利用好友頭像生成蒙太奇馬賽克圖片

def draw_friends_mosaic_image():

# 讀取基準圖,即要生成的蒙太奇馬賽克圖片的原始圖

image = pm.imread(os.getcwd() + '/assets/cxk.jpg')

# 定義圖片庫

pool = pm.make_pool(os.getcwd() + '/temp/*.jpg')

# 制作50*50的拼圖馬賽克,(50, 50)是指每一行和每一列使用圖片庫中的圖像的個數(shù)

mosaic = pm.basic_mosaic(image, pool, (50, 50))

# 保存制作好的圖片

pm.imsave(os.getcwd() + '/output/friends_mosaic_image.jpg', mosaic)

復制代碼

四行代碼即可,原理的話知乎上有寫,有興趣的可以自己去搜一搜。

當然了,不是每個人的微信好友都有上千人,所以拼接出來的效果就不是很好,比如我自己的那個就不是很好,既然這樣的話我就推薦另一個拼接頭像的方法,不過效果要稍微差點,拼成的圖長這樣:

這張圖雖然觀賞效果不如上一張,但好在每個頭像都很清楚,大伙兒看看能不能快速找到自己的頭像呢?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容