最近、真面目にワードクラウドを作る機会がありましたので、久々に以前紹介したwordcloudライブラリを使いました。(並行してTableauでも作りました。)
前回紹介した記事では本当にざっくりとしか紹介していなかったのですが、今回そこそこ見た目を整える必要がありましたので、
細かいオプションの挙動を調べました。その内容をメモしておきます。
参考: Pythonでワードクラウドを作成する
なお、公式のドキュメントはこちらにあるので、英語に抵抗がなければそちらを読む方がおすすめです。サンプルも綺麗ですよ。
ドキュメント: wordcloud
今回は日本語のテキストを使います。
ライブドアニュースのコーパスから長いのを1つ選んで、形態素解析して準備しておきました。
データは一つの文字列形式で、半角スペースで区切ってあります。
# データ型や長さの確認
print(type(tokenized_text))
#
print(len(tokenized_text))
# 8704
print(len(tokenized_text.split()))
# 2227
# 先頭 70文字
print(tokenized_text[: 70])
# bluetooth bluetooth デジタル 機器 同士 接続 無線 規格 bluetooth 聞く 難しい 思う 今 ケーブル 繋げる
さて、wordcloudの使い方の復習です。
ライブラリをインポートして、 WordCloudのインスタンスを作り、
generate_from_text メソッドか、 そのエイリアスである generate メソッドでワードクラウドが作れます。
デフォルト設定でやってみましょう。
from wordcloud import WordCloud
wc = WordCloud()
wc.generate_from_text(tokenized_text)
wc.to_image()
はい、日本語が見えないですね。
これ以外にも例によって一文字の単語は含まれないとか、いろいろ難点はあります。
これらは、 WordCloudのインスタンスを作るときに、各種設定を渡すことで改善します。一覧はドキュメントにあるので、僕が使うものだけ紹介します。
– font_path: フォントファイル(ttfファイルなど)のファイルパスを指定する。 fontfamilyではないので注意。
– width: 横幅
– height: 高さ
– prefer_horizontal: 横書きで配置することを試みる確率。 (デフォルト0.9) これを1にすると横書きに統一できる。
– background_color: 背景色(デフォルト ‘black’)。とりあえず’white’にすることが多い。
– include_numbers: 数値だけの単語も含むか。デフォルトがFalse
– colormap: 文字色のカラーマップ指定
– regexp: generate_from_text するときの単語区切りに使う正規表現。Noneの場合、r”\w[\w’]+” が使われるので、一文字の単語が消える。
とりあえず、これらをいい感じに設定して出してみましょう。
wc = WordCloud(
font_path="/Library/Fonts/ipaexg.ttf", # 日本語フォントファイル
width=600, # 幅
height=400, # 高さ
prefer_horizontal=1, # 横書きで配置することを試す確率 (デフォルト0.9)
background_color='white', # 背景色
include_numbers=True, # 数値だけの単語も含む
colormap='tab20', # 文字色のカラーマップ指定
regexp=r"[\w']+", # 一文字の単語も含む
).generate(tokenized_text)
wc.to_image()
圧倒的に良くなりましたね。
このほか、実用的には使う場面が思いつかないのですが、画像データ(要するに2次元の配列)でマスクをかけることができます。
0〜255の整数値(floatだとwarningが出ますが動きます。)が入った配列を渡すと、
「値が255の部分」がマスキングされ文字が入らなくなります。最初0の方がマスクされると思ってたのですが逆でした。
本来は画像データを読み込んでやることを想定されているようですが、配列を作ればなんでもいいので、とりあえず円形のデータを使って試します。
import numpy as np
mask_ary = np.zeros(shape=(400, 400))
for i in range(400):
for j in range(400):
if (i-200)**2 + (j-200)**2 > 180**2:
mask_ary[i, j] = 255
# 整数型に変換
mask_ary = mask_ary.astype(int)
wc = WordCloud(
font_path="/Library/Fonts/ipaexg.ttf",
mask=mask_ary,
contour_width=1, # マスク領域の枠線の太さ
contour_color='green', # マスク両機の枠線の色
prefer_horizontal=1, # 横書きで配置することを試す確率 (デフォルト0.9)
background_color='white', # 背景色
include_numbers=True, # 数値だけの単語も含む
colormap='tab20', # 文字色のカラーマップ指定
regexp=r"[\w']+", # 一文字の単語も含む
).generate(tokenized_text)
wc.to_image()
少しおしゃれになりました。