1. 程式人生 > >Python 資料視覺化:WordCloud 詞雲的構建

Python 資料視覺化:WordCloud 詞雲的構建


WordCloud 官方文件:https://amueller.github.io/word_cloud/index.html
WordCloud GitHub 地址:https://github.com/amueller/word_cloud
Python非常重要的一個視覺化庫,wordcloud詞雲庫瞭解一下!:https://www.bilibili.com/video/av26266917
一個免費的生成詞雲(word cloud)的線上工具:https://segmentfault.com/a/1190000016827687
python詞雲 wordcloud 入門 :https://blog.csdn.net/tanzuozhev/article/details/50789226


Python第三方庫wordcloud(詞雲)快速入門與進階:https://blog.csdn.net/qq_34337272/article/details/79552929

 

詞雲視覺化:安裝模組 wordcloud: pip install wordcloud

 

  • 什麼是詞雲

詞雲又叫文字雲,是對文字資料中出現頻率較高的“關鍵詞”在視覺上的突出呈現,形成關鍵詞的渲染形成類似雲一樣的彩色圖片,從而一眼就可以領略文字資料的主要表達意思。

 

  • 準備工作:

python開發環境、wordcloud、jieba、matplotlib、numpy 、PIL 等庫檔案安裝好。

 

安裝完成以後 ( 命令列使用方式 )
        wordcloud_cli --text in.txt --imagefile out.png --mask in.png
        text 是詞雲來源,mask 是背景框架 ,imagefile 輸出的檔案
        wordcloud_cli --help 檢視所有支援的命令引數

 

wordcloud生成詞雲的原理簡介 

        wordcloud生成詞雲的原理其實並不複雜,大體分成5步(具體可自行檢視原始碼):

  • 1.wordcloud製作詞雲時,首先要對對文字資料進行分詞,使用process_text()方法,這一步的主要任務是去除停用詞 
  • 2.第二步是計算每個詞在文字中出現的頻率,生成一個雜湊表。詞頻用於確定一個詞的重要性 
  • 3.根據詞頻的數值按比例生成一個圖片的佈局,類IntegralOccupancyMap 是該詞雲的演算法所在,是詞雲的資料視覺化方式的核心。生成詞的顏色、位置、方向等 
  • 4.最後將詞按對應的詞頻在詞雲佈局圖上生成圖片,核心方法是generate_from_frequencies,不論是generate()還是generate_from_text()都最終用到generate_from_frequencies 
  • 完成詞雲上各詞的著色,預設是隨機著色 
  • 5.詞語的各種增強功能大都可以通過wordcloud的建構函式實現,裡面提供了22個引數,還可以自行擴充套件。

 

wordcloud.WordCloud  類 的 引數 說明

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9,mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None,background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True,colormap=None, normalize_plurals=True)

引數
    font_path : string         //字型路徑,需要展現什麼字型就把該字型路徑+字尾名寫上,如:font_path = '黑體.ttf’如果不指定字型中文字的顯示不出來
    width : int (default=400)  //輸出的畫布寬度,預設為400畫素
    height : int (default=200) //輸出的畫布高度,預設為200畫素
    prefer_horizontal : float (default=0.90) //詞語水平方向排版出現的頻率,預設 0.9 (所以詞語垂直方向排版出現頻率為 0.1 )
    mask : nd-array or None (default=None)   //如果引數為空,則使用二維遮罩繪製詞雲。如果 mask 非空,設定的寬高值將被忽略,遮罩形狀被 mask 取代。
    scale : float (default=1)       //按照比例進行放大畫布,如設定為1.5,則長和寬都是原來畫布的1.5倍。
    min_font_size : int (default=4) //顯示的最小的字型大小
    font_step : int (default=1)        //字型步長,如果步長大於1,會加快運算但是可能導致結果出現較大的誤差。
    max_words : number (default=200)   //要顯示的詞的最大個數
    stopwords : set of strings or None //設定需要遮蔽的詞,如果為空,則使用內建的STOPWORDS
    background_color : color value (default=”black”) //背景顏色,如background_color=‘white’,背景顏色為白色。
    max_font_size : int or None (default=None)       //顯示的最大的字型大小
    mode : string (default=”RGB”)                    //當引數為“RGBA”並且background_color不為空時,背景為透明。
    relative_scaling : float (default=.5)  //詞頻和字型大小的關聯性
    color_func : callable, default=None    //生成新顏色的函式,如果為空,則使用 self.color_func
    regexp : string or None (optional)     //使用正則表示式分隔輸入的文字
    collocations : bool, default=True      //是否包括兩個詞的搭配
    colormap : string or matplotlib colormap, default=”viridis” //給每個單詞隨機分配顏色,若指定color_func,則忽略該方法。

 

示例 :

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author      : 
# @File        : test.py
# @Software    : PyCharm
# @description : XXX


import jieba
from os import path
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS


def test_1():
    """
        不是用背景圖片
    :return:
    """
    f = open("e:/shijing_guanju.txt", "r")
    t = f.read()
    f.close()
    ls = jieba.lcut(t)

    txt = " ".join(ls)
    w = WordCloud(
        width=1000, height=700,
        background_color="white",
        # font_path="MSYH.ttc"  # 沒有設定字型可能出現,詞雲的結果均為方框。建議設定MSYH.ttc(微軟雅黑)
        font_path="simsun.ttc"  # 設定微軟雅黑報錯,這裡設定 宋體
    )
    w.generate(txt)
    w.to_file("e:/word_cloud_1.png")  # 在程式當前目錄,word_cloud_1.png


def test_2():
    """
        使用背景圖片
    :return:
    """
    mask = imread("e:/china_map.jpg")  # 設定背景圖片china_map.jpg
    excludes = {}
    f = open("e:/shijing_guanju.txt", "r")

    t = f.read()
    f.close()
    ls = jieba.lcut(t)
    txt = " ".join(ls)

    w = WordCloud(
        width=550, height=500,
        background_color="white",
        font_path="simsun.ttc",  # 沒有設定字型可能出現,詞雲的結果均為方框。建議設定MSYH.ttc(微軟雅黑)
        mask=mask
    )

    w.generate(txt)
    w.to_file("e:/word_cloud_2.png")  # 在程式當前目錄,word_cloud_1.png


def test_3():

    # 讀入背景圖片
    abel_mask = np.array(Image.open("/home/djh/PycharmProjects/source/test.jpg"))

    # 讀取要生成詞雲的檔案
    text_from_file_with_apath = open('/home/djh/PycharmProjects/source/a.txt').read()

    # 通過jieba分詞進行分詞並通過空格分隔
    word_list_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)
    wl_space_split = " ".join(word_list_after_jieba)
    # my_word_cloud = WordCloud().generate(wl_space_split) 預設建構函式
    my_word_cloud = WordCloud(
        background_color='white',   # 設定背景顏色
        mask=abel_mask,             # 設定背景圖片
        max_words=200,              # 設定最大現實的字數
        stopwords=STOPWORDS,        # 設定停用詞
        font_path='/home/djh/win_font/simkai.ttf',  # 設定字型格式,如不設定顯示不了中文
        max_font_size=50,      # 設定字型最大值
        random_state=30,       # 設定有多少種隨機生成狀態,即有多少種配色方案
        scale=.5
    ).generate(wl_space_split)

    # 根據圖片生成詞雲顏色
    image_colors = ImageColorGenerator(abel_mask)
    # my_word_cloud.recolor(color_func=image_colors)

    # 以下程式碼顯示圖片
    plt.imshow(my_word_cloud)
    plt.axis("off")
    plt.show()


def test_4():
    """
        簡易版
    :return:
    """
    f = open(u'txt/AliceEN.txt', 'r').read()
    wordcloud = WordCloud(background_color="white", width=1000, height=860, margin=2).generate(f)

    # width,height,margin可以設定圖片屬性
    # 你可以通過font_path引數來設定字型集
    # background_color引數為設定背景顏色,預設顏色為黑色

    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

    wordcloud.to_file('test.png')
    # 儲存圖片,但是在第三模組的例子中 圖片大小將會按照 mask 儲存


def test_5():
    """
        進階版
    :return:
    """
    d = path.dirname(__file__)

    # Read the whole text.
    text = open(path.join(d, 'alice.txt')).read()

    # read the mask / color image taken from
    # http://jirkavinse.deviantart.com/art/quot-Real-Life-quot-Alice-282261010
    alice_coloring = np.array(Image.open(path.join(d, "alice_color.png")))

    # 設定停用詞
    stopwords = set(STOPWORDS)
    stopwords.add("said")

    # 你可以通過 mask 引數 來設定詞雲形狀
    wc = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
                   stopwords=stopwords, max_font_size=40, random_state=42)
    # generate word cloud
    wc.generate(text)

    # create coloring from image
    image_colors = ImageColorGenerator(alice_coloring)

    # show
    # 在只設置mask的情況下,你將會得到一個擁有圖片形狀的詞雲
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.figure()
    # recolor wordcloud and show
    # we could also give color_func=image_colors directly in the constructor
    # 我們還可以直接在建構函式中直接給顏色
    # 通過這種方式詞雲將會按照給定的圖片顏色佈局生成字型顏色策略
    plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
    plt.axis("off")
    plt.figure()
    plt.imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
    plt.axis("off")
    plt.show()


if __name__ == '__main__':
    test_1()
    # test_2()
    # test_3()
    # test_4()
    # test_5()
    pass