本篇為《基于Python的微信聊天記錄分析》系列的第三篇,主要講解在Python環(huán)境下對(duì)聊天記錄進(jìn)行進(jìn)一步的可視化,并對(duì)聊天內(nèi)容進(jìn)行初步挖掘,涉及聊天記錄可視化方法、主題模型構(gòu)建等內(nèi)容。希望和大家多多交流,共同進(jìn)步!
一. 聊天記錄可視化
?在上一篇中,我們將聊天記錄統(tǒng)計(jì)分析的結(jié)果進(jìn)行了初步可視化,包括按日期統(tǒng)計(jì)聊天頻次、按每天不同時(shí)段統(tǒng)計(jì)聊天頻次、高頻詞匯統(tǒng)計(jì)戰(zhàn)士等內(nèi)容,總體來(lái)說(shuō),可視化的是一些數(shù)學(xué)統(tǒng)計(jì)結(jié)果。在本章中,我將深入到聊天記錄內(nèi)容中,在文本級(jí)別對(duì)聊天記錄做進(jìn)一步的可視化,比如詞云、聊天熱力圖等,主要內(nèi)容如下:
1. 詞云
(1)Wordcloud介紹與安裝
在Python環(huán)境中,第三庫(kù)——wordcloud可以便捷地實(shí)現(xiàn)文本中關(guān)鍵字的可視化展現(xiàn),通過(guò)詞云分析,可以直觀地突出文本中的主旨,在本篇內(nèi)容中,即可以展現(xiàn)雙方聊天的主要內(nèi)容和口頭禪,下面簡(jiǎn)單介紹一下wordcloud庫(kù):
- Wordcloud(用于詞云圖生成):wordcloud是一個(gè)用于生成詞云圖的Python庫(kù),用于展示文本數(shù)據(jù)中出現(xiàn)頻率較高的詞匯,通過(guò)將文本中的詞匯按照其出現(xiàn)的頻率進(jìn)行大小排序,然后將這些詞匯以特定的形狀、顏色等元素組合成一個(gè)圖形,從而直觀地展示文本的主題和關(guān)鍵詞。該庫(kù)在文本分析中較為用。
wordcloud在Anaconda Prompt中的安裝命令如下:
pip install wordcloud
?安裝好之后import一下,如果不報(bào)錯(cuò)就是安裝成功啦,安好之后首先我們要對(duì)之前的數(shù)據(jù)進(jìn)行簡(jiǎn)單的處理,便于wordcloud庫(kù)直接加載數(shù)據(jù)生成詞云。
(2)基于wordcloud的詞云展示
回顧一下,上一篇博客(文末有引用~)中分詞之后的數(shù)據(jù)為“result_word_new”,本篇對(duì)該數(shù)據(jù)繼續(xù)進(jìn)行處理。
- 第一步,去掉聊天記錄中的“\n”換行符無(wú)效數(shù)據(jù)
word_data = result_word_new.drop(index=result_word_new[(result_word_new.labels == '\n')].index.tolist())
大家需要檢查一下自己的聊天記錄經(jīng)過(guò)jieba分詞之后,里面是否有“\n”,如果有的話需要過(guò)濾掉,否則會(huì)報(bào)錯(cuò):ValueError: anchor not supported for multiline text
- ??第二步,將數(shù)據(jù)轉(zhuǎn)換為dict格式
word_dict = dict(zip(word_data['labels'],word_data['counts'])) # labels和counts按自己設(shè)置的列名
- 第三步,停用詞過(guò)濾,將自己不想展示的詞匯濾除,比如各種單個(gè)漢字、語(yǔ)氣詞、符號(hào)之類,這里建議可以使用網(wǎng)上開(kāi)源的停用詞集合:中文常用停用詞表,注意:如果word_dict是字典,那么無(wú)法使用generate,需要使用generate_from_frequencies或者fit_words,此時(shí)配置參數(shù)中填寫(xiě)stopwords無(wú)效,因此我們將數(shù)據(jù)中的停用詞提前過(guò)濾掉。
- 第四步,設(shè)置詞云相關(guān)參數(shù),比如字體、長(zhǎng)、寬、背景色等,這里我用的阿里巴巴普惠體2.0字體,別的也可以啦。
- 第五步,生成詞云,wc.fit_words()或wc.generate_from_frequencies()都可以。
# 加載下載好的停用詞表
with open("D:\\Projects\\chatmsg-analysis\\哈工大停用詞表.txt", "r", encoding="utf-8") as fp:
stopwords = [s.rstrip() for s in fp.readlines()]
# 將數(shù)據(jù)中的停用詞過(guò)濾掉
word_dict_result = []
for i in dict.keys(word_dict):
if i not in stopwords:
word_dict_result[i] = word_dict[i]
# 加載字體
font = "D:\\Projects\\chatmsg-analysis\\AlibabaPuHuiTi-2-45-Light.ttf"
# wordcloud配置參數(shù)
wc = wordcloud.WordCloud(
font_path=font,
width=1000,
height=1000,
background_color="skyblue",
max_words=50) # 詞數(shù),可改
# 生成詞云
wc.fit_words(word_dict_result)
# 或
wc.generate_from_frequencies(word_dict_result)
最后我們可以用如下代碼將詞云顯示
plt.imshow(wc)
plt.axis("off")
plt.show()
結(jié)果如下:
另外,wordcloud還支持更換背景,這樣有更多的可玩性,比如我們自己做一張愛(ài)心圖片作為mask~若想用圖片作為背景,需要先安裝imageio(一個(gè)用于讀/寫(xiě)圖像的庫(kù)):
pip install imageio
詞云的配置參數(shù)需要進(jìn)行微調(diào):
from imageio.v2 import imread
# 加載一張愛(ài)心圖片
background = imread('D:\\Projects\\chatmsg-analysis\\heart.png')
# 配置參數(shù)時(shí)加上mask項(xiàng)
wc = wordcloud.WordCloud(
font_path=font,
width=1000,
height=1000,
background_color="skyblue",
max_words=50,
mask = background)
愛(ài)心圖片示例和詞云結(jié)果如下:
?
到此詞云就生成完畢啦,wordcloud的配置參數(shù)中還有很多有趣的選項(xiàng),大家可以多多探索。?
2. 聊天熱力圖
(1)熱力圖介紹
在這節(jié)開(kāi)始前,先普及一下熱力圖(Heatmap),實(shí)際上就是通過(guò)顏色的深淺來(lái)反應(yīng)數(shù)據(jù)的統(tǒng)計(jì)結(jié)果,比如:在某一色系下,一般較大的值由較深的顏色表示,較小的值由較淺的顏色表示。
(2)基于matplotlib實(shí)現(xiàn)聊天熱力圖展示
本節(jié)主要基于上一篇博客(文末有引用~)中按天統(tǒng)計(jì)聊天頻次的結(jié)果“result_total_day”,做一些簡(jiǎn)單的處理,然后通過(guò)matplotlib實(shí)現(xiàn)聊天熱力圖的展示。整體代碼如下:
import matplotlib.pyplot as plt
# 對(duì)result_total_day數(shù)據(jù)進(jìn)行處理
# 變量初始化
msg_dict = dict()
week_array = []
week_count = 1
for index, row in result_total_day.iterrows():
# 將每天的聊天記錄數(shù)量寫(xiě)入每周統(tǒng)計(jì)數(shù)組中
week_array = np.append(week_array, int(row["count"]))
# 因?yàn)橐恢苡衅咛欤晕覀冞@邊七天將結(jié)果寫(xiě)入一次,重置一下數(shù)組(week_array),更新周數(shù)(week_count )
if len(week_array) == 7:
msg_dict[week_count] = week_array
week_count += 1
week_array = []
# 獲取我們后續(xù)制熱力圖需要的縱軸坐標(biāo)(周數(shù))和熱力圖中的值(聊天記錄數(shù)量)
y_labels = list(msg_dict.keys())
values = list(msg_dict.values())
# 自定義橫軸坐標(biāo)(周一到周日,順序大家根據(jù)數(shù)據(jù)修改一下)
x_labels = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
# 繪圖
fig, axe = plt.subplots(figsize=(15, 15)) # size可以調(diào)整
axe.set_xticks(np.arange(len(x_labels)))
axe.set_yticks(np.arange(len(y_labels)))
axe.set_xticklabels(x_labels)
axe.set_yticklabels(y_labels)
im = axe.imshow(values, cmap=plt.cm.Reds) # 顏色可更改,我這里是紅色
# 是否開(kāi)啟參考刻度,如不需開(kāi)啟,注釋下面這行代碼
axe.figure.colorbar(im, ax=axe)
plt.show()
聊天熱力圖結(jié)果如下:
到此熱力圖就做完啦,根據(jù)熱力圖中的深淺結(jié)果結(jié)果,可以直觀看出每周/每天的聊天頻次~?
二. 聊天主題模型構(gòu)建
本章的目的是通過(guò)構(gòu)建LDA主題模型,推斷聊天記錄中隱含的主題分布,包括LDA主題模型介紹、基于Python的主題模型構(gòu)建等內(nèi)容。
1. LDA主題模型
LDA主題模型概念如下:
LDA主題模型:LDA為L(zhǎng)atent Dirichlet Allocation(隱含狄利克雷分布)的縮寫(xiě),是一種概率主題模型,由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用來(lái)推測(cè)文檔的主題分布。它可以將文檔集中每篇文檔的主題以概率分布的形式給出,從而通過(guò)分析一些文檔抽取出它們的主題分布后,便可以根據(jù)主題分布進(jìn)行主題聚類或文本分類。
?2. Gensim介紹與安裝
在Python環(huán)境中,已經(jīng)有可以直接拿來(lái)用的LDA主題模型第三方包,比如我們這次使用的Gensim:
Gensim:Gensim是一款開(kāi)源的第三方Python庫(kù),在做NLP相關(guān)項(xiàng)目中這個(gè)庫(kù)的使用頻率是比較高的,它用于從原始的非結(jié)構(gòu)化的文本中,無(wú)監(jiān)督地學(xué)習(xí)到文本隱層的主題向量表達(dá)。一方面,它包括TF-IDF,LSA,LDA,和word2vec在內(nèi)的多種主題模型,另一方面,它支持流式訓(xùn)練,并提供了一些常用操作的API接口。
?gensim在Anaconda Prompt中的安裝命令如下:
pip install gensim
?LDA主題模型相關(guān)可視化庫(kù)pyLDAvis,有助于分析和創(chuàng)建由LDA創(chuàng)建的簇的高度交互式可視化,并且友好的是它有著gensim的數(shù)據(jù)接口API,更利于可視化分析,pyLDAvis的安裝命令如下:
pip install pyldavis
同樣, 安裝好之后import一下,不報(bào)錯(cuò)就ok。
3. 基于Gensim的LDA主題模型構(gòu)建?
本節(jié)主要基于上一篇博客(文末有引用~)中jieba分詞之后的結(jié)果“msg_word_total”,做預(yù)處理和向量化,然后通過(guò)Gensim庫(kù)中的LdaModel函數(shù)進(jìn)行訓(xùn)練,最后獲取主題詞的分布并展示。
(1)預(yù)處理
預(yù)處理環(huán)節(jié)主要將“msg_word_total”中的“word”字段(分詞結(jié)果)由dataframe轉(zhuǎn)換為list格式,便于后續(xù)gensim加載處理,代碼如下:
# 加載gensim庫(kù)
from gensim.models import LdaModel
from gensim.corpora import Dictionary
# 新建list空間
data_cut = []
for index, row in msg_word_total.iterrows():
data_cut.append(row["word"]) # 將word字段的值寫(xiě)入list里
?如果覺(jué)得數(shù)據(jù)質(zhì)量不高,還需要做進(jìn)一步清洗,比如用正則表達(dá)式將文本中數(shù)字、符號(hào)過(guò)濾掉,或加載第一章中的停用詞表,將停用詞過(guò)濾掉,這部分不細(xì)講了。
?(2)文本向量化
LDA采用了詞袋模型(BOW ——Bag of words),所以我們將每一條聊天記錄分詞的結(jié)果轉(zhuǎn)化為詞袋向量,這里我把一些頻率過(guò)高的詞過(guò)濾掉了(主要為了防止頻率過(guò)高的語(yǔ)氣詞干擾訓(xùn)練結(jié)果)。代碼如下:
data_cut_dict = Dictionary(data_cut)
data_cut_dict.filter_n_most_frequent(300) # 300次以上的過(guò)濾
corpus = [data_cut_dict.doc2bow(text) for text in data_cut]
(3)LDA主題模型訓(xùn)練
將向量化之后的文本加載到LDA模型中,設(shè)定好主題的個(gè)數(shù)(聚類方法,需要指定主題的個(gè)數(shù)),這里我隨機(jī)設(shè)置了20個(gè),大家可以根據(jù)數(shù)據(jù)情況任意修改,運(yùn)行下方代碼開(kāi)始訓(xùn)練:
model = LdaModel(corpus, id2word=data_cut_dict, iterations=500, num_topics=8, alpha='auto')
?(4)結(jié)果可視化
最后我們要將訓(xùn)練好的model可視化,直接用上文提到的pyLDAvis就可以,代碼如下:
import pyLDAvis.gensim
result_vis = pyLDAvis.gensim.prepare(model, corpus, data_cut_dict)
pyLDAvis.show(result_vis)
但一開(kāi)始用 pyLDAvis可視化時(shí),遇到了以下錯(cuò)誤:
?此時(shí)只需要點(diǎn)擊報(bào)錯(cuò)的_display.py,將下圖中226行l(wèi)ocal=True改為local=False就可以啦!
可視化結(jié)果如下:
三. 學(xué)習(xí)后記
本篇我基于Python環(huán)境開(kāi)展聊天記錄可視化和主題模型構(gòu)建的學(xué)習(xí)和研究,在第一章中,利用wordcloud構(gòu)建詞云,基于matplotlib生成聊天熱力圖;在第二章中,利用gensim構(gòu)建LDA主題模型聚類生成聊天記錄主題,并利用pyLDAvis生成可視化結(jié)果。學(xué)習(xí)過(guò)程中的部分代碼還有優(yōu)化空間,望大家包容、見(jiàn)諒!在后續(xù)學(xué)習(xí)中,打算做進(jìn)一步的文本挖掘。
與諸君共勉~
如何獲取聊天記錄數(shù)據(jù)可參考:
基于Python的微信聊天記錄分析——數(shù)據(jù)獲取
如何對(duì)聊天數(shù)據(jù)進(jìn)行數(shù)據(jù)處理和分析可參考:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-848595.html
基于Python的微信聊天記錄分析——數(shù)據(jù)處理與分析文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-848595.html
到了這里,關(guān)于基于Python的微信聊天記錄分析——可視化方法與主題模型構(gòu)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!