WordCloudで表現の幅を広げる【Python】

WordCloudで表現の幅を広げる【Python】 プログラミング

Pythonを使えば、簡単にWordCloudを作成できます。
そのための方法を次の記事でまとめています。

ただ、単純なWordCloudには特に魅力は感じないでしょう。
当たり前になり過ぎて、飽きられている感すらあります。

正直、私自身もWordCloudを見ると、「もう、ええちゅうねん」と感じていました。
しかし、次のようなWordCloudならどうでしょうか?

単純に文字が並んでいるWordCloudよりは、確実に目がいきますよね。
そして、トンボは「蜻蛉」と感じで書くのだと学べる可能性すらあり得ます。

この記事では、視覚的に差別化できるWordCloudを作成する方法を解説していきます。

本記事の内容

  • 差別化できるWordCloudの作り方
  • 透過PNG画像の用意
  • マスク画像の作成
  • マスク画像の適用
  • 完成画像の見た目を変更する

それでは、上記に沿って解説していきます。

差別化できるWordCloudの作り方

大前提として、冒頭で紹介した記事の内容は理解しておいてください。
そして、日本語でWordCloudを作成できる環境も用意しましょう。
WordCloudの日本語対応に関しては、次の記事で解説しています。

ここまでが条件として整っていれば、次へ進みましょう。
新たにやるべきことは、以下となります。

  • 透過PNG画像の用意
  • マスク画像の作成
  • マスク画像の適用

それぞれを以下で説明していきます。

透過PNG画像の用意

表示させたい形の画像を用意します。
その画像は、透過PNG画像であることを前提とします。

今回は、次の画像を用意しました。
Appleのロゴです。

別にこれを使う必要はありません。
みなさんで好きな透過PNG画像を用意してもOKです。

次にこの透過PNG画像をもとにマスク画像を作成していきます。

マスク画像の作成

ここで言うマスク画像とは、word_cloudライブラリに渡すmaskのことです。
maskの条件は、デフォルトで以下となります。

黒色文字を表示する範囲
白色文字を表示しない範囲

画像で確認しましょう。
以下の画像を見てください。

これは透過PNGファイルではありません。
背景は、白色です。

上記の画像が、maskとして必要になります。
このmask用画像を作成するには、OpenCVを利用します。

OpenCVのインストールに関しては、次の記事をご覧ください。

OpenCVを利用して、mask画像を作成するコードは以下。

import cv2

IMG_PATH = "base.png"

img = cv2.imread(IMG_PATH, -1)
a_img = img[:, :, 3]
result_img = cv2.bitwise_not(a_img)
cv2.imwrite('mask.png', result_img)

透過PNG画像が、base.pngとなります。
上記プログラムを実行するとmask.pngが作成されます。

上記コードを要点だけ説明します。
まず、透過PNG画像をimgとして読み込みます。

そのimgから、A(アルファチャネル)に関する要素だけ抽出します。
抽出した要素は、a_imgとして表現しています。
a_imgは、実際には以下の画像となります。

このa_imgはそのままでは、maskとして使えません。
冒頭のmaskの条件を見直してみてください。

白、黒がそれぞれ逆である必要がありました。
そこで、それぞれの色を反転させます。

そのために、cv2.bitwise_not関数で反転させています。
その関数を用いてa_imgの色を反転させた画像が、result_imとなります。

result_imgは、mask.pngとして保存します。
mask.pngが、この項の冒頭で挙げた画像となります。

maskに関しては、大丈夫ですね。
では、次にこのmask画像を適用します。

マスク画像の適用

適用自体は、とても簡単です。
WordCloud関数のパラメータで指定するだけです。

wc = WordCloud(font_path=FONT_PATH, max_font_size=40, mask=mask).generate(word_str)

実際に動くコードで確認しましょう。

from wordcloud import WordCloud

FONT_PATH = "C:\\data\\etc\\font\\ipaexg.ttf"
TXT_NAME = "apple"
IMG_PATH = "base.png"


def get_word_str(text):
    import MeCab
    import re

    mecab = MeCab.Tagger()
    parsed = mecab.parse(text)
    lines = parsed.split('\n')
    lines = lines[0:-2]
    word_list = []

    for line in lines:
        tmp = re.split('\t|,', line)

        # 名詞のみ対象
        if tmp[1] in ["名詞"]:
            # さらに絞り込み
            if tmp[2] in ["一般", "固有名詞"]:
                word_list.append(tmp[0])

    return " ".join(word_list)


def get_mask(img_path):
    import cv2

    img = cv2.imread(img_path, -1)
    a_img = img[:, :, 3]
    result_img = cv2.bitwise_not(a_img)

    return result_img


# テキストファイル読み込み
read_text = open(TXT_NAME + ".txt", encoding="utf8").read()

# 文字列取得
word_str = get_word_str(read_text)

# mask取得
mask = get_mask(IMG_PATH)

# 画像作成
wc = WordCloud(font_path=FONT_PATH, max_font_size=40, mask=mask).generate(word_str)

# 画像保存(テキストファイル名で)
wc.to_file("result_" + TXT_NAME + ".png")

新たに追加したコードのみ説明します。
それ以外のコードに関しては、上記で紹介した記事内で解説しています。
そちらを参考にしてください。

追加したのは、get_mask関数です。
この関数は、「マスク画像の作成」のところで載せたコードをまとめただけです。

そして、get_mask関数に用意した透過PNG画像のパスを指定しています。

# mask取得
mask = get_mask(IMG_PATH)

get_mask関数の戻り値が、maskとなります。
maskはそのまま、WordCloud関数のパラメータに設定しています。

プログラム的には、これだけの追加です。
上記プログラムを実行した結果は、次の画像となります。

以上、マスク画像の適用に関する説明でした。
最後に、出来上がる画像を見栄えのいいモノに変えてみましょう。

完成画像の見た目を変更する

word_cloudライブラリのWordCloud関数を利用します。
パラメータを追加・変更することで、完成画像の見た目を変更できます。

透過PNG画像として、完成画像を出力しています。

上記画像を作成する際のパラメータは、以下。

wc = WordCloud(font_path=FONT_PATH, max_font_size=100, mask=mask, max_words=1000, mode="RGBA", background_color=None, colormap="hsv").generate(word_str)

WordCloud関数のパラメータは、以下で確認できます。
http://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html#wordcloud.WordCloud

colormapに関しては、次のページを参考にできます。
colormapの値により、文字の色が決まります。
https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html

タイトルとURLをコピーしました