本文經由博客園作者 費弗裡 授權轉載
原文地址:https://www.cnblogs.com/feffery/p/11842798.html#4477534
如需轉載請聯繫原作者
本文對應腳本及數據已上傳至Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes
一、簡介 詞雲圖是文本挖掘中用來表徵詞頻的數據可視化圖像,通過它可以很直觀地展現文本數據中地高頻詞:
在Python中有很多可視化框架可以用來製作詞雲圖,如pyecharts,但這些框架並不是專門用於製作詞雲圖的,因此並不支持更加個性化的製圖需求,要想創作出更加美觀個性的詞雲圖,需要用到一些專門繪製詞雲圖的第三方模塊,本文就將針對其中較為優秀易用的wordcloud以及stylecloud的用法進行介紹和舉例說明。
wordcloud是Python中製作詞雲圖比較經典的一個模塊,賦予用戶高度的自由度來創作詞雲圖:
這裡我們使用到來自wordcloud官方文檔中的constitution.txt來作為可視化的數據素材:
首先我們讀入數據並將數據清洗成空格分隔的長字符串:
import re
with open(『constitution.txt』) as c:
『』』抽取文本中的英文部分並小寫化,並將空格作為分隔拼接為長字符串』』』
text = 『 『.join([word.group().lower() for word in re.finditer(『[a-zA-Z]+』, c.read())])
『』』查看前100個字符』』』
text[:500]
接著使用wordcloud中用於生成詞雲圖的類WordCloud配合matplotlib,在默認參數設置下生成一張簡單的詞雲圖:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud().generate(text)
plt.figure(figsize=[12, 10])
plt.imshow(wordcloud)
plt.axis(『off』)
plt.show()
生成的詞雲圖:
畢竟是在默認參數下生成的詞雲圖,既醜陋又模糊,為了繪製好看的詞雲圖,接下來我們來對wordcloud繪製詞雲圖的細節內容進行介紹,並不斷地對圖5進行升級改造。
2.2 WordCloud作為wordcloud繪製詞雲圖最核心的類,WordCloud的主要參數及說明如下:
fontpath:字符型,用於傳入本地特定字體文件的路徑(ttf或otf文件)從而影響詞雲圖的字體族了解了上述參數的意義之後,首先我們修改背景色為白色,增大圖床的長和寬,加大scale以提升圖片的精細程度,並使得水平顯示的文字儘可能多:
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud(background_color=『white』, # 背景色為白色
height=400, # 高度設置為400
width=800, # 寬度設置為800
scale=20, # 長寬拉伸程度設置為20
prefer_horizontal=0.9999).generate(text)
plt.figure(figsize=[8, 4])
plt.imshow(wordcloud)
plt.axis(『off』)
『』』保存到本地』』』
plt.savefig(『圖6.jpg』, dpi=600, bbox_inches=『tight』, quality=95)
plt.show()
可以看到相較於圖5,在美觀程度上有了很大的進步,接下來,我們在圖6的基礎上添加美國本土地圖蒙版:
利用PIL模塊讀取我們的美國本土地圖蒙版.png文件並轉換為numpy數組,作為WordCloud的mask參數傳入:
from PIL import Image
import numpy as np
usa_mask = np.array(Image.open(『美國本土地圖蒙版.png』))
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud(background_color=『white』, # 背景色為白色
height=4000, # 高度設置為400
width=8000, # 寬度設置為800
scale=20, # 長寬拉伸程度程度設置為20
prefer_horizontal=0.9999,
mask=usa_mask # 添加蒙版
).generate(text)
plt.figure(figsize=[8, 4])
plt.imshow(wordcloud)
plt.axis(『off』)
『』』保存到本地』』』
plt.savefig(『圖8.jpg』, dpi=600, bbox_inches=『tight』, quality=95)
plt.show()
可以看到圖8在圖6的基礎上進一步提升了美觀程度,接下來我們利用wordcloud中用於從圖片中提取調色方案的類ImageColorGenerator來從下面的星條旗美國地圖蒙版中提取色彩方案,進而反饋到詞雲圖上:
from PIL import Image
import numpy as np
from wordcloud import ImageColorGenerator
usamask = np.array(Image.open(『美國地圖蒙版星條旗色.png』))
image_colors = ImageColorGenerator(usa_mask)
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud(background_color=『white』, # 背景色為白色
height=400, # 高度設置為400
width=800, # 寬度設置為800
scale=20, # 長寬拉伸程度程度設置為20
prefer_horizontal=0.2, # 調整水平顯示傾向程度為0.2
mask=usa_mask, # 添加蒙版
max_words=1000, # 設置最大顯示字數為1000
relative_scaling=0.3, # 設置字體大小與詞頻的關聯程度為0.3
max_font_size=80 # 縮小最大字體為80
).generate(text)
plt.figure(figsize=[8, 4])
plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)
plt.axis(『off』)
『』』保存到本地』』』
plt.savefig(『圖10.jpg』, dpi=600, bbox_inches=『tight』, quality=95)
plt.show()
相較於英文文本語料,中文語料處理起來要麻煩一些,我們需要先進行分詞等預處理才能進行下一步的處理,這裡我們使用某外賣平臺用戶評論數據,先讀取進來看看:
import pandas as pd
import jieba
『』』讀入原始數據』』』
raw_comments = pd.read_csv(『waimai_10k.csv』);raw_comments.head()
接下來我們利用re、jieba以及pandas中的apply對評論列進行快速清洗:
『』』導入停用詞表』』』
with open(『stopwords.txt』) as s:
stopwords = set([line.replace(『\n』, 『』) for line in s])
『』』傳入apply的預處理函數,完成中文提取、分詞以及多餘空格剔除』』』
def preprocessing(c):
c = [word for word in jieba.cut(『 『.join(re.findall(『[\u4e00-\u9fa5]+』, c))) if word != 『 『 and word not in stopwords]
return 『 『.join(c)
『』』將所有語料按空格拼接為一整段文字』』』
comments = 『 『.join(raw_comments[『review』].apply(preprocessing));comments[:500]
得到的結果如圖12:
這時我們就得到所需的文本數據,接下來我們用美團外賣的logo圖片作為蒙版繪製詞雲圖:
from PIL import Image
import numpy as np
from wordcloud import ImageColorGenerator
waimai_mask = np.array(Image.open(『美團外賣logo蒙版.png』))
image_colors = ImageColorGenerator(waimai_mask)
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud(background_color=『white』, # 背景色為白色
height=400, # 高度設置為400
width=800, # 寬度設置為800
scale=20, # 長寬拉伸程度程度設置為20
prefer_horizontal=0.2, # 調整水平顯示傾向程度為0.2
mask=waimai_mask, # 添加蒙版
max_words=1000, # 設置最大顯示字數為1000
relative_scaling=0.3, # 設置字體大小與詞頻的關聯程度為0.3
max_font_size=80 # 縮小最大字體為80
).generate(comments)
plt.figure(figsize=[8, 4])
plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)
plt.axis(『off』)
『』』保存到本地』』』
plt.savefig(『圖14.jpg』, dpi=600, bbox_inches=『tight』, quality=95)
plt.show()
這時我們會發現詞雲圖上繪製出的全是亂碼,這是因為matplotlib默認字體是不包含中文的:
這時我們只需要為WordCloud傳入font_path參數即可,這裡我們選擇SimHei字體:
from PIL import Image
import numpy as np
from wordcloud import ImageColorGenerator
waimai_mask = np.array(Image.open(『美團外賣logo蒙版.png』))
image_colors = ImageColorGenerator(waimai_mask)
『』』從文本中生成詞雲圖』』』
wordcloud = WordCloud(font_path=『SimHei.ttf』, # 定義SimHei字體文件
background_color=『white』, # 背景色為白色
height=400, # 高度設置為400
width=800, # 寬度設置為800
scale=20, # 長寬拉伸程度程度設置為20
prefer_horizontal=0.2, # 調整水平顯示傾向程度為0.2
mask=waimai_mask, # 添加蒙版
max_words=1000, # 設置最大顯示字數為1000
relative_scaling=0.3, # 設置字體大小與詞頻的關聯程度為0.3
max_font_size=80 # 縮小最大字體為80
).generate(comments)
plt.figure(figsize=[8, 4])
plt.imshow(wordcloud.recolor(color_func=image_colors), alpha=1)
plt.axis(『off』)
『』』保存到本地』』』
plt.savefig(『圖15.jpg』, dpi=600, bbox_inches=『tight』, quality=95)
plt.show()
stylecloud是一個較為嶄新的模塊,它基於wordcloud,添加了一系列的嶄新特性譬如漸變顏色等,可以支持更為個性化的詞雲圖創作:
這裡我們沿用上一章節中使用過的處理好的text來繪製詞雲圖:
import stylecloud
from IPython.display import Image # 用於在jupyter lab中顯示本地圖片
『』』生成詞雲圖』』』
stylecloud.gen_stylecloud(text=text,
size=512,
output_name=『圖17.png』)
『』』顯示本地圖片』』』
Image(filename=『圖17.png』)
可以看出,styleword生成詞雲圖的方式跟wordcloud不同,它直接就將原始文本轉換成本地詞雲圖片文件,下面我們針對其繪製詞雲圖的細節內容進行介紹。
3.2 gen_stylecloud在stylecloud中繪製詞雲圖只需要gen_stylecloud這一個函數即可,其主要參數及說明如下:
text:字符串,格式同WordCloud中的generate()方法中傳入的text對上述參數有所了解之後,下面我們在圖17的基礎上進行改良,首先我們將圖標形狀換成炸彈的樣子,接著將配色方案修改為scientific.diverging.Broc_3:
『』』生成詞雲圖』』』
stylecloud.gen_stylecloud(text=text,
size=1024,
output_name=『圖18.png』,
palette=『scientific.diverging.Broc_3』, # 設置配色方案
icon_name=『fas fa-bomb』 # 設置圖標樣式
)
『』』顯示本地圖片』』』
Image(filename=『圖18.png』)
在wordcloud中繪製中文詞雲圖類似wordcloud只需要注意傳入支持中文的字體文件即可,下面我們使用一個微博語料數據weibo_senti_100k.csv來舉例:
weibo = pd.read_csv(『weibo_senti_100k.csv』)
weibo_text = [word for word in jieba.cut(『 『.join(re.findall(『[\u4e00-\u9fa5]+』, 『 『.join(weibo[『review』].tolist())))) if word != 『 『 and word not in stopwords]
weibo_text[:10]
接著我們將蒙版圖標樣式換成新浪微博,將色彩方案換成colorbrewer.sequential.Reds_3:
『』』生成詞雲圖』』』
『』』生成詞雲圖』』』
stylecloud.gen_stylecloud(text=『 『.join(weibo_text),
size=1024,
output_name=『圖20.png』,
palette=『colorbrewer.sequential.Reds_3』, # 設置配色方案為https://jiffyclub.github.io/palettable/colorbrewer/sequential/#reds_3
icon_name=『fab fa-weibo』, # 設置圖標樣式
gradient=『horizontal』, # 設置顏色漸變方向為水平
font_path=『SimHei.ttf』,
collocations=False
)
『』』顯示本地圖片』』』
Image(filename=『圖20.png』)
以上就是本文的全部內容,如有筆誤望指出!
更多精彩
在公眾號後臺對話框輸入以下關鍵詞
查看更多優質內容!
女朋友 | 大數據 | 運維 | 書單 | 算法
大數據 | JavaScript | Python | 黑客
AI | 人工智慧 | 5G | 區塊鏈
機器學習 | 數學 | 送書