用Python繪製詞雲圖
阿新 • • 發佈:2018-12-22
前言
詞雲圖是資料分析中比較常見的一種視覺化手段。
正好,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:停止詞與分詞的選擇很重要,我這次的結果就不是特別好,看不出個所以然來-。-