wordcloud的實現

NLP筆記 - Word Tokenization // wordcloud 詞雲圖教程


學習鏈接網站:

詞雲學習1
詞雲學習2
wordcloud參數說明
matlibplot用法鏈接
numpy用法
PIL圖像處理模塊用法
jieba 常見用法
讀文件出現的問題解決方法

程序結構

|- data //新建文件夾
     |- alice.txt //下載文件
     |- yxgltext.txt //下載文件
     |- stopwords.txt //下載文件
     |- SourceHanSerifK-Light.otf //下載文件
|- plot //新建文件夾
     |- alice_color.png //下載圖片
     |- queen.jpg //下載圖片
|- alice1.py //新建python文件
|- alice2.py //新建python文件
|- queen.py //新建python文件

程序要用的文件

鏈接:https://pan.baidu.com/s/16rBpSCK5lPrCrhUpQWsqAQ
提取碼:j7zr

詞雲圖

# -*- coding:utf-8 -*-
# author:chenqian time:2019/3/30

import os
os.chdir("C:/Users/Administrator.PC-20170407LSUI/Desktop/文本語義/NLP(Python)")  # 換成你的wordcloud文件夾所在路徑
from wordcloud import WordCloud

f = open('data/alice.txt').read()
wordcloud = WordCloud(background_color="white",width=1000, height=860, margin=2).generate(f)
# width,height,margin可以設置圖片屬性
# generate 可以對全部文本進行自動分詞,但是對中文支持不好
# wordcloud = WordCloud(font_path = r'D:\Fonts\simkai.ttf').generate(f)
# 你可以通過font_path參數來設置字體集
# background_color參數爲設置背景顏色,默認顏色爲黑色

import matplotlib.pyplot as plt
# ax = plt.imshow(wordcloud)
# # 創建Figure
# # fig = ax.figure
# # fig.set_size_inches(25,20)    # 可調節圖片緊密 尺寸程度
plt.imshow(wordcloud)
plt.axis("off")  # 關閉座標軸
plt.show()

wordcloud.to_file('plot/test.png')

有形狀的圖

# -*- coding:utf-8 -*-
# author:chenqian time:2019/3/30
import os
os.chdir("C:/Users/Administrator.PC-20170407LSUI/Desktop/文本語義/NLP(Python)")  # 換成你的wordcloud文件夾所在路徑
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# Read the whole text.
text = open('data/alice.txt').read()
alice_coloring = np.array(Image.open("plot/alice_color.png"))  # 可隨意更換圖片
stopwords = set(STOPWORDS)  # 使用內置的停用詞
# print(type(stopwords))  # set類型
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)

# 改變字體顏色,從照片中取色
image_colors = ImageColorGenerator(alice_coloring)


# 方式 1 -------------------------------------------------------------------
# show
# 
# fig, axes = plt.subplots(1, 3)
# axes[0].imshow(wc, interpolation="bilinear")
# axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# axes[2].imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
# 
# for ax in axes:
#    ax.set_axis_off()
#    fig = ax.figure
#    fig.set_size_inches(25,20)                  # 可調節圖片緊密 尺寸程度
# plt.show()


# 方式 2 -------------------------------------------------------------------
# show
# 在只設置mask的情況下,你將會得到一個擁有圖片形狀的詞雲,顏色並不是對應圖片的顏色
plt.axis("off")
# 將詞雲圖wc置入座標軸中,interpolation指插入
ax = plt.imshow(wc, interpolation="bilinear")
fig = ax.figure
fig.set_size_inches(25,20)  # 設置圖像大小
plt.figure()
# recolor wordcloud and show
# we could also give color_func=image_colors directly in the constructor
# 我們還可以直接在構造函數中直接給顏色
# 通過這種方式詞雲將會按照給定的圖片顏色佈局生成字體顏色策略
plt.axis("off")  # 取消座標軸

# 這一個對詞雲重新着色,對應的是照片原色
ax = plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
fig = ax.figure
fig.set_size_inches(25,20)                  # 可調節圖片緊密 尺寸程度
plt.figure()


plt.axis("off")
# 展示原照片
ax = plt.imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
fig = ax.figure
fig.set_size_inches(25,20)                  # 可調節圖片緊密 尺寸程度
plt.show()

中文詞雲圖

"""
@author:CQ
@software:PyCharm
@time:2019/4/1
"""
import os
os.chdir("C:/Users/Administrator.PC-20170407LSUI/Desktop/文本語義/NLP(Python)")  # 換成你的wordcloud文件夾所在路徑

import jieba.analyse  # 導入結巴分詞
import numpy as np  # numpy
from wordcloud import WordCloud, STOPWORDS  # 詞雲工具和自帶的的停用詞,英文
from PIL import Image  # 圖片處理
import matplotlib.pyplot as plt

'''
@:parameter
textfile:文本路徑及文件名
stopword:停用詞數組
savefile:圖片保存的路徑及文件名
'''
def handle(textfile, stopword,savefile):
    with open(textfile, 'r') as f:
        data = f.read()

    # print(type(data))
    # <class 'str'>
    wordlist = jieba.analyse.extract_tags(data, topK=100)  # 分詞,取前100
    # print(type(wordlist))
    # <class 'list'>
    wordStr = " ".join(wordlist)
    # print(wordStr)  # 類型爲字符串類型

    hand = np.array(Image.open('plot/queen.jpg'))  # 打開一張圖片,詞語以圖片形狀爲背景分佈

    my_cloudword = WordCloud(
        # wordcloud參數配置
        width=1024,f
        height=768,
        background_color='white',  # 背景顏色設置白色
        mask=hand,  # 背景圖片
        max_words=100,  # 最大顯示的字數
        stopwords=stopword,  # 停用詞
        max_font_size=100,  # 字體最大值
        font_path='data/SourceHanSerifK-Light.otf',  # 設置中文字體,若是有中文的話,這句代碼必須添加,不然會出現方框,不出現漢字
        random_state=3,  # 設置有多少種隨機生成狀態,即有多少種配色方案
    )

    my_cloudword.generate(wordStr)  # 生成圖片

    plt.axis('off')  # 是否顯示x軸、y軸下標
    ax = plt.imshow(my_cloudword)  # 顯示詞雲圖
    fig = ax.figure
    fig.set_size_inches(25, 20)  # 可調節圖片緊密 尺寸程度
    plt.show()  # 顯示
    my_cloudword.to_file(savefile)



stopwords = open('data/stopwords.txt',encoding='gb18030', errors='ignore').read()
# stopwords = open('data/stopwords.txt').read().decode('gb18030','ignore')
stopwords = set(stopwords.split('\n'))

handle('data/yxgl.txt', stopwords,'plot/chinesewordcloud.png')


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章