WordCloud
前回、WordCloudのオプションを色々試してみて、使い方を勉強してみました。

今回は前回「面白そうなので、今度試します」と言っていたmaskとそれに関する二つのオプション(contour_width、contour_color)を試していきます。
ただし前回のままでは試すことができないので、もう少し準備が必要です。
まず文字の量が全然足りないので、形態素解析ライブラリjanomeを勉強したときの記事全文(プログラム含む)をテキストファイルにしました。
ちなみにそのときの記事がこちら。

全文をテキストファイルにしたものがこちらです。
結構適当にコピーしているので、多少前回の記事と違うところがあっても気にしないでください。
そしてもう一つ必要なものが、画像ファイルです。
どう使うかは後でのお楽しみとして、とりあえずこんな画像を用意しました。

何か分かりますでしょうか?
実はこのウェブサイト「3PySci」のロゴの「Py」の部分です。

これで準備は完了です。
それでは始めていきましょう。
テキストファイルの読み込みと形態素解析
まずはテキストファイルを読み込み、形態素解析をしましょう。
先ほどの「data.txt」をプログラムと同じフォルダに配置します。
そしてjanomeの解説の際に覚えた「分かち書き」をこちらのプログラムで行います。
from janome.tokenizer import Tokenizer
with open("./data.txt", "r") as f:
data = f.read()
tk = Tokenizer(wakati=True)
tokens = tk.tokenize(data)
words = " ".join(list(tokens))
print(words)
前回と違うのはこちらのデータの読み込みの部分だけです。
with open("./data.txt", "r") as f:
data = f.read()
テキストファイルを読み込むのによくやるのは、for文を使って1行ずつ読み込むことですが、janomeには一度に渡してしまえるため、「data = f.read()」でテキストファイル全文をそのままdataに格納しています。
あとは前と同様にjanomeのtokenaizerで分かち書きに変換しています。
WordCloudのmaskを試す
それではWordCloudのmaskを試してみましょう。
プログラムとしてはこんな感じになります。
from wordcloud import WordCloud
from PIL import Image
import numpy as np
img = Image.open("./py_img.png")
mask_img = np.array(img)
wordcloud = WordCloud(mask=mask_img,font_path=r"/System/Library/Fonts/Hiragino Sans GB.ttc").generate(words)
wordcloud.to_file("./sample.png")
まず画像をPIL(Python Image Library)で読み込みます。
img = Image.open("./py_img.png")
PILに関しては前に解説していますので、良かったらこちらの記事をどうぞ。

そして読み込んだ画像ファイルをnumpyを使ってndarray形式に変換します。
mask_img = np.array(img)
そしてndarray形式にした画像データをmaskの引数に入れて、ワードクラウドを作成します。
wordcloud = WordCloud(mask=mask_img,font_path=r"/System/Library/Fonts/Hiragino Sans GB.ttc").generate(words)
wordcloud.to_file("./sample.png")
これで実行してみるとこんな画像が出力されます。

つまりmaskとは、読み込んだ画像の形に合わせてワードクラウドを作ってくれる機能なのです。
背景が黒ではちょっとパッとしないので、白にしてみました。
from wordcloud import WordCloud
from PIL import Image
import numpy as np
img = Image.open("./py_img.png")
mask_img = np.array(img)
wordcloud = WordCloud(mask=mask_img, background_color="white", font_path=r"/System/Library/Fonts/Hiragino Sans GB.ttc").generate(words)
wordcloud.to_file("./sample.png")
実行結果

やはり背景は白の方が映えますね。
contour_widthを試す
では次にcontour_widthを試してみましょう。
これはmaskと併せて使う機能なので、先ほどの背景を白にしたプログラムにcontour_widthを追加します。
from wordcloud import WordCloud
from PIL import Image
import numpy as np
img = Image.open("./py_img.png")
mask_img = np.array(img)
wordcloud = WordCloud(mask=mask_img, background_color="white", contour_width=5, font_path=r"/System/Library/Fonts/Hiragino Sans GB.ttc").generate(words)
wordcloud.to_file("./sample.png")
実行結果

枠線が表示されました。
ちなみにcontour_widthは数字(int)で指定しますが、その数字が枠線の太さを示しています。
contour_colorを試す
ここまで来れば、contour_colorは何か分かるかと思います。
そう、枠線の色です。
枠線を表示した先ほどのプログラムにcontour_colorを追加して枠線の色を変えてみましょう。
from wordcloud import WordCloud
from PIL import Image
import numpy as np
img = Image.open("./py_img.png")
mask_img = np.array(img)
wordcloud = WordCloud(mask=mask_img, background_color="white", contour_color="red", contour_width=2, font_path=r"/System/Library/Fonts/Hiragino Sans GB.ttc").generate(words)
wordcloud.to_file("./sample.png")
実行結果

枠線が赤に変わりました。
テキストの色とうまくマッチングさせれば、結構映えるワードクラウドになることでしょう。
問題はそのセンスが私には無いということで…
それにしてもjanomeもWordCloudも面白いライブラリなので、また色々と遊んでいきたいと思います。
ではでは今回はこんな感じで。
コメント