詞云是文本可視化的重要方式,可將大段文本中的關(guān)鍵語句和詞匯高亮展示取劫,
本篇文章先介紹幾種制作詞云的 Python 庫匆笤,分別是 WordCloud、StyleCloud谱邪、Pyecharts炮捧;再加一個(gè)在線詞云制作網(wǎng)站;最后通過代碼實(shí)操和可視化效果對(duì)它們做個(gè)簡單比較
WordCloud惦银、StyleCloud咆课、Pyecharts 這三個(gè)包制作詞云都具備一個(gè)特點(diǎn):僅需幾行代碼就能繪制出一張精美的詞云圖灌砖,但需設(shè)置的參數(shù)量較大;
WordCloud
WordCloud 是 Python 做詞云圖使用頻率最高的一個(gè)庫傀蚌,上手簡單,操作方便蘸吓;詞云 mask 形狀可以自定義善炫;后面介紹的兩款庫都是基于它 進(jìn)行二次開發(fā)
WordCloud 把所有方法都封裝到 WordCloud 類中,使用時(shí)只需更改一些參數(shù)库继,來調(diào)整詞云圖樣式
以一個(gè)簡單的 圓形 詞云圖為例箩艺,
先用 collections 構(gòu)建了一個(gè)詞頻字典, 之后利用 WordCloud() 中的 generate_from_frequencies() 方法來擬合傳入的文本
關(guān)于詞云形狀 宪萄,下面代碼中通過 numpy 生成一個(gè)圓形二值化數(shù)組作為 mask 參數(shù);
from wordcloud import WordCloud
from collections import Counter
word_list = []
with open("danmu.txt",encoding='utf-8') as f:
words = f.read()
for word in words.split('\n'):
if re.findall('[\u4e00-\u9fa5]+', str(word), re.S): # 正則表達(dá)式匹配中文字符
word_list.append(word)
def SquareWord(word_list):
counter = Counter(word_list) # 計(jì)算詞頻艺谆;
start = random.randint(0, 15) # 隨機(jī)取0-15中間一個(gè)數(shù)字;
result_dict = dict(counter.most_common()[start:]) # 在 counter 中取前start 個(gè)元素;
x,y = np.ogrid[:300,:300] # 創(chuàng)建0-300二維數(shù)組拜英;
mask = (x-150)**2 + (y-150)**2>130**2 #創(chuàng)建以 150静汤,150為圓心,半徑為130的Mask居凶;
mask = 255*mask.astype(int) # 轉(zhuǎn)化為 int
wc = WordCloud(background_color='black',
mask = mask,
mode = 'RGB',
font_path="D:/Data/fonts/HGXK_CNKI.ttf", # 設(shè)置字體路徑虫给,用于設(shè)置中文,
).generate_from_frequencies(result_dict)
plt.axis("off")
plt.imshow(wc,interpolation="bilinear")
plt.show()
SquareWord(word_list)# 繪制詞云圖主函數(shù)
效果如下:
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">square</figcaption>
WordCloud 相對(duì)于其它兩個(gè) Python 庫最突出的一個(gè)點(diǎn):**可以自定義 Mask **,通過 mask 參數(shù)傳入一個(gè) numpy 數(shù)組侠碧,來設(shè)定詞云形狀
但需要注意的是文本只填充 value!=255
的區(qū)域抹估,對(duì) Value ==255
區(qū)域忽略 ,所以如果作為mask的備選圖像不滿足這個(gè)條件的話弄兜,需對(duì)圖像進(jìn)行預(yù)處理如下药蜻,背景用純白色像素填充
自定義mask詞云繪制
def AliceWord(word_list):
counter = Counter(word_list) # 計(jì)算詞頻;
start = random.randint(0, 15) # 隨機(jī)取0-15中間一個(gè)數(shù)字;
result_dict = dict(counter.most_common()[start:]) # 在 counter 中取前start 個(gè)元素替饿;
# x, y = np.ogrid[:300, :300] # 創(chuàng)建0-300二維數(shù)組语泽;
# mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2 # 創(chuàng)建以 150,150為圓心盛垦,半徑為130的Mask湿弦;
# mask = 255 * mask.astype(int) # 轉(zhuǎn)化為 int
# 讀取圖片作為 Mask
alic_coloring = np.array(Image.open("D:/Data/WordArt/Alice_mask.png"))
wc = WordCloud(background_color = "white",# 設(shè)置背景顏色
mode ="RGB",
mask=alic_coloring,# 為None時(shí),自動(dòng)創(chuàng)建一個(gè)二值化圖像腾夯,長400颊埃,寬200;
min_font_size=4,# 使用詞的最小頻率限定蝶俱;
relative_scaling= 0.8,# 詞頻與大小相關(guān)性
font_path="D:/Data/fonts/HGXK_CNKI.ttf", # 字體路徑班利,用于設(shè)置中文,
).generate_from_frequencies(result_dict)
wc.to_file("D:/Data/WordArt/wordclound.jpg")# 把生成的詞云圖進(jìn)行保存
plt.axis("off")
plt.imshow(wc, interpolation="bilinear")
plt.show()
可視化效果
最后,這里提一下 WordCloud 中最主要的幾個(gè)參數(shù)設(shè)定:
- background_color(type->str) 榨呆,顏色名字或顏色代碼罗标,設(shè)置詞云圖的背景色
- font_path(type->str), 自定義字體路徑,需要注意的時(shí)若預(yù)覽的是中文文本闯割,這個(gè)參數(shù)必須設(shè)置彻消,否則會(huì)出現(xiàn)亂碼情況;
- mask(type->ndarray)宙拉,自定義詞云形狀宾尚,繪制時(shí)忽略純白區(qū)域;
- mode(type->str)谢澈,設(shè)為 ’RGBA‘ 時(shí)煌贴,背景為透明,默認(rèn)為 ’RGB‘锥忿;
- relative_scaling(type-> float)牛郑,詞匯頻率與最終詞匯展示大小相關(guān)性,取值 0 -1敬鬓;這個(gè)值越大相關(guān)性越強(qiáng)淹朋,默認(rèn)為 0.5;
- prefer_horizontal(type->float)列林,控制水平文字相對(duì)于處置顯示文字的比例瑞你,越小則詞云圖中豎直顯示文字越多;
除了以上參數(shù)之外希痴,還可以設(shè)定 顏色者甲,禁用詞,是否出現(xiàn)重復(fù)詞
等信息
詳情可參考官方文檔
https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html#wordcloud.WordCloud
StyleCloud
StyleCloud 是基于 WordCloud 開發(fā)的砌创,在 WordCloud 的基礎(chǔ)上又加入了一些新特性
- 1虏缸,支持顏色漸變;
- 2嫩实,關(guān)于詞云顏色刽辙,可以通過設(shè)計(jì)好的調(diào)色板來設(shè)置;
- 3甲献,支持圖標(biāo) 作為 mask宰缤,這個(gè)新特性是最贊的,并且設(shè)置時(shí)可直接對(duì)接 Font Awesome 網(wǎng)站晃洒,這里面有各式各樣的圖標(biāo)
- 4慨灭,除了 text文本可作為詞匯輸入之外,還支持等 csv球及、txt 文件格式的輸入氧骤;
主程序只需一行代碼即可
def Style_WordArt():
# StyleClound 繪制詞云圖
stylecloud.gen_stylecloud(
file_path = "danmu.txt",#詞云文本
background_color='white',#背景顏色
palette="colorbrewer.qualitative.Dark2_7",#調(diào)色板,來改變?cè)~云圖文本顏色
icon_name='fas fa-cat',# 詞云圖標(biāo)吃引;
font_path= "D:/Data/fonts/HGXK_CNKI.ttf",# 中文字體路徑
random_state=40,#控制文本顏色隨機(jī)狀態(tài)筹陵;
invert_mask= False,# 最終Mask是否逆置刽锤;
output_name="D:/Data/WordArt/styleclound.jpg",# 圖片保存路徑
)
效果如下:
修改蒙版的話只需要更改 icon_name
參數(shù)即可,可參考 Font Awesome 網(wǎng)站朦佩,https://fontawesome.com/icons?d=gallery&m=free并思,里面幾千種圖案都可以使用
icon_name
名稱的設(shè)置為目標(biāo)圖標(biāo)的 class 標(biāo)簽即可,如下
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 0.0;">image-20210210120030256</figcaption>
當(dāng) icon_name = 'fas fa-dog'
時(shí)
當(dāng) icon_name ='fab fa-amazon'
時(shí):
關(guān)于詞云顏色調(diào)色板設(shè)定语稠,修改 palette 參數(shù)即可纺荧,palette 設(shè)定可參考 Palettable 網(wǎng)站:https://jiffyclub.github.io/palettable/ ,有多種調(diào)色樣式模板可供選擇
其中上面每個(gè)模塊中又有許多子模塊颅筋,為最終需要設(shè)置的調(diào)色板
設(shè)置時(shí)選擇任意模板的子模板即可, 不需要前面的palettable.
字符串输枯;例如我想設(shè)置 palettale.colorbrewser.qualitative.Dark2_3 作為調(diào)色版议泵,只需要將 palettle = 'colorbrewser.qualitative.Dark2_3'
即可
設(shè)置不同的調(diào)色板,最終會(huì)有不同的樣式效果哦桃熄!
paletabble ='colorbrewer.qualitative.Paired_10'
paletabble ='lightbartlein.diverging.BlueDarkOrange12_11'
關(guān)于 Stylecloud 其它參數(shù)用法先口,可參考官方文檔 https://github.com/minimaxir/stylecloud
Pyecharts
Pyecharts 是基于 Apache Echarts 開發(fā)的,主要用于數(shù)據(jù)可視化瞳收;詞云圖只是其中眾多圖表類型中的一個(gè)碉京,相對(duì)于前兩種詞云包,Pyecharts 的可視化效果要弱一些
但 Pyecharts 將詞云圖保存為單個(gè) html 文件螟深,最終呈現(xiàn)出來有一定的交互效果
代碼部分
from pyecharts.charts import WordCloud
import pyecharts.options as opts
word_list = []
with open("danmu.txt",encoding='utf-8') as f:
words = f.read()
for word in words.split('\n'):
if re.findall('[\u4e00-\u9fa5]+', str(word), re.S): # 正則表達(dá)式匹配中文字符
word_list.append(word)
def Pyecharts_wordArt(word_list):
counter = Counter(word_list) # 計(jì)算詞頻谐宙;
start = random.randint(0, 15) # 隨機(jī)取0-15中間一個(gè)數(shù)字;
result_dict = list(counter.most_common()[start:]) # 在 counter 中取前start 個(gè)元素;
print(result_dict[5:])
Charts = WordCloud().add(series_name="Pyecharts", data_pair=result_dict, word_size_range=[6, 66]).set_global_opts(
title_opts=opts.TitleOpts(
title="Pyecharts", title_textstyle_opts=opts.TextStyleOpts(font_size=23)),
tooltip_opts=opts.TooltipOpts(is_show=True),
)
Charts.render("Pyecharts_Wordclound.html")
Pyecharts_wordArt(word_list)
需要注意的是界弧,Pyecharts 輸入的文本需要是列表類型凡蜻, 并且每隔詞語與他出現(xiàn)的頻率以數(shù)組形式存在,格式如下:
總結(jié)
在這三種詞云圖的基礎(chǔ)上垢箕,這里再推薦一個(gè)詞云在線制作網(wǎng)站划栓,WordArt.com, 最終的可視化效果要優(yōu)于上面三種条获,并且調(diào)整樣式也非常方便忠荞,簡單直觀,如果制作詞云圖數(shù)量不是很多的話帅掘,建議借助這個(gè)網(wǎng)站進(jìn)行繪制
要對(duì)這幾個(gè)工具做個(gè)比對(duì)的話委煤,從下面幾個(gè)角度我對(duì)它們做了個(gè)排序
可視化效果
WordArt > Stylecloud > WordCloud > Pyecharts
交互效果
WordArt > Pyecharts > StyleCloud = WordCloud
自動(dòng)化效率
Pyecharts = StyleCloud = WordCloud > WordArt
上手容易程度
WrodArt > StyleCloud > Pyecharts > WordCloud
至于最終選擇那個(gè)作為最終詞云繪制工具,需要結(jié)合自身情況及使用場景進(jìn)行選擇锄开,但無論哪一種工具素标,都要要提前簡單了解一下
好了,以上就是本篇文章的全部內(nèi)容了萍悴,最后感謝大家的閱讀头遭,我們下期見寓免!