Pythonと本と子供と雑談と

いつからはじめても遅くない

WordCloudによる可視化

Wordcloudをしっかり使ったことがなかったのですが、少し使うと面白かったのでまとめておきます。

今回の記事は次の記事を参考にさせていただきました。ありがとうございます。 perfumeは確かにキミってよく使ってるなぁwww

qiita.com

wordcloudとは?

f:id:mazarimono:20200220092351p:plain

ちょっと気になる文章を渡すと、上の画像のようによく使われている言葉を大きく表示してくれる、ちょっと前によく見たやつです。よく使われている言葉=伝えたいことみたいな感じでしょうか?

WordcloudをPythonで使えるようにするライブラリもあります。

amueller.github.io

pip install wordcloud

今回はもちろんこれを用います。

nagisa + Wordcloud

日本語でWordcloudを用いる場合、文章を分かち書きする必要があります。

その際に用いたのがnagisaです。

github.com

nagisa.readthedocs.io

去年のPyCon JPのnagisaの作者の方のトークは人気1位でしたね。私もビデオで見たのですが、これすごいなぁと思ってたので、今回初めて使ってみました。

ライブラリのインポートは以下の通り。

import nagisa
from wordcloud import WordCloud
import PIL
import numpy as np
import matplotlib.pyplot as plt 

使う品詞を指定して分かち書きするとかだと次のように簡単でした。

text = open("test.txt").read()
text = text.decode("utf-8")
tags = ["名詞","動詞", "形容詞", "形容動詞"]
hou_list = nagisa.extract(hou_text, extract_postags=tags).words

これで欲しい品詞の単語が分かち書きされ、リストに格納されます。

Wordcloudには、文字列で文章を渡すのでリストの分かち書きを、単語ごとにスペースを入れた文字列を作成します。

b = " ".join(hou_list)

次に、wordcloudを作ります。その際に用いるのがwordcloudパッケージのWordCloudクラスです。文字列は、generateメソッドの引数 font_pathが第1引数となるので渡します。

wordcloud = WordCloud().generate(b)

最初に表示した日本地図のWordcloudは元となる画像を読み込んで(PIL.Image.open()で読み込み、numpyのアレーにする)、WordCloudクラスの引数maskに渡します。

image = np.array(PIL.Image.open("test.png"))
wordcloud = WordCloud(mask=image).generate(b)

おっと、あと重要なのが日本語の可視化の場合、フォントを渡すという作業です。フォントを渡さないと下のように豆腐なWordcloudが表示されて、えええええと一気にテンションが下がります。 fontへのpathをWordCloudクラスのfont_path属性に渡します。

f:id:mazarimono:20200220095542p:plain
みんな大好き豆腐

fpath = <path-to-font>
# windowsのローカルで試す場合は下で行ける
fpath = 'C:/Windows/Fonts/YuGothM.ttc'
wordcloud = WordCloud(font_path=fpath. mask=image).generate(b)

最後に作成したものをmaplotlibを使って可視化します。imshow関数のinterpolation属性は設定していないと、ちょっと文字がかすれたりするので入れておいた方が良いようです。

plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")  # 軸の表示をオフに
plt.show()

f:id:mazarimono:20200220100541p:plain
ちょいかすれる

まとめ

以上のような感じで今回は、訪日外国人のデータのレポート部分の各国のコメントを可視化しました。コロナの影響は1月後半から出たので、怖いのは2月です。WordCloudは誇らしげです。来月も対比のために作りたいと思います。

www.jnto.go.jp

あと、実はやりたかったのはPlotlyを用いたWordCloudの作成です。理由はDashに載せたいので。というわけで、次回はこのWordCloudをPlotlyで表示します。