word_cloud 中文詞雲

weixin_33866037發表於2019-01-19

word_cloud 初體驗——製作 Adele 輪廓的詞雲圖中,我成功地實現了英文詞雲(採用了原圖色 mask 和按頻率比重)。這次利用 jieba 和 wordcloud,將冰心的散文詩用詞雲表示了出來。

3220531-98db43ac2bdbbe3b.jpg
WordCloud_Chinese

工具

我是在OS X上完成的進行的詞雲構建。為了完成這個實驗,需要用到以下幾個工具:

  • 用 Python 3 及其 IDE PyCharm 編寫原始碼
  • Anaconda 用來搭建環境
  • 一個摳圖軟體(我用的“搞定摳圖”)

原料

完成這次實驗還需要一些“原料”:

  • 從 Python wordcloud 庫 下載的 sample 程式碼
  • 網上找到 color 圖片和冰心的散文詩節選
  • 除了用到了 os PIL numpy matplotlib 等 Python 包,還用到了自然語義處理的 jieba

環境

因為之前說過了英文環境的配置,中文環境的配置基本一樣,只不過多了一個jieba 包。“結巴”是一個強大的分詞庫,完美支援中文分詞,分為三種模式:精確模式(預設)、全模式和搜尋引擎模式。

分詞包

⚠️ jieba 屬於第三方包,不能用 conda install直接下載,需要用一些特殊的方法。

需要首先尋找模組,找到合適的版本 condo-forge/jieba,然後安裝:

$ anaconda search -t conda jieba
$ anaconda show conda-forge/jieba
$ conda install --channel https://conda.anaconda.org/conda-forge jieba

找到我們剛才配置好的 WordCloud 環境,加入到 PyCharm。

Python 版本

當然你可能會遇到這個問題:匯入其他庫(如numpy,pandas),並跑了一些簡單的程式都一切正常,唯獨匯入matplotlib 庫的時候,不管怎樣也畫不了圖。

3220531-03dfe995437cc58f.jpg
NSInvalidArgumentException

有的解釋說這是因為 Python 的版本問題,由於我已經被 Mac 自帶的 Python 2 和 我下載的 Python 3 困擾多時, 我決定不理它了,直接採用最醜陋但很簡潔的辦法,加兩行程式碼在 import matplotlib.pyplot as plt 之前:

import matplotlib as mpl
mpl.use("TkAgg")

問題解決了,現在可以真正設計我們的詞雲圖了!

詞雲

接下來我們就可以設計自己的詞雲了!複製冰心散文詩到 text_ch.txt,並摳圖生成 heart.png 用作 mask。

3220531-4e7643400ba67b66.jpg
Mask

問題一:漢化字型

一開始出現了問題,發現識別不了漢字——出現了一堆框框

3220531-d030cde0d8b888f1.jpg
Font Disabled

這時候需要從網上下載一些漢化字型格式(比如simhei.ttf),然後在我們的程式碼中加入:

# the font from github: https://github.com/adobe-fonts
font = '/資源庫/Fonts/Simhei.ttf'
wc = WordCloud(font_path=font).generate(cut_text)

這樣就可以用漢化字型了!

問題二:句雲→詞雲

但是還有一個問題就是一開始生成的詞雲是句子,因為沒有用到“結巴”分詞包。

3220531-77abd601a6cded0d.jpg
SentensesCloud

得到“句子云”的原因有2個:

  • 沒有使用 jieba.cut() 進行分詞,txt 被直接用於 WordCloud.generate()
  • 使用了 jieba.cut() 但是沒有用特殊符號使得分好詞的句子又變成了原始 txt 格式,這時WordCloud.generate() 只能按標點符號得到“句子云”

進行如下的分詞操作處理:

# 分詞
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
text = open(path.join(d, 'text_ch.txt')).read()
cut_text = ' '.join(jieba.cut(text))
j_text = jieba.cut(text)
cut1_text = ''.join(jieba.cut(text))

# 用分詞做詞雲 cut_text
wc = WordCloud(background_color="white", font_path=font).generate(cut_text)

成果

通過執行下面這段程式碼,可以發現做出了完美的中文詞雲:

# -*- coding: utf-8 -*-
from os import path
import jieba
from wordcloud import WordCloud
import matplotlib as mpl
import numpy as np
from PIL import Image
mpl.use("TkAgg")
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# 分詞
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
text = open(path.join(d, 'text_ch.txt')).read()
cut_text = ' '.join(jieba.cut(text))
j_text = jieba.cut(text)
cut1_text = ''.join(jieba.cut(text))

# the font from github: https://github.com/adobe-fonts
font = '/資源庫/Fonts/Simhei.ttf'
Heart_coloring = np.array(Image.open(path.join(d, "heart.png")))
stopwords = set(STOPWORDS)
stopwords.add("said")
# 用分詞做詞雲
wc = WordCloud(background_color="white", collocations=False, font_path=font, width=4400, height=4400, margin=2, mask=Heart_coloring,
                                    max_font_size=120, min_font_size=20).generate(cut_text)
image_colors = ImageColorGenerator(Heart_coloring)
plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
#plt.imshow(wc)
plt.axis("off")
plt.show()

# 把詞雲儲存下來
wc.to_file('show_Chinese.png')  

最終的詞雲效果如圖所示:

3220531-98db43ac2bdbbe3b.jpg
WordCloud_Chinese

美麗的詞雲就這樣做好了!?

更多工具

值得一提的是,WordArt 這款工具也有詞雲的處理功能。和python的wordcloud相比,這款處理軟體的優點在於:可以對個別詞調整字型和顏色;有更美觀的處理效果;也具有漢化字型的處理。但是,下載高清版是要收費的,而且價格不菲。逢19年春節之際,我用這個軟體處理的詞雲給大家拜個早年!

3220531-82e1d9d9fc24649a.jpg
image

相關文章