wordcloudで単語の頻度を可視化
wordcloudってどういうものかは、画像検索でググればすぐわかります。あぁあれねと。
今回、単語の頻度を可視化したいというざっくり命題をいただきましたので、wordcloudを試してみました。(言った人はこれをイメージしてたかもしれない)
wordcloudでどの単語を描くかということは本筋の話ではないので、あえてテキトーにします。使いたい人はご自分のデータをなんとかしてください。そしてちょっと特殊なデータの持ち方。[単語, 出現頻度]をリストしたものとします。
words = [['あああ', 100], ['いいい', 80], ['ううう', 40], ['えええ', 10], ['おおお',2]]
これを含めて全ソースが下記。
%matplotlib inline
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import random
words = [['あああ', 100], ['いいい', 80], ['ううう', 40],
['えええ', 10], ['おおお',2]]
fpath = './fonts/IPAfont00303/ipagp.ttf'
def show_word_cloud(ws):
# 前処理
# 単語をスペースで区切った1文にする。
# 出現回数分、appendしている。
ws_show = []
for i in range(len(ws)):
word_times = ws[i][1]
if word_times>0:
for j in range(word_times):
ws_show.append(ws[i][0])
# 綺麗に整列してると、「あああ あああ」という単語と判断されるので、シャッフル
random.shuffle(ws_show)
# スペース区切りにする
texts = ' '.join(ws_show)
#print(texts)
# 描画
wc = WordCloud(background_color="white", font_path=fpath,
width=900, height=500, regexp=r"[\w']+").generate(texts)
plt.figure(figsize=(15,12))
plt.imshow(wc)
plt.axis('off')
plt.show()
show_word_cloud(words)
ポイント
①フォントファイルを用意
matplotlibで描くのでそのためのフォント
②前処理として単語を文章化
いろいろやって入力データのような形になっているわけですが、それを戻してスペース区切りにしてます。WordCloudがそういう受け方だから。
③WordCloudインスタンスを作って、generate(文章)
regexpは、デフォルトは1文字の単語をスキップするようになってるので、スキップしないでねという指示。英単語は、Iとかaとか、1文字のものは無意味だから、デフォルトでスキップしてるらしい。日本語は1文字でも意味のあるものが多い。特に漢字で。
④matplotlibで出力
そのまま。
結果(あんまりおもしろくないけど)
いつかまたコピペで使えそうです。