這個項目的github地址软舌。https://github.com/susususuhanmo/QQChatLogWordCloud
最近準備開始學習python,寫一個綜合一點的小demo練練手~
一攘须、第一步導出qq聊天記錄為txt(這部分沒有技術含量,方法放在最后面了)
二、準備需要的包
- pandas 、numpy: 這兩個是用做數(shù)據(jù)分析非常常用也是必要的包阴颖。
- matplotlib:繪圖包
- WordCloud: 本文最核心的生成詞云的模塊
- jieba:分詞工具
這些包都可以直接用 pip install 安裝,出錯的話可以看下http://www.reibang.com/p/a7963ebecbe4這里丐膝。
三量愧、擼代碼
1、清洗聊天記錄
讀取文件
#從指定目錄下讀取導出的txt格式聊天文件
#注意使用 'utf-8'編碼讀取尤误,或者 'rb'方法二進制讀取,否則默認gbk讀取會無法解析
file=codecs.open(u"C://Users//Administrator//Desktop//最終幻想小分隊.txt",'r','utf-8')
content=file.read()
file.close()
編寫清洗函數(shù)结缚,清洗聊天數(shù)據(jù)损晤。主要是需要清洗掉一些無用的關鍵詞:
- 2017-11-06 12:54:48 蠢貨(123456789) 類似這個格式的昵稱信息
- 圖片,表情红竭,紅包尤勋,投票信息
- @別人的信息喘落,這個看情況把,我不太喜歡昵稱出現(xiàn)在最后的詞云里
#定義聊天文件處理函數(shù):
# 1最冰、使用正則去除聊天文件中的昵稱信息
# 2瘦棋、然后使用正則去掉@信息
# 3、替換掉txt中無法顯示的圖片和表情
def replaceQQStr(str):
withoutNameInfo =re.sub(r'^\d{4}-\d{2}-\d{2} \d{1,2}:\d{1,2}:\d{1,2} .*[\(\<][1-9][0-9]{4,}[\)\>]', "", str)
return re.sub(r'@.* ',"",withoutNameInfo)\
.replace("[圖片]","").replace("[表情]","").strip()
#將讀入的txt按行分開暖哨,對每行進行處理赌朋,并過濾掉投票和紅包信息。
lines = content.split("\n")
cleanedLines =[]
for line in lines:
replacedStr = replaceQQStr(line)
if replacedStr!= "" and ('參加了投票' not in replacedStr) and ('[QQ紅包]' not in replacedStr):
cleanedLines.append(replacedStr)
2篇裁、對干凈的聊天記錄進行分詞統(tǒng)計
分詞沛慢,分詞結果如果出現(xiàn)一些特有的詞語截了一半或者截多了幾個字符的情況,可以手動添加分詞詞庫达布。
# 為切詞加入未能準確識別的特有關鍵詞
# 下面是最終幻想游戲中的一些關鍵詞团甲,我們將它們添加進去。
jieba.suggest_freq('拉拉肥', True)
jieba.suggest_freq('24人本', True)
jieba.suggest_freq('4人本', True)
jieba.suggest_freq('四人本', True)
jieba.suggest_freq('8人本', True)
jieba.suggest_freq('八人本', True)
jieba.suggest_freq('二十四人本', True)
# 對清洗過的聊天文件逐行進行切詞黍聂,獲得切好的詞list
segment=[]
for cleanedLine in cleanedLines:
words = jieba.cut(cleanedLine)
for word in words:
if len(word) > 1 and word != '\r\n':
segment.append(word)
根據(jù)關鍵詞數(shù)據(jù)躺苦,建立pandas的DataFrame,通過停詞詞庫過濾掉一些中文中不適合做關鍵詞的詞語产还,進行關鍵詞數(shù)統(tǒng)計并根據(jù)次數(shù)排序匹厘。
# 通過pandas將list轉化為DataFrame
words_df=pandas.DataFrame({'segment':segment})
# 讀入停詞文件,過濾掉一些無用關鍵詞雕沉。
stopwords=pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf8")
words_df=words_df[~words_df.segment.isin(stopwords.stopword)]
# 對詞語進行數(shù)量統(tǒng)計并按照數(shù)量排序
words_stat=words_df.groupby(by=['segment'])['segment'].agg(['size'])
words_stat=words_stat.reset_index().sort_values(by="size",ascending=False)
# 將padas的DataFrame轉化為詞云所需要的字典格式
word_frequence = {x[0]: x[1] for x in words_stat.head(4000).values}
3集乔、使用WordCloud生成詞云圖片
# 設置詞云屬性
wordcloud=WordCloud(
font_path="simhei.ttf",
margin=1,
scale=32,
background_color="white",
mode="RGBA" )
# 詞云對象讀入數(shù)據(jù)
wordcloud=wordcloud.fit_words(word_frequence)
#生成詞云
plt.imshow(wordcloud)
#兩種輸出圖片方式
# 1、指定精度進行輸出
# plt.savefig("E:/temp.jpg",dpi=600)
# 2坡椒、完整圖片輸出
wordcloud.to_file("E:/temp.png")
#預覽圖片
plt.show()
詞云屬性解釋
- font_path:字體路徑
-
max_font_size:最大字號,這個我是有做調(diào)整的扰路,有時默認生成出來會覺得,關鍵詞大小都差不多倔叼,沒有突出的關鍵詞汗唱,沒有那種詞云的感覺。就像下圖那樣丈攒。
調(diào)整成120之后就好看很多哩罪,有很明顯的差別。
- margin:詞間間距
- scale:精度級別巡验?比例际插?我不知道具體該怎么翻譯,反正越大越清楚显设。運行速度越慢
- background_color:背景顏色框弛,如果想弄透明需要這里填None,然后后面的選項填RGBA,A代表透明度,只有RGBA的模式才能有透明背景捕捂。
wordcloud=WordCloud(
font_path="simhei.ttf",
margin=1,
scale=32,
background_color=None,
mode="RGBA" )
- mode:顏色模式默認"RGB"瑟枫,想弄透明背景需要選擇"RGBA"
- 輸出模式:plt.savefig輸出是指定精度輸出斗搞,wordcloud.to_file為完整圖片輸出,每個詞都能完全看清慷妙。
4僻焚、設定詞云形狀顏色的生成方法
設置圖片為可愛的莫古力
根據(jù)這個莫古力的顏色分布,生成的詞云如下膝擂,我這個不是特別好看虑啤,大家可以選擇輪廓明顯一點的圖片來生成。
相比默認的模式猿挚,
- 圖片形狀:這種方法需要用到numpy的array來讀取圖片咐旧,讀去過后在設置中設置mask屬性就可以設定詞云形狀
- 圖片配色:詞云的配色要用到wordCloud中的ImageColorGenerator根據(jù)之前的圖片數(shù)組來生成配色。
# 設置形狀和配色的圖片路徑
coloring=numpy.array(Image.open("moguli.jpg"))
# 設置詞云屬性
wordcloud=WordCloud(
mask = coloring, #設置詞云形狀為圖片的數(shù)組
font_path="simhei.ttf", margin=1,scale=32,background_color=None, mode="RGBA" )
# 讀入數(shù)據(jù)生成詞云
wordcloud=wordcloud.fit_words(word_frequence)
# 生成以圖片顏色配色的詞云
from wordcloud import WordCloud,ImageColorGenerator
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=ImageColorGenerator(coloring)))
# 完整圖片輸出
wordcloud.to_file("E:/temp.png")
#預覽圖片
plt.show()
關于更詳細的詞云配置可以看這篇文章绩蜻,這個作者對wordcloud的配置講解的十分詳細铣墨。
https://blog.csdn.net/heyuexianzi/article/details/76851377
附qq聊天記錄導出方法:
在你想導出的人或群處右鍵,點導出消息記錄办绝,
然后選擇txt格式