乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

ワードクラウド

今回はワードクラウドの時系列変化を
アニメーション化する事ができるライブラリ
AnimatedWordCloudのご紹介です。


解説動画はこちら


ワードクラウドとは
データから単語を抜き出し
画像化したもののことです。

こんな感じのものです
2

単語の頻出数が文字の大きさになります。


このワードクラウドをアニメーション化する
ライブラリ「AnimatedWordCloud」を
リリースした方がいました。

Github


早速試してみましょう。
Google Colabで試せるコードになっています。


ライブラリのインストール
!pip install AnimatedWordCloudTimelapse==0.9.5

コマンドでインストールできますが
たまに失敗することもある様です。

Colabのバックエンドが
一定ではないためかと思いますが
何度か再起動してインストールすれば
成功すると思います。



ライブラリの読み込み

ワードクラウドの作成に必要な
ライブラリを全部読み込みします。
from AnimatedWordCloud import animate, Config
config = Config(output_path="/content/")

import pandas as pd
from datetime import datetime as dt
from sklearn.feature_extraction.text import CountVectorizer
configではアウトプット先の設定を行えます。
ワードクラウドに使用するデータの作成は
Pandasデータフレームを用いると楽です。

単語のカウント用に CountVectorizer を用います。



サンプルデータの読み込み


ここからは製作者様のコードを
一部引用させていただいています。

githubに付属されていた
イーロンマスクのツイートデータ(2012 - 2018)
の読み込みです。
df = pd.read_table("https://raw.githubusercontent.com/konbraphat51/AnimatedWordCloudExampleElon/main/elonmusk_tweets.csv",sep=",")

df["created_at"] = pd.to_datetime(df["created_at"])
df.head()

結果が出ていれば読み込み成功です。



ワードクラウド作成用のデータ構造


このライブラリでアニメーションワードクラウドを
作成するには、データ構造を合わせないといけません

このデータは次の様なデータ構造になっています。


[
(数値(年度),
 {'ワード' : 数値(回数) , ・・・ }
) , ・・・
]


2つの要素を持ったタプルが複数格納されたリストで
リストの要素のタプルは
1.数値型の時系列
2.キー:ワード , 値:回数の辞書
という構造になっています。

ちょっと複雑な構造体ですので
形に合わせる集計が必要になっています。


データの加工

こちらも元のコードを参考にしたコードとなります。
dfs_by_year = []
for year in range(2012, 2018):
    df_year = df[dt(year, 1, 1) <= df["created_at"] ]
    df_year = df_year[dt(year+1, 1, 1) > df_year["created_at"]]
    dfs_by_year.append(df_year)
    print(df_year.shape)

stopwords = ["the", "co", "http", "to", "of", "and", "on", "for", "just", "that", "with", "by", "is", "in", "at", "will"]

min_df = 10
counter = CountVectorizer(stop_words=stopwords)
dicts_by_year = []

for cnt in range(len(dfs_by_year)):
    np_year = counter.fit_transform(dfs_by_year[cnt]["text"]).toarray()
    df_year = pd.DataFrame(np_year, columns=counter.get_feature_names_out())
    sr_sum = df_year.sum(axis=0).sort_values(ascending=False)
    sr_sum = sr_sum[sr_sum >= min_df]

    #to dictionary
    dict_year = sr_sum.to_dict()
    dicts_by_year.append(dict_year)

wordvector_timelapse = []
for cnt in range(len(dicts_by_year)):
    year = 2012 + cnt
    wordvector_timelapse.append((year, dicts_by_year[cnt]))


ワードクラウドの作成

変数 = animate(データ, config) でワードクラウドの作成
configで指定したパスに
output.gif が保存される仕組みです
result = animate(wordvector_timelapse, config)



イメージの再生


出来上がったら見てみましょう。
from IPython.display import display, Image

with open('/content/output.gif','rb') as f:
    display(Image(data=f.read(), format='png',width=600))

2


ワードクラウドがアニメーション表示されると思います。

ツイートのデータなどは
良くワードクラウドで表現される事が多いかと思いますが
それを時系列でアニメーション化させる
表現手法は作成するのに結構手間がかかると思います。

それを少しのコードだけで
作成する事ができるのは
めちゃくちゃ便利だと思います。


このライブラリを公開された方のような人が
今後沢山出てきていただけると嬉しいですね。

今回は
アニメーションワードクラウドを
作成出来る
AnimatedWordCloud
のご紹介でした。

それでは

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

解説動画はこちら


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

ワードクラウドが面白い


さて
今回は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.コードを実行する

こんな手順になります

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

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



ワードクラウドづくりにハマっております。

ワードクラウドは文章中で

出現頻度が高い単語を複数選び出し
その頻度に応じた大きさで図表化する手法のことで
文章の特徴を一目で見ることができると言うものです。


解説動画はこちら



Pythonでは
wordcloud
と言うライブラリがあるので
これを用いるとワードクラウドを簡単に作成できます。

インストール方法は

pip install wordcloud

これでライブラリがインストールされたら
必要なものとしては
文章をまとめたものが必要です。

スクレイピングや
形態素解析などして
集めて集計すればできます。

名詞や動詞など意味のあるものだけを残し
要らない助詞などは削ります。

単語と単語の間はスペースなどで
空けておきましょう。

ファイル化したら
ワードクラウドの作成です。

嵐の歌詞を集めて
ワードクラウドを作ってみましょう。

ワードクラウドは次のようなコードで作成できます。
from wordcloud import WordCloud
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

with open('arashi_list.txt', encoding='utf-8') as _f:
    text = _f.read()
font_path = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'
exc_words = ['たち','みる','そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる', 'なる', 'こと', 'もう', 'いい', 'ある', 'ゆく', 'れる']
wordcloud = WordCloud(background_color='white',
    font_path=font_path, width=800, height=600, stopwords=set(exc_words)).generate(text)
wordcloud.to_file('arashi.png')

im = Image.open('arashi.png')
plt.figure(figsize=(16,12))
plt.imshow(im)
plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.show()

ワードクラウドを作るには
フォントの指定が必要です。

日本語でやるには日本語対応のフォントが必要です。
上記の例はmacなので
/System/Library/Fonts/
フォルダを指定していますが
Windowsの人は

C:/Windows/Fonts/

配下になると思います。
.ttc拡張子のファイルを指定しましょう。

フォントをうまく指定できたら
画像ファイルができるので
それを表示してみると

download-2

はい出来ました。

僕らを筆頭に未来、明日、きっとなど
すごく明るい未来が感じられる世界観の歌詞だと
見受けられますねーーー

1曲も知らないけどwww

こんな感じですぐに作ることができるので
めちゃくちゃ楽しいです。

今度は
米津玄師さんの歌詞でやってみましょう!!!

こうなりました。
download-1

あなた、笑う が
中心の世界観です。

嵐と比べてみると
download

人称の違いや
言葉のチョイスが対照的で面白いですね

・嵐は自分中心
・米津さんは相手想い

そんな歌詞なんだろうと思いますね。
Lemonしか知らないけどwww

非常に面白いし、理解しやすいので
表現方法として優秀です。

皆さんも
作ってみてはいかがでしょうか?

それでは

このページのトップヘ