前言
由于某次在某個微信群里跟大家聊到,感覺這幾年這個群的聊天話題變化真的很明顯福侈,再加上自己微信記錄幾乎都沒刪掉的時候(對酒来,po主本質(zhì)上是個倉鼠,信息都是無價的)肪凛,就提到了可以拿出來做一下分析堰汉,然后就產(chǎn)生了這篇文章/教程辽社。
btw 大家也請不要拿這個去做壞事情,并且這里也事先聲明翘鸭,很多微信中涉及的ID什么的大家盡可能不要透露給陌生人滴铅,雖然微信沒有給出更多的API,但ID本身畢竟還是比名字還可靠地就乓。
這篇文章只是給大家一點小的嘗試汉匙,通過學(xué)習(xí)這篇文章的話,大家應(yīng)該可以學(xué)會如何拿到微信記錄生蚁,并且大概了解了微信記錄是怎么儲存的噩翠,并且了解時間戳與如何對時間序列的數(shù)據(jù)進行resample
,從而獲得不同時間間隔的數(shù)據(jù)邦投。并分時間段的去生成詞云伤锚。 大概像這樣,因為微信記錄太多個人信息了志衣,我就放了個高糊的圖了
然后文本分析絕對不僅僅這么點東西屯援,大家可以繼續(xù)挖掘,甚至可以做主題分析蠢涝,或者進行詞語偏好的分析玄呛,甚至可以作為定制化的聊天機器人的訓(xùn)練材料,反正只有想不到和二,沒有做不到啦(:з」∠),歡迎大家多玩蛇共同學(xué)習(xí)python耳胎。
大綱
正如把大象放進冰箱只需要三步一樣惯吕,那么利用微信聊天記錄也只有三步
- 導(dǎo)出聊天記錄
- IOS系統(tǒng)
- 解析導(dǎo)出文件
- python
- 畫圖
-
plotly + amueller/word_cloud
(python module)
-
plotly + amueller/word_cloud
正文
那么利用微信記錄的話,我們肯定就很難在手機/平板上進行操作怕午,畢竟又要越獄或者安裝語言废登,就很麻煩,而且手機上的目錄結(jié)構(gòu)也比較復(fù)雜郁惜,這一點我們直接略過堡距。。兆蕉。所以我選擇了從手機上把聊天記錄導(dǎo)出到電腦上羽戒,來進行操作。
導(dǎo)出記錄
關(guān)于導(dǎo)出聊天記錄的方法其實有很多虎韵。易稠。。(大家請小心使用包蓝,避免造成數(shù)據(jù)丟失以及下了流氓軟件)
但是真正能夠用來做文本分析的卻并不多驶社。企量。
為什么呢?亡电?
就說微信官方的備份與恢復(fù)
其實最后導(dǎo)出的結(jié)果届巩,是一個加密后的數(shù)據(jù)庫文件,所以單單憑借這個導(dǎo)出的備份份乒,我們幾乎無法做文本分析姆泻。
而關(guān)于使用安卓系統(tǒng)的,網(wǎng)上也很多冒嫡,但是似乎大多也是要經(jīng)過復(fù)雜的解密操作拇勃,而且首先也必須需要進行ROOT,再加上po主也沒有安卓手機孝凌,這里就放一些網(wǎng)上的教程好了方咆。
最后終于終于進入這個部分的正題。
簡單地說
通過itunes的IOS備份蟀架,再加上一個軟件wx backup瓣赂,就可以實現(xiàn)導(dǎo)出微信聊天記錄并在電腦上閱讀/分析的目的
復(fù)雜的操作大家可以詳見這個鏈接,btw現(xiàn)在是win+mac系統(tǒng)都可用這軟件的
最后導(dǎo)出來的文件大概長這樣片拍。煌集。。
大家直接打開
index.html
就可以看到導(dǎo)出的聊天記錄捌省,其中也可以看到曾經(jīng)分享過的照片苫纤、視頻。(音頻似乎沒有成功導(dǎo)出來)
而我們要使用的則是
js/message.js
其中也分享一個小技巧纲缓,因為現(xiàn)在大家的手機都普遍容量巨大卷拘,而大家的電腦可能都是些固態(tài)硬盤256G的,所以對于這種無差別IOS備份的操作祝高,很有可能會使電腦容量不足栗弟!尤其是itunes這種無法選擇備份目錄,只能備份到C盤的“流氓”軟件工闺。 反正我手機備份下來有60G+
Win7下更改iTunes備份路徑最便捷的方法(收藏一下總沒錯)
這個親測win10 + win8也都可以啦乍赫,簡單地說
通過軟鏈接 (快捷方式)的方式,將原本itunes默認(rèn)使用的備份地址陆蟆,鏈接到一個更大空間的可以自定義的地方(例如移動硬盤之類的)
解析導(dǎo)出的聊天記錄
由于這里要使用python的代碼去解析雷厂,所以要求使用的人有一點python的編程能力,當(dāng)然抄源代碼也是沒問題的遍搞,就是得知道怎么在自己電腦上安裝anaconda
, ipython
之類的軟件了罗侯。甚至還得知道怎么安裝github
上的倉庫
簡單說一下以上步驟好了
- 下載合適自己電腦系統(tǒng)的anaconda
- 按圖索驥的安裝程序
使用這個app,輸入pip install jieba pandas numpy tqdm
(后續(xù)要使用的軟件)- 還是使用上面提到的app溪猿,輸入
jupyter lab
- 然后就可以開始愉快的代碼之旅了钩杰。纫塌。
只要五步就可以學(xué)會使用python,買不了吃虧買不了上當(dāng)了
message_odir = "D:\\Desktop\\微信導(dǎo)出\\群名+id" # 看導(dǎo)出的文件夾名字
message_path = message_odir + "\\js\\message.js"
data = {}
message = open(message_path,'r',encoding='utf-8').read()
exec(message.replace('var ',''))
由于在js\message.js
中讲弄,僅僅聲明一個變量data
措左,而且這個data中含有類似于python的dict
的數(shù)據(jù)結(jié)構(gòu),所以我直接使用exec進行執(zhí)行避除,并且載入了所有的消息數(shù)據(jù)到data
中
進行ID到名字的轉(zhuǎn)化怎披,畢竟大家都看不懂一個ID,還是看名字比較熟悉一點
# chartroom ID
gID = data["owner"]['user']
gname = data["owner"]['name']
# For chatroom
# get all user ID and its name
members = data["member"]
mid2username = {mid: members[mid]['name'] for mid in members}
mid2username.pop(gID)
大家可以通過自己的方式瓶摆,觀察這個data
中的結(jié)構(gòu)凉逛,但以下是一個將這個數(shù)據(jù)轉(zhuǎn)化為一個方便后續(xù)使用的DataFrame
的方法,因為后面會涉及到時間的分塊群井,所以我還是將其轉(zhuǎn)為數(shù)據(jù)框來后續(xù)使用
all_messages_df = pd.DataFrame.from_records(data['message'])
all_messages_df.loc[:,'fromWho'] = [mid2username.get(record,'碎碎念達人')
# 碎碎念達人 是po主的用戶名
for record in all_messages_df.loc[:,"m_nsRealChatUsr"]]
all_messages_df.loc[:,'datetime'] = [get_time(record)
for record in all_messages_df.loc[:,"m_uiCreateTime"]]
all_messages_df= all_messages_df.loc[:,["fromWho","datetime","m_nsContent"]]
all_messages_df = all_messages_df.set_index("datetime")
上面是基本的數(shù)據(jù)處理過程状飞,這里再講一下大家所重點想看的一點。
文本分析在獲取數(shù)據(jù)并清洗數(shù)據(jù)之后书斜,當(dāng)然要開始做分詞處理(不是必需的一步诬辈,但是是重要的一步)
這里使用“結(jié)巴”中文分詞:做最好的 Python 中文分詞組件
作為分詞的工具包,使用起來也十分方便荐吉,如果實在上述的pd.DataFrame
的情況下的話焙糟,再結(jié)合amueller/word_cloud,只需要以下的一丟丟的代碼样屠。
total_seg_word = jieba.lcut(' '.join(all_messages_df.loc[:,'m_nsContent']))
filtered_seg_word = remove_word(total_seg_word) # 非必需的一步穿撮,需要自己定義停用詞
import wordcloud
txt = ' '.join(filtered_seg_word)
w = wordcloud.WordCloud(font_path = 'msyh.ttc' ,
width = 2000,
height = 1400,
background_color = 'white',
collocations=False,
colormap ='cividis',
max_words =500) #使用微軟雅黑字體
w.generate(txt)
w.to_file(message_odir + '\\total.png')
就可以畫出一個詞云圖片來。
形如
關(guān)于停用詞
由于日常交流的語言中存在大量的無意義瞧哟、語氣混巧、語法助詞,所以需要一個詞匯表去記錄這些詞勤揩,這個詞匯表我們可以稱之為停用詞表,如果不去除的話秘蛔,最后生成的詞云中會存在大量的陨亡。。深员。负蠕。就像下面這個一樣
關(guān)于畫圖和代碼
代碼部分我覺得還是jupyter notebook
展示會好一點,所以把整個完整的流程包括停用詞表都放到github上了倦畅。
以下是到那個notebook的鏈接(部分結(jié)果我去掉了output遮糖,避免出現(xiàn)個人信息之類的(:з」∠),有意見我也沒辦法)
note book demo
wechat dig