今回はクリエイティブ力を高めるために
シルエット画像でワードクラウドを
作ってみたいと思います 

解説動画はこちら


ワードクラウドについては過去に
こちらの記事でも行っていますので
気になる方は見てみてください

ワードクラウドが面白い


さて
今回はGoogle Colab上で実行できるコードにしていますので
試したい方はうまくコピペして実行してみてください。

最初に用意するものとして
・ワードクラウド用のテキスト
(単語 単語 ・・・ のように単語と単語の間を
スペースで分けた文章ファイル)
・マスクに使用する画像
(グレースケール,アルファなしPNG)

この二つが必要です

ワードクラウドのサンプルを通して
やり方を見ていきましょう。

ワードクラウドのサンプル


アリスのサンプルを実行してみたいと思います

マスク画像を入手するには次のコードを実行してください
!wget https://raw.githubusercontent.com/amueller/word_cloud/master/examples/alice_mask.png

次にテキストファイルの入手は次のコードを実行してください
# アリスのテキストを入手
import requests
from bs4 import BeautifulSoup
url = 'https://github.com/amueller/word_cloud/blob/master/examples/alice.txt'
res = requests.get(url)
soup = BeautifulSoup(res.content,'lxml')
texts = soup.find('table').text
file_name = 'alice.txt'
with open(file_name,'w') as file:
  file.write(texts)

これでテキストとマスク画像が
Colabのファイル置き場に配置されたと思います

ここからはワードクラウドを作る
サンプルコードを実行してみましょう

最初はライブラリの読み込みからです
# ライブラリの読み込み
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
from wordcloud import WordCloud, STOPWORDS

次にファイルの読み込みです
# テキストとマスク画像の読み込み
text = open('alice.txt').read()
mask = np.array(Image.open("alice_mask.png"))

読み込んだマスク画像をみてみましょう。
# マスク画像の表示
plt.imshow(mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()
alice_mask
このような画像ですね
これを使ってワードクラウドにしていきます

ここからはワードクラウドの設定を行うコードです
# 不要ワードの設定
stopwords = set(STOPWORDS)
stopwords.add("said")

# ワードクラウドの読み込み
wc = WordCloud(background_color="white", max_words=2000, mask=mask,
              stopwords=stopwords, contour_width=3, contour_color='steelblue')

除外ワードやマスク画像を引数で指定します

ワードクラウドの作成は次のコードで行う事ができます

# テキストをワードクラウド化
wc.generate(text)

# ファイル保存
wc.to_file("alice.png")
これでワードクラウドが出来たので見てみましょう
# show
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()
alice

不思議の国のアリスの画像に沿うように
単語が配置されます。

なかなか芸術的ですよね

次は日本語で行ってみましょう。
日本語で行うには少しコツが必要です

日本語に対応する場合は
・日本語のフォントのインストール
・Janomeライブラリのインストール
こちらが必要になります。


今回は日本語の文章として
青空文庫の「我輩は猫である」を
引用してみたいと思います


吾輩は猫であるを入手
# 吾輩は猫であるを入手
import requests
from bs4 import BeautifulSoup
url = 'https://www.aozora.gr.jp/cards/000148/files/789_14547.html'
res = requests.get(url)
soup = BeautifulSoup(res.content,'lxml')
texts = soup.find('div',class_='main_text').text
file_name = 'wagahaihaneko.txt'
with open(file_name,'w') as file:
  file.write(texts)
このコードを実行してもらうと
文章ファイルが手に入ると思います

次にこの文章を分かち書きしないと
日本語のワードクラウドに出来ないので
分かち書き用のライブラリである
「janome」をインストールします

Janomeのインストール
pip install janome

GoogleColabは日本語に対応していないので
日本語で表示させるには日本語フォントは必要です

次のコードを実行してインストールしましょう

日本語フォントのインストール
# 「IPA」フォントをインストール
!apt-get -y install fonts-ipafont-gothic
# matplotlibのキャッシュをクリア
!rm /root/.cache/matplotlib/fontlist-v300.json
日本語がうまく出ない場合はここで
「ランタイムを再起動」を 行ってから
以下を実行してみましょう


日本語でのワードクラウド作成
# ライブラリの読み込み
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os
from wordcloud import WordCloud, STOPWORDS
from janome.tokenizer import Tokenizer

分かち書きをするコードです
# Janomeの呼び出し
t = Tokenizer()
s = open('wagahaihaneko.txt').read()

# 文章を分かち書きして名詞だけ抜き出す
wakati_text = [token.surface for token in t.tokenize(s) if token.part_of_speech.startswith('名詞')]

# 名詞をひとまとめにする
wakati = " ".join(map(str, wakati_text))

# マスク画像の読み込み
mask = np.array(Image.open("alice_mask.png"))

これで分かち書きされた文章データになりました。
ワードクラウドを作ってみましょう。
引数には日本語フォントのパスの指定が追加になっています。

# 日本語フォントの指定
font_path = '/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf'
# ワードクラウドの読み込み
wc = WordCloud(background_color="white", max_words=2000, mask=mask,
              contour_width=3, contour_color='steelblue', font_path=font_path)

# テキストをワードクラウド化
wc.generate(wakati)

# ファイル保存
wc.to_file("waganeko.png")

# show
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()
waganeko


せっかくなので
サンプル画像ではなく猫の画像で試してみましょう。

何かしらのグレースケールの猫画像をご用意ください
それをColabのファイル置き場に置いて実行すると

# マスク画像の読み込み
mask = np.array(Image.open("neko.png"))

# 日本語フォントの指定
font_path = '/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf'
# ワードクラウドの読み込み
wc = WordCloud(background_color="white", max_words=200, mask=mask,
              contour_width=3, contour_color='steelblue', font_path=font_path)

# テキストをワードクラウド化
wc.generate(wakati)

# ファイル保存
wc.to_file("neko_result.png")

# show
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()
neko_result

こんな感じで猫の形にワードクラウドが作られます
なかなか面白いですよね!!!

まとめですが
ワードクラウドの作り方は
1.ワードクラウド用のテキストを用意する
2.マスク画像を用意する
3.日本語で行う場合は日本語フォントをインストールする
4.コードを実行する

こんな手順になります

画像をうまく活用すると
すごく芸術的な表現になるんじゃないかなーと
思ってみたり

気になる方は試してみてください
それでは