詞云繪制蛇尚,推薦三種 Python包外加一個(gè)在線網(wǎng)站芽唇!

詞云是文本可視化的重要方式,可將大段文本中的關(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ù)

效果如下:

square

<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ù)處理如下药蜻,背景用純白色像素填充

image-20210210103201422

自定義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()

可視化效果

wordclound

最后,這里提一下 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ù)詞 等信息

image-20210210110804316

詳情可參考官方文檔

https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html#wordcloud.WordCloud

StyleCloud

StyleCloud 是基于 WordCloud 開發(fā)的砌创,在 WordCloud 的基礎(chǔ)上又加入了一些新特性

image-20210210114111274
  • 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",# 圖片保存路徑
    )

效果如下:

styleclound

修改蒙版的話只需要更改 icon_name 參數(shù)即可,可參考 Font Awesome 網(wǎng)站朦佩,https://fontawesome.com/icons?d=gallery&m=free并思,里面幾千種圖案都可以使用

image-20210210115437929

icon_name名稱的設(shè)置為目標(biāo)圖標(biāo)的 class 標(biāo)簽即可,如下

image-20210210120030256

<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í)

styleclound1

當(dāng) icon_name ='fab fa-amazon' 時(shí):

styleclound11

關(guān)于詞云顏色調(diào)色板設(shè)定语稠,修改 palette 參數(shù)即可纺荧,palette 設(shè)定可參考 Palettable 網(wǎng)站:https://jiffyclub.github.io/palettable/ ,有多種調(diào)色樣式模板可供選擇

image-20210210120541712

其中上面每個(gè)模塊中又有許多子模塊颅筋,為最終需要設(shè)置的調(diào)色板

image-20210210121310786

設(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'

image-20210210121514012

paletabble ='lightbartlein.diverging.BlueDarkOrange12_11'

image-20210210121739080

關(guān)于 Stylecloud 其它參數(shù)用法先口,可參考官方文檔 https://github.com/minimaxir/stylecloud

Pyecharts

Pyecharts 是基于 Apache Echarts 開發(fā)的,主要用于數(shù)據(jù)可視化瞳收;詞云圖只是其中眾多圖表類型中的一個(gè)碉京,相對(duì)于前兩種詞云包,Pyecharts 的可視化效果要弱一些

但 Pyecharts 將詞云圖保存為單個(gè) html 文件螟深,最終呈現(xiàn)出來有一定的交互效果

word

代碼部分

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ù)組形式存在,格式如下:

image-20210210130357486

總結(jié)

在這三種詞云圖的基礎(chǔ)上垢箕,這里再推薦一個(gè)詞云在線制作網(wǎng)站划栓,WordArt.com, 最終的可視化效果要優(yōu)于上面三種条获,并且調(diào)整樣式也非常方便忠荞,簡單直觀,如果制作詞云圖數(shù)量不是很多的話帅掘,建議借助這個(gè)網(wǎng)站進(jìn)行繪制

image-20210210131002843

要對(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)容了萍悴,最后感謝大家的閱讀头遭,我們下期見寓免!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市计维,隨后出現(xiàn)的幾起案子袜香,更是在濱河造成了極大的恐慌,老刑警劉巖鲫惶,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈首,死亡現(xiàn)場離奇詭異,居然都是意外死亡欠母,警方通過查閱死者的電腦和手機(jī)欢策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏淌,“玉大人踩寇,你說我怎么就攤上這事×” “怎么了俺孙?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掷贾。 經(jīng)常有香客問我睛榄,道長,這世上最難降的妖魔是什么想帅? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任场靴,我火速辦了婚禮,結(jié)果婚禮上港准,老公的妹妹穿的比我還像新娘憎乙。我一直安慰自己,他們只是感情好叉趣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布泞边。 她就那樣靜靜地躺著,像睡著了一般疗杉。 火紅的嫁衣襯著肌膚如雪阵谚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天烟具,我揣著相機(jī)與錄音梢什,去河邊找鬼。 笑死朝聋,一個(gè)胖子當(dāng)著我的面吹牛嗡午,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冀痕,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荔睹,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼狸演!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僻他,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宵距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吨拗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體满哪,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年劝篷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哨鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娇妓,死狀恐怖兔跌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峡蟋,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布华望,位于F島的核電站蕊蝗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赖舟。R本人自食惡果不足惜蓬戚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宾抓。 院中可真熱鬧子漩,春花似錦、人聲如沸留量。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缕棵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涉兽,已是汗流浹背招驴。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枷畏,地道東北人别厘。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像拥诡,于是被迫代替她去往敵國和親触趴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氮发,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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