1. 程式人生 > >用Python繪製詞雲圖

用Python繪製詞雲圖

前言

詞雲圖是資料分析中比較常見的一種視覺化手段。
正好,Python下也有一款詞雲生成庫,word_cloud:https://github.com/amueller/word_cloud
基於我之前爬取的微博資料,製作了一批詞雲圖,由此來講講此模組的使用。

一、分詞

1.1 製作停止詞庫

分詞之前先準備一下停止詞,因為中文中有很多的語氣詞啊,副詞啊等,對於我們展現詞頻熱度是無意義的干擾詞。於是,我們就想個法子把他們排除掉。

def make_stopdict():
    stopdict = set()
    f = open("stopwords.txt","r") #網上下載來的停止詞文字,近2000個,可以自己往裡面新增
lines = f.readlines() for l in lines: stopdict.add(l.strip()) f.close() return stopdict stopdict = make_stopdict()

1.2 分詞

利用正則排除掉分詞後符號、數字、emoji表情等不容易表明意義的內容,只保留中英文。
分詞用的是jieba分詞,中文分詞領域的大佬:https://pypi.python.org/pypi/jieba/

import re

zhongwen_pat = re.compile(r'^[\u4e00-\u9fa5a-zA-Z]+$'
) all_content = [] f = open("weibo.txt","w") for t in tweets: #tweets是從資料庫中取出來的待制作詞雲圖的文字源 cut_list = [c for c in jieba.cut(t[0]) if zhongwen_pat.search(c)] cut_set = set(cut_list) res_set = cut_set - stopdict res_list = list(res_set) all_content.extend(res_list) f.writelines(res_list) f.close()

1.3 統計詞頻

對於英文文字,word_cloud可以直接對文字源生成詞雲圖。但是對中文的支援沒有那麼給力,需要我們自己分詞並且統計詞頻生成文字作為引數傳入。

def get_top_keywords(file): #這裡的file即上一步生成的“weibo.txt”
    top_word_lists = [] # 關鍵詞列表,待填充
    with open(file,'r') as f:
        texts = f.read() # 讀取整個檔案作為一個字串
        result = jieba.analyse.textrank(texts,topK=400,withWeight=True) #保留最高頻的400個詞
        for r in result:
            top_word_lists.append(r[0])
    return top_word_lists

1.4 生成詞雲圖

from scipy.misc import imread
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
import matplotlib.pyplot as plt
from os import path

def draw_wordcloud(txt):
    #讀入一個txt檔案,基於此文字知錯詞雲圖
    d = path.dirname(__file__) #當前檔案資料夾所在目錄
    color_mask = imread("te.jpg") #讀取背景圖片,
    cloud = WordCloud(
        #設定字型,不指定就會出現亂碼,檔名不支援中文
        font_path="fzmw.ttf", 
        #font_path=path.join(d,'simsun.ttc'),
        #設定背景色,預設為黑,可根據需要自定義為顏色
        background_color='black', 
        #詞雲形狀,
        mask=color_mask,
        #允許最大詞彙
        max_words=400,
        #最大號字型,如果不指定則為影象高度
        max_font_size=100,
        #畫布寬度和高度,如果設定了msak則不會生效
        width=600,
        height = 400,
        margin = 2,
        #詞語水平擺放的頻率,預設為0.9.即豎直襬放的頻率為0.1
        prefer_horizontal = 0.8
    )
    wc = cloud.generate_from_frequencies(txt) #產生詞雲
    #wc = cloud.fit_words(txt) 跟以上是同一意思
    wc.to_file("weibo_cloud.jpg") #儲存圖片
    #顯示詞雲圖片
    plt.imshow(wc)
    #不現實座標軸
    plt.axis('off')
    #繪製詞雲
    #plt.figure(dpi = 600)
    image_colors = ImageColorGenerator(color_mask)
    #plt.imshow(wc.recolor(color_func=image_colors)) 重新上色,
    plt.show()

二、詞雲圖結果

我找了新浪logo的圖片做mask,結果效果比較差。所以直接用了預設的長方形畫布。
爬蟲採集到的微博女性詞雲圖:
這裡寫圖片描述
微博男性使用者詞雲圖:
這裡寫圖片描述
注意1:字型、顏色、大小等等得多次嘗試來調整,一般預設生成的都比較醜。
注意2:停止詞與分詞的選擇很重要,我這次的結果就不是特別好,看不出個所以然來-。-