本篇為《基于Python的微信聊天記錄分析》系列的第二篇,主要講解獲取到聊天記錄數(shù)據(jù)之后,在Python環(huán)境下對其進行數(shù)據(jù)處理、分析和可視化,涉及庫的安裝、相關(guān)操作的Python代碼等內(nèi)容。希望和大家多多交流,共同進步!
一. 數(shù)據(jù)處理
數(shù)據(jù)分析的基礎(chǔ)是“數(shù)據(jù)”,俗話說基礎(chǔ)不牢,地動山搖!對于聊天記錄分析這件事兒來說,數(shù)據(jù)處理是十分有必要的,我們需要將茫茫多的記錄中的無意義或意義不明數(shù)據(jù)過濾,這樣才有助于后續(xù)的數(shù)據(jù)分析,那么就來到了本篇內(nèi)容的第一部分——數(shù)據(jù)處理。
1. 相關(guān)庫的安裝
工欲善其事,必先利其器。完成這部分內(nèi)容需要安裝一些庫,比如pandas、jieba、matplotlib等等(這部分不一定非得用我上面列的,有很多種方法可以達成目的,有一定基礎(chǔ)的童鞋可以自由發(fā)揮),下面我對篇中數(shù)據(jù)處理用到的相關(guān)庫進行簡單介紹:
- Pandas(用于數(shù)據(jù)分析):據(jù)說pandas的名字來自于“python data analysis”,可以直觀地看出它是專門用于python環(huán)境下的數(shù)據(jù)分析的擴展程序庫,它的基礎(chǔ)是numpy,在pandas中,有很多高性能、易于使用的數(shù)據(jù)結(jié)構(gòu)和分析函數(shù)。有了它,從文件中導入結(jié)構(gòu)化數(shù)據(jù)就不在話下了,它可以對各種數(shù)據(jù)進行運算,比如合并、選擇、加工等等。
- jieba(用于中文分詞):jieba的主要功能是做中文分詞,可以進行簡單分詞、并行分詞、命令行分詞,當然它的功能不限于此,目前還支持關(guān)鍵詞提取、詞性標注、詞位置查詢等,目前來說,它是做中文分詞比較好的庫之一。
- matplotlib(用于可視化):matplotlib是python環(huán)境下的2D繪圖庫,利用它可以將數(shù)據(jù)可視化,只需幾行代碼即可生成直方圖,條形圖,餅圖,散點圖等,在數(shù)據(jù)處理中較為常用。
相關(guān)庫在Anaconda Prompt中的安裝命令如下:
pip install pandas jieba matplotlib
?安裝完畢后,會顯示如下信息,successfully就意味著成功啦:
也可以安裝后import加載一下,不報錯的話就ok?~
# 導入依賴庫
import pandas as pd
import matplotlib.pyplot as plt
import jieba
?2. 數(shù)據(jù)清洗
數(shù)據(jù)清洗之前,可先通過pandas庫中讀取csv的相關(guān)函數(shù)加載聊天記錄文件,該函數(shù)加載后是DataFrame格式,十分便于后續(xù)操作,大家可以將以下代碼中的數(shù)據(jù)文件路徑修改成自己的路徑。
# 項目路徑
project_path = 'D:\\Projects\\chatmsg-analysis\\chatmsg.csv' # 需要換成自己的路徑
# pandas讀取csv文件
msg = pd.read_csv(project_path)
讀取聊天記錄中數(shù)據(jù)之后,?首先看一下格式(我這邊使用PyCharm撰寫和編輯代碼,大家可以自由選擇,Anaconda中自帶的spyder之類的都可以),數(shù)據(jù)字段如下表所示,其中標紅字段為重點使用字段,涉及是否發(fā)送者、文本內(nèi)容、時間等內(nèi)容:
字段名稱 |
含義 |
Localld |
數(shù)據(jù)ID(計數(shù)) |
TalkerId |
聊天對象ID |
Type |
數(shù)據(jù)類型(文本為1) |
SubType |
子類型 |
IsSender |
是否發(fā)送者(本人為1,對方為0) |
CreateTime |
時間戳 |
Status |
—— |
StrContent |
文本內(nèi)容 |
StrTime |
時間(年月日時分秒標準格式) |
Remark |
—— |
NickName |
—— |
Sender |
—— |
大概了解數(shù)據(jù)格式和數(shù)據(jù)內(nèi)容之后,下面我們要做數(shù)據(jù)清洗,由于我們是基于文本內(nèi)容分析的,需要將文本之外的數(shù)據(jù)濾除,以下代碼濾除了聊天內(nèi)容中的鏈接、撤回等信息,大家可以參考。?
def datacleansing(data):
# 過濾分享的鏈接等數(shù)據(jù)
data_processed = data[data['StrContent'].str.contains('http') == False]
data_processed = data_processed[data_processed['StrContent'].str.contains('<msg>') == False]
# 過濾撤回數(shù)據(jù)
data_processed = data_processed[data_processed['StrContent'].str.contains('撤回了一條') == False]
return data_processed
# 運行
msg_processed = datacleansing(msg)
?到此數(shù)據(jù)清洗就基本結(jié)束了,下面開始數(shù)據(jù)的統(tǒng)計分析~
二. 統(tǒng)計分析
本章主要涉及聊天數(shù)據(jù)的頻次、描述性等方面統(tǒng)計:
1. 按日期統(tǒng)計聊天頻次
首先是按日期統(tǒng)計兩人的聊天頻次,分別為總頻次、主方頻次和對方頻次,這樣可以對誰說的多、誰說的少一覽無余~下面上代碼:
# 首先劃定需要分析的聊天記錄時間范圍,我這邊選取了2023一整年的記錄作為分析樣本
msg_processed_time = msg_processed.loc[(msg_processed['StrTime'] >= '2023-01-01') & (msg_processed['StrTime'] <= '2024-01-01')]
# 下面利用IsSender字段將主對方分開
msg_total = msg_processed_time # 總
msg_i = msg_processed_time[msg_processed_time["IsSender"] == 1] # 我自己
msg_u = msg_processed_time[msg_processed_time["IsSender"] == 0] # 對方
# 加時間索引
msg_total['StrTime'] = pd.to_datetime(msg_total['StrTime'])
msg_total = msg_total.set_index('StrTime')
msg_i['StrTime'] = pd.to_datetime(msg_i['StrTime'])
msg_i = msg_i.set_index('StrTime')
msg_u['StrTime'] = pd.to_datetime(msg_u['StrTime'])
msg_u = msg_u.set_index('StrTime')
# 設(shè)計統(tǒng)計字段count
msg_total["count"] = 1
msg_i["count"] = 1
msg_u["count"] = 1
# 按天統(tǒng)計聊天頻次
result_total_day = msg_total.resample('D').sum()
result_i_day = msg_i.resample('D').sum()
result_u_day = msg_u.resample('D').sum()
到此,result中的count字段就是每天的聊天次數(shù)啦!?
2. 按每日不同時段統(tǒng)計聊天頻次
然后就是按每日不同時段來統(tǒng)計兩人的聊天頻次,我這里將一天分為0-23共24個時段,計算出一年內(nèi)各時段的累計聊天次數(shù),代碼如下:
# copy一份數(shù)據(jù)
msg_phase_total = msg_processed_time
# 由于我們要根據(jù)StrTime字段劃分時段,因此先將其轉(zhuǎn)為字符串,便于后續(xù)操作
msg_phase_total['StrTime'] = msg_phase_total['StrTime'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
# 取每日時段(小時部分):將StrTime字段重構(gòu)成time_phase字段
time_phase = msg_phase_total.pop('StrTime')
time_phase = time_phase.str[11:13]
msg_phase_total.insert(1, 'time_phase', time_phase)
# 取主對方
msg_phase_i = msg_phase_total[msg_phase_total["IsSender"] == 1]
msg_phase_u = msg_phase_total[msg_phase_total["IsSender"] == 0]
# 算出各時段聊天次數(shù)
result_total_tp = msg_phase_total['time_phase'].value_counts()
result_i_tp = msg_phase_i['time_phase'].value_counts()
result_u_tp = msg_phase_u['time_phase'].value_counts()
根據(jù)上述操作,一年內(nèi)每日不同時段的聊天次數(shù)就統(tǒng)計在result中了。
3. 高頻詞匯統(tǒng)計
最后是高頻詞匯統(tǒng)計,這個環(huán)節(jié)就要用到一開始提到的jieba了,我們要利用jieba.cut函數(shù)對聊天記錄中StrContent字段進行中文分詞,代碼如下:
# 分詞函數(shù)
def obtain_word(data):
word = jieba.cut(data)
return list(word)
# copy一份數(shù)據(jù)
msg_word_total = msg_processed_time
# 將StrContent字段分詞形成word字段
msg_word_total['word'] = msg_word_total['StrContent'].apply(obtain_word)
# 統(tǒng)計word字段中各詞匯頻次
result_word = pd.Series(msg_word_total['word'].sum()).value_counts()
# 需要將Series轉(zhuǎn)換為DataFrame格式,便于畫圖
result_word_list = {'labels': result_word.index, 'counts': result_word.values}
result_word_new = pd.DataFrame(result_word_list)
為了提高分詞質(zhì)量,jieba支持常用詞列表,可在項目路徑下生成文件,執(zhí)行如下代碼加載常用詞配置:
import sys
sys.path.append("../")
# 加載常用詞配置
jieba.load_userdict("userdict.txt")
?稍微講講常用詞字典配置,一個常用詞占一行,分為三部分:詞語、詞頻、詞性(空格分隔),示例如下:
詞語 詞頻 詞性
勒布朗 20 nr
詹姆斯 100 nr
打籃球 10 v
?如果還不太會的童鞋可以在csdn搜一搜,資料賊多~
三. 結(jié)果可視化
通過第二章,實際已經(jīng)把可視化所需要的數(shù)據(jù)統(tǒng)計出來了,這里我們通過matplotlib庫來進行簡單的可視化~
- 聊天頻次類——折線圖
下面是代碼,兩行就能搞定!
import matplotlib.pyplot as plt
# 聊天頻次折線圖
plt.plot(result_total_day.loc[:, ['count']])
plt.show()
結(jié)果如下:
- 詞匯出現(xiàn)次數(shù)——柱狀圖
這部分我輸出了出現(xiàn)次數(shù)較多的Top20詞匯,并且添加了標題、橫縱坐標標注,大家可以參考:
# 要配置這些,否則會出現(xiàn)中文亂碼
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 從二-3的結(jié)果中提取數(shù)據(jù)和標簽
top = result_word_new.head(20)
labels = top.iloc[:, 0]
counts = top.iloc[:, 1]
# 創(chuàng)建條形圖
plt.barh(labels, counts, color='skyblue')
plt.xlabel('出現(xiàn)次數(shù)')
plt.ylabel('詞匯')
plt.title('Top 20 出現(xiàn)詞匯')
# 反轉(zhuǎn)y軸,使得指標顯示正確
plt.gca().invert_yaxis()
# 緊湊布局,確保y軸完全顯示
plt.tight_layout()
plt.show()
結(jié)果如下(質(zhì)量還有提升空間):
四. 學習后記
本篇我是在Python環(huán)境下,利用pandas、jieba、matplotlib等庫對聊天記錄csv數(shù)據(jù)進行數(shù)據(jù)處理、統(tǒng)計分析和結(jié)果可視化,大部分內(nèi)容都是基礎(chǔ)的數(shù)據(jù)分析,僅涉及了一點點文本分詞內(nèi)容;有的環(huán)節(jié)還可以優(yōu)化,部分代碼有些粗糙(有的地方甚至可以利用成熟軟件來做,比如武漢大學的ROST等等),還望大家包容、見諒!希望多多進步,下一章打算進行一些情緒/情感分析。
與諸君共勉~
如何獲取聊天記錄數(shù)據(jù)可參考:文章來源:http://www.zghlxwxcb.cn/news/detail-826609.html
基于Python的微信聊天記錄分析——數(shù)據(jù)獲取文章來源地址http://www.zghlxwxcb.cn/news/detail-826609.html
到了這里,關(guān)于基于Python的微信聊天記錄分析——數(shù)據(jù)處理與分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!