前言
由于某次在某個微信群里跟大家聊到,感覺這幾年這個群的聊天話題變化真的很明顯,再加上自己微信記錄幾乎都沒刪掉的時候(對,po主本質(zhì)上是個倉鼠,信息都是無價的),就提到了可以拿出來做一下分析,然后就產(chǎn)生了這篇文章/教程。
btw 大家也請不要拿這個去做壞事情,并且這里也事先聲明,很多微信中涉及的ID什么的大家盡可能不要透露給陌生人,雖然微信沒有給出更多的API,但I(xiàn)D本身畢竟還是比名字還可靠地。
這篇文章只是給大家一點小的嘗試,通過學(xué)習(xí)這篇文章的話,大家應(yīng)該可以學(xué)會如何拿到微信記錄,并且大概了解了微信記錄是怎么儲存的,并且了解時間戳與如何對時間序列的數(shù)據(jù)進(jìn)行resample,從而獲得不同時間間隔的數(shù)據(jù)。并分時間段的去生成詞云。 大概像這樣,因為微信記錄太多個人信息了,我就放了個高糊的圖了

然后文本分析絕對不僅僅這么點東西,大家可以繼續(xù)挖掘,甚至可以做主題分析,或者進(jìn)行詞語偏好的分析,甚至可以作為定制化的聊天機器人的訓(xùn)練材料,反正只有想不到,沒有做不到啦(:з」∠),歡迎大家多玩蛇共同學(xué)習(xí)python。
大綱
正如把大象放進(jìn)冰箱只需要三步一樣,那么利用微信聊天記錄也只有三步
- 導(dǎo)出聊天記錄
- IOS系統(tǒng)
- 解析導(dǎo)出文件
- python
- 畫圖
-
plotly + amueller/word_cloud
(python module)
-
plotly + amueller/word_cloud
正文
那么利用微信記錄的話,我們肯定就很難在手機/平板上進(jìn)行操作,畢竟又要越獄或者安裝語言,就很麻煩,而且手機上的目錄結(jié)構(gòu)也比較復(fù)雜,這一點我們直接略過。。。所以我選擇了從手機上把聊天記錄導(dǎo)出到電腦上,來進(jìn)行操作。
導(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ù)雜的解密操作,而且首先也必須需要進(jìn)行ROOT,再加上po主也沒有安卓手機,這里就放一些網(wǎng)上的教程好了。
最后終于終于進(jìn)入這個部分的正題。
簡單地說
通過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進(jìn)行執(zhí)行,并且載入了所有的消息數(shù)據(jù)到data中
進(jìn)行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,'碎碎念達(dá)人')
# 碎碎念達(dá)人 是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

