[python練手]使用WordCloud模塊將qq聊天記錄生成炫酷的關鍵詞云

這個項目的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)整的扰路,有時默認生成出來會覺得,關鍵詞大小都差不多倔叼,沒有突出的關鍵詞汗唱,沒有那種詞云的感覺。就像下圖那樣丈攒。
    temp.png

調(diào)整成120之后就好看很多哩罪,有很明顯的差別。


temp.png
  • 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僻焚、設定詞云形狀顏色的生成方法

設置圖片為可愛的莫古力


moguli.jpg

根據(jù)這個莫古力的顏色分布,生成的詞云如下膝擂,我這個不是特別好看虑啤,大家可以選擇輪廓明顯一點的圖片來生成。


temp.png

相比默認的模式猿挚,

  • 圖片形狀:這種方法需要用到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聊天記錄導出方法:

在你想導出的人或群處右鍵,點導出消息記錄办绝,


導出聊天記錄.jpg

然后選擇txt格式


選擇txt格式.jpg
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伊约,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孕蝉,更是在濱河造成了極大的恐慌屡律,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件降淮,死亡現(xiàn)場離奇詭異超埋,居然都是意外死亡,警方通過查閱死者的電腦和手機佳鳖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門霍殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人系吩,你說我怎么就攤上這事来庭。” “怎么了穿挨?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長科盛。 經(jīng)常有香客問我帽衙,道長,這世上最難降的妖魔是什么贞绵? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任厉萝,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘冀泻。我一直安慰自己,他們只是感情好蜡饵,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溯祸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焦辅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天筷登,我揣著相機與錄音剃根,去河邊找鬼。 笑死前方,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惠险。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼班巩,長吁一口氣:“原來是場噩夢啊……” “哼渣慕!你這毒婦竟也來了?” 一聲冷哼從身側響起抱慌,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤逊桦,失蹤者是張志新(化名)和其女友劉穎遥缕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體单匣,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年码秉,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸡号。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片转砖。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晋控,靈堂內(nèi)的尸體忽然破棺而出姓赤,到底是詐尸還是另有隱情赡译,我是刑警寧澤不铆,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站只洒,受9級特大地震影響,放射性物質發(fā)生泄漏毕谴。R本人自食惡果不足惜距芬,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔑穴。 院中可真熱鬧,春花似錦存和、人聲如沸奕剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茄袖。三九已至,卻和暖如春宪祥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝗羊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工耀找, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翔悠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓双炕,卻偏偏與公主長得像撮抓,于是被迫代替她去往敵國和親雄家。 傳聞我的和親對象是個殘疾皇子胀滚,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容