能做什麼
用於對微信聊天記錄進行視覺化。
下面這些圖片都可以自動產生:
不能做什麼
使用留痕這款軟體,Github已經22.8 k star了,軟體也已經迭代到了1.1.1版本,是很成熟的軟體了,值得信賴。
GitHub地址:LC044/WeChatMsg: 提取微信聊天記錄,將其匯出為HTML、Word、CSV文件永久保存,對聊天記錄進行分析產生年度聊天報告(github.com)
軟體網站:https://memotrace.lc044.love/
下載exe 然後安裝就行了。
相信大部分人的聊天記錄都在手機裡面,電腦的聊天記錄不全。所以先把手機的聊天記錄同步到電腦上,這個大家在換手機的時候可能有過體驗:微信- 設定- 聊天- 聊天記錄遷移與備份- 遷移。等個幾分鐘吧,等待時間取決於您的聊天記錄量有多大。
解密2:輸入個人訊息,取得資訊。然後解密:開始啟動!
然後就可以在好友中匯出聊天記錄了。為了減少亂碼,請勿勾選圖片、影片、表情包,匯出的不含圖片/影片/檔案!
匯出完畢,退出留痕。在軟體同一目錄下會出現一個data目錄,點進去, data/聊天记录/
下面會有個csv 檔案。大概長這個樣子:
把這個csv檔拷貝到WechatVisualization 的input_data/
目錄裡面。
注意:使用留痕的時候您可能會發現它也整合了導出年度報告這種分析+可視化的功能,但仔細看看它製作的年度報告就會發現太粗糙了,詞雲圖的詞語亂七八糟,沒有做資料清洗,這也是我為什麼要自己動手開發的原因。不過,如果您覺得留痕製作的報告已經很好了,那我下面的內容您也不用看了。
使用者需要具備基本的Python 知識(如何運行程式碼),電腦上已經安裝了Anaconda 或Python(版本>=3.7)。如果用Anaconda,最好新建一個環境。
依序安裝必要的第三方函式庫:
第三方函式庫 | 功能 |
---|---|
pandas | 表格處理 |
matplotlib | 繪圖長條圖 |
pyyaml | 讀取設定檔 |
jieba | 中文分詞 |
tqdm | 列印進度條 |
pyecharts | 繪製詞雲 |
一鍵安裝方法:
pip install -r requirements.txt
安裝方法不是本篇重點,基本上都是pip install
,如果遇到問題請自行上網搜尋解決方法,在此不贅。
設定檔為config.yml
,用記事本就可以開啟了,當然用程式碼編輯器比較好,因為可以語法高亮。
裡面可以自行設定的內容有
# 输入数据
# 下面这些文件都放在input_data目录下
# 聊天记录
msg_file : msg.csv
# 微信表情中英文对照表
emoji_file : emoji.txt
# 停用词表,一般是没有实际意义的词,不想让被分析到的词都放在这里
stopword_file : stopwords_hit_modified.txt
# 词语转换表,用于合并意义相近的词,比如把“看到”、“看见”、“看看”都转换为“看”
transform_file : transformDict.txt
# 用户自定义词典,用于添加大部分字典没有的、但自己觉得不能分开的词,如i人、e人、腾讯会议
user_dict_file : userDict.txt
# 名字
# name1是自己的名字
name1 : person 1
# name2是对方的名字
name2 : person 2
# name_both是双方共同的名字
name_both : both
# 局部参数
# top_k是绘制前多少个词
# 如果词或表情的出现频次低于word_min_count或emoji_min_count,就不会被分析
# figsize是绘图图窗尺寸,第一个是宽度,第二个是高度
word_specificity :
top_k : 25
word_min_count : 2
figsize :
- 10
- 12
emoji_specificity :
emoji_min_count : 1
top_k : 5
figsize :
- 10
- 12
word_commonality :
top_k : 25
figsize :
- 10
- 12
emoji_commonality :
top_k : 5
figsize :
- 12
- 12
time_analysis :
figsize :
- 12
- 8
可以在程式碼編輯器中直接執行main.py
,也可以在命令列中(先啟動之前建立的環境)運行python main.py
。
成功運行應顯示以下資訊:
產生的圖片可以在目前目錄的figs
資料夾中找到。
查看產生的圖片,可能會有些字不是自己想要的,抑或有些自己想要的字被拆分了,此時到input_data/
目錄下面修改各檔即可。這是一個不斷迭代的過程,也就是資料清洗,比較耗時間。但沒辦法,如果想要品質比較高的結果,就耐心好好做一下,把資料清洗乾淨。
emoji.txt
是微信表情的中英文對照。微信表情在聊天記錄中是以[摀臉]或[Facepalm]的形式呈現的。我的聊天記錄裡面英文的[xxx]都有,所以建立對照表,把所有的英文換成中文。如果您發現有的表情文字還是英文,可以在裡面加入其中文,以便合併。stopwords_hit_modified.txt
是停用詞表。諸如「現在」、「進行」、「好像」這種(我自認為)沒有實際意義的詞,不應該被統計,直接把它們剔除。如果你覺得生成的結果裡面有你不想看到的詞,可以在這裡加。transformDict.txt
把一些字轉換成其他字。諸如「看到」、「看見」、「看」、「看」這些同義詞可能被分別統計,完全沒必要,我們可以把它們合併為一個詞「看」。為此,只需在兩欄中分別填寫原詞與轉換詞即可。注意,兩欄用的是製表符(Tab)隔開。usreDict
可以加入傳統字典中沒有的詞,例如「e人」、「i人」、「騰訊會議」等。如果不自行添加這些字詞,後果是它們可能會被拆成「e」、「i」、「人」、「騰訊」、「會議」這些詞,這不是我們希望看到的。 ValueError: shape mismatch: objects cannot be broadcast to a single shape
ValueError: The number of FixedLocator locations (5), usually from a call to set_ticks, does not match the number of ticklabels (1).
可能原因:出現上面兩個報錯,可能是因為對應位置的top_k或min_count設定太大了,而聊天記錄量太少,導致沒有這麼多字可以繪製。
解決方法:考慮到這一點,我在每一小段程式運行時都列印了允許設定的最大參數值。若列印雙橫線,代表該段參數設定無誤,程式運作成功。您可以檢查自己在對應位置的參數是否設定得太大了,然後適當地減少。
parse.py
讀取input_data/
中的文件,執行分詞。產生keywords.csv
放入temp_files/
,裡面在原始資料基礎上新增兩列,一列是被分割的字,一列是提取的微信表情。word_cloud.py
計算詞頻,產生pickle 檔案keyword_count.pkl
放入temp_files/
,同時製作詞雲放入figs/
。figs/
。emoji_count.pkl
放入temp_files/
同時計算表情專屬性。圖片放入figs/
。figs/
。figs/
。figs/
。 記自己寄過某個字
專屬性表示自己常說,對方不常說(反之亦然)。我對專屬性的考慮是這樣的,假如有三個字A、B、C。
字 | 自己頻次x | 對方頻次y |
---|---|---|
A | 4 | 0 |
B | 100 | 96 |
C | 1 | 0 |
對自己來說,顯然A的專屬屬性應該是最高的。 B詞的話,兩個人雖然也是差了4次,但基數比較大,差了4次其實無明顯對比。 C的話,基數太小,要說C是自己專屬的詞彙,可靠性不高。
記專屬性度量為
如果乘上基數呢?基數就是總次數
所以在我的實作中,沒有乘以詞頻總和,而是乘以詞頻的最大值,即$$ alpha_i=dfrac{x_i-y_i}{x_i+y_i}cdotmathrm{max}(x_i ,y_i) $$ 這樣可以確保A 字的專屬性是最高的。
共用性表示兩個人都常說某個字。所以先排除那些有一方從來沒說過的話。為此,首先對雙方說過的詞取交集。
現在我們還是假設有三個字A、B、C。
字 | 自己頻次x | 對方頻次y |
---|---|---|
A | 50 | 50 |
B | 1000 | 1 |
C | 1 | 1 |
B詞自己說過的次數比對方多得多,共有性顯然很低。 C詞雖然雙方說過的次數差不多,但基數太小,不能有可靠結論。所以A詞共有性最高。那怎麼算呢?
共有性是專屬性的反面,那我們能不能用專屬性的倒數呢?我覺得不好,一方面因為分母是
為此,我使用了調和平均值: $$ beta=dfrac{2}{1/x+1/y} $$ 為什麼這裡使用調和平均值而不使用其他平均值呢,因為調和平均值是四大平均值中最偏向較小數的那個,「共有性」就是強調兩個人都要常說,不能光一個人說另一個人不說,也即一方說得再多,對於共有性的影響也很小,例如B詞(1000,1)。
用調和平均值可以確保A詞有最大的共通性。
言未盡處,請看源碼。
本專案沒有整合留痕的功能,如果把留痕的擷取資料功能加進來,可以實現更簡單的流程化操作。然而囿於作者的能力和時間限制,這想法目前無法實踐。對於其他功能不足、可改進的地方,也歡迎大家在GitHub或公眾號後台留言。歡迎志同道合之士加入開發者團隊,我們一起開發更好的WechatVisualization!