臨近畢業,慢慢的也感傷起來,回想大學這幾年,除了技術的成長,最值得慶幸的就是結交了一幫志同道合的好友。後期本身作了公衆號,微信好友的數量也愈來愈多,身邊人所扮演的角色也愈來愈豐富,有早已結婚生子爲人父母的同窗,有沉迷科研學術的教師,固然也少不了一衆還在996的程序猿。事實上,你所處圈子的質量很大程度上就決定了你的人生質量,那麼今天咱們就來看看當 Python 遇到了你的微信好友後能擦出怎樣的火花。python
完整代碼可在公衆號:「01二進制」後臺回覆:「微信好友」獲取bash
此次咱們直奔主題,本文要作的是如下幾件事:微信
仍是老樣子,作實驗前,先作好準備工做,實驗環境以下:app
Python 3.6 (虛擬環境的管理爲Pipenv)echarts
Pycharm函數
主要使用到的包有:工具
對Pipenv這個虛擬環境管理工具不熟悉的能夠去看我以前的文章:《Python 管理哪家強?》,裏面對於 Pipenv 這個虛擬環境管理工具備一些介紹。優化
itchat是一個開源的微信我的號接口,可讓咱們使用python來調用微信人工智能
pyecharts是python+echarts的結合,用於進行數據的可視化spa
baidu-aip是百度推出的一個nlp的包
photomosaic是用來生成蒙太奇馬賽克圖片的
你們獲取到源碼以後只須要將 Pipfile 複製到大家的項目根路徑下,而後再終端執行 pipenv install
便可建立一個安裝好全部包的虛擬環境了(前提是你的電腦上已經安裝了pipenv了)
作好準備工做後咱們就開始吧。
只需一行代碼便可初始化 itchat:
itchat.auto_login(hotReload=True)
複製代碼
hotReload(熱加載),True表示其短期內不須要再次掃碼登錄
一樣的也只須要一行代碼便可獲取:
friends = itchat.get_friends(update=True)[0:]
複製代碼
返回的數據是類 JSON 格式的,咱們用 Python能夠很方便的解析,由於篇幅緣由,返回的示例我就不展現了,大家本身輸出查看就能夠了。
首先咱們須要獲取好友的性別信息,經過分析返回的 JSON 字符串咱們發現,在好友的信息中有 Sex 標籤,其規律是當其值爲1是表示男生,2表示女生,0表示沒有填寫的,於是咱們能夠這樣
# 對好友數進行分析
def analyze_friends_num(friends):
# 初始化性別的變量(男、女、其餘,其餘表示的是註冊時沒有填寫性別信息的)
male = female = others = 0
# 循環獲得的所有好友
# 在好友的信息中有Sex標籤,發現規律是當其值爲1是表示男生,2表示女生,0表示沒有填寫的
for i in friends[1:]:
sex = i['Sex']
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
others += 1
# 總人數
total = len(friends[2:])
print("總人數爲", total, "其中男性", male, "人,女性", female, "人,男女比爲", round((male / female), 2), ":1")
複製代碼
執行的結果爲:
總人數爲 387 其中男性 228 人,女性 116 人,男女比爲 1.97 :1
複製代碼
更加直觀的顯示以下(可視化的代碼在 utiils 包下,這裏就不放出了,有須要的本身看源碼):
個人好友裏男女比居然是 2:1(那些沒填性別信息的人裏面不知道還有多少男生),活該沒有女友啊,看來下次要多加一些女生的微信了。
這裏咱們只要獲取到好友的地域信息,而後用兩個 dict (分別是省和市)保存便可,key 爲地域, value 爲該地域的好友數,循環遍歷 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])
複製代碼
結果以下:
看到這你們應該也能猜到我主要的活動區域是哪了吧,有興趣的你們能夠猜一猜而後在文末留言哦。
當你想要了解一我的心態(注意是心態而不是動態)的時候,你每每都會去看他的簽名而不是朋友圈,由於簽名更改的頻率很低,很大程度上會反映這我的的情緒和心態。相比之下,朋友圈更新的頻率較高,由於是要分享本身近期的動態的(我就見過有的女生一條朋友圈分紅好幾條發,每次只發幾個字)。所以對好友的簽名進行分析是能夠分析出她的情緒的,那麼咱們該如何分析情感呢?
這裏實名誇獎一下百度,做爲國內技術的老大哥,好久以前百度就已經免費開放了他的一些人工智能接口,其中就有情感傾向分析,官網是ai.baidu.com/tech/nlp_ap…,這些免費的人工智能接口的開放對於咱們這些我的開發者無疑是個福音。下面是他的功能演示截圖:
他的用法也很簡單,安裝好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
函數便可:
# 分析好友的簽名
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
複製代碼
看到這有人會有疑問了,個人好友人數有上千,免費的接口能用這麼屢次嗎?事實上,他真的能夠用這麼屢次😂
看到這我忽然想給百度打call,這也太良心了吧。請問貴公司還缺實習生嗎,我想去應聘😂。而後咱們來看看個人好友的情緒分析圖吧。
沒想到個人好友裏面居然還有17.83%的人有消極情緒,看來必要的時候得"we need to talk"了。
看標題大家可能不懂是什麼意思,直接放圖大家就明白了:
這張圖遠看是一張一我的跳舞的圖片,其實仔細看就知道了,構成這張圖的是個人 300 多張微信好友的圖像,這裏我使用到了一個名爲photomosaic
的庫,它是專門用來製做這種蒙太奇馬賽克風格的圖片的,是我無心中在知乎上看到的,因此你們有事沒事仍是逛逛知乎,多少能發現些好玩意。
接下來咱們來看看如何生成上述圖片。
第一步,咱們先獲取好友的頭像:
# 獲取好友頭像
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)是指每一行和每一列使用圖片庫中的圖像的個數
mosaic = pm.basic_mosaic(image, pool, (50, 50))
# 保存製做好的圖片
pm.imsave(os.getcwd() + '/output/friends_mosaic_image.jpg', mosaic)
複製代碼
四行代碼便可,原理的話知乎上有寫,有興趣的能夠本身去搜一搜。
固然了,不是每一個人的微信好友都有上千人,因此拼接出來的效果就不是很好,好比我本身的那個就不是很好,既然這樣的話我就推薦另外一個拼接頭像的方法,不過效果要稍微差點,拼成的圖長這樣:
這裏的代碼來自我關注的一個公衆號,就不放出代碼了,大夥感興趣的能夠去看下他的文章:《一鍵拼出你的微信好友圖片牆》
這張圖雖然觀賞效果不如上一張,但好在每一個頭像都很清楚,大夥兒看看能不能快速找到本身的頭像呢?歡迎在留言區評論互動哦~
完整代碼可在公衆號:「01二進制」後臺回覆:「微信好友」獲取
方法教給你們了,圖片素材能夠優化,你們能夠生成本身喜歡的蒙太奇圖片,發到朋友圈,讓代碼騷動起來吧!
寫到這,我想說的是,你朋友的質量決定你生命的質量,想成爲一個高層次的人,那就請跟優秀的朋友爲舞👇