Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

データ分析の秘密兵器: WordCloudの活用法


LinuCエヴァンジェリスト・Open Source Summit Japan 2022ボランティアリーダー鯨井貴博@opensourcetechです。


はじめに
今回はWordCloudを使って、データ分析(長文における単語頻出度合い)してみます。

WordCloudとは
WordCloudは、文章に含まれる単語の頻出度合い可視化してくれるPythonのライブラリです。
https://amueller.github.io/word_cloud/
答えを予め出しておくと、こんな感じになります。



前提条件
作業の前提ですが、今回はUbuntu 22.04.2 LTS上でPython3が実行できる環境がある、かつ関連するライブラリ(pip・Janome・matplotlib・pandas・requests・wordcloudなど)がインストールされているものとします。

ubuntu@ubuntuserver:~/python_test$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

ubuntu@ubuntuserver:~/python_test$ python3 --version
Python 3.10.6

ubuntu@ubuntuserver:~/python_test$ pip3 list
Package                Version
---------------------- -------------
attrs                  21.2.0
Babel                  2.8.0
blinker                1.6.2
certifi                2020.6.20
chardet                4.0.0
click                  8.1.3
cloud-init             23.1.2
colorama               0.4.4
command-not-found      0.3
configobj              5.0.6
contourpy              1.0.7
cryptography           3.4.8
cycler                 0.11.0
dbus-python            1.2.18
distro                 1.7.0
distro-info            1.1build1
Flask                  2.3.2
fonttools              4.39.4
httplib2               0.20.2
idna                   3.3
importlib-metadata     4.6.4
itsdangerous           2.1.2
Janome                 0.4.2
jeepney                0.7.1
Jinja2                 3.1.2
jsonpatch              1.32
jsonpointer            2.0
jsonschema             3.2.0
keyring                23.5.0
kiwisolver             1.4.4
launchpadlib           1.10.16
lazr.restfulclient     0.14.4
lazr.uri               1.0.6
MarkupSafe             2.1.2
matplotlib             3.7.1
mecab-python3          1.0.6
more-itertools         8.10.0
netifaces              0.11.0
numpy                  1.24.3
oauthlib               3.2.0
packaging              23.1
pandas                 2.0.1
Pillow                 9.5.0
pip                    22.0.2
PyGObject              3.42.1
PyJWT                  2.3.0
pyparsing              2.4.7
pyrsistent             0.18.1
pyserial               3.5
python-apt             2.4.0+ubuntu1
python-dateutil        2.8.2
pytz                   2022.1
PyYAML                 5.4.1
requests               2.25.1
SecretStorage          3.3.1
setuptools             59.6.0
six                    1.16.0
ssh-import-id          5.11
systemd-python         234
tzdata                 2023.3
ubuntu-advantage-tools 8001
ubuntu-drivers-common  0.0.0
ufw                    0.36.1
unattended-upgrades    0.1
unidic-lite            1.0.8
urllib3                1.26.5
wadllib                1.3.6
Werkzeug               2.3.4
wheel                  0.37.1
wordcloud              1.9.2
xkit                   0.0.0
zipp                   1.0.0


環境がない方は、公式ドキュメントなどを参照に用意をしましょう。
https://www.python.org/downloads/
https://docs.python.org/ja/3/installing/index.html


WordCloud作成の流れ
以下のような順で進めていきますが、
重要なのは最終段階でWordCloudに渡すデータがどれだけ精査され良質なものになっているかがポイントになります。
①文章データの収集
②収集した文章データを単語に区切る
③単語データのソート
④単語データの精査や加工
⑤WordCloudで可視化
⑥データ集計


①文章データの収集
解析対象の文章データとして、社内にある様々なファイルなどの情報から対象とする文章をテキストファイルなどに収集します。 今回はサンプルとして、青空文庫から著作権の消滅した福沢諭吉の学問のすすめを使わせてもらいました。
https://www.aozora.gr.jp/cards/000296/files/47061_29420.html

ubuntu@ubuntuserver:~/python_test$ ls -l gakumonnosusume.txt
-rw-rw-r-- 1 ubuntu ubuntu 262026 Jun  1 08:39 gakumonnosusume.txt  

ubuntu@ubuntuserver:~/python_test$ cat gakumonnosusume.txt
「天は人の上に人を造らず人の下に人を造らず」と言えり。されば天より人を生ずるには、万人は万人みな同じ位
にして、生まれながら貴賤上下の差別なく、万物の霊たる身と心との働きをもって天地の間にあるよろずの物を資
り、もって衣食住の用を達し、自由自在、互いに人の妨げをなさずしておのおの安楽にこの世を渡らしめ給うの趣
意なり。
.
.
.
省略



②収集した文章データを単語に区切る
続いて、収集した文章データを単語に区切りますが、
ここではjanomeというPythonライブラリを使って形態素解析を行います。
形態素解析は、以下のような処理になります。

天      テン    テン    天      名詞-普通名詞-一般                      1
は      ワ      ハ      は      助詞-係助詞              
人      ヒト    ヒト    人      名詞-普通名詞-一般                      0
の      ノ      ノ      の      助詞-格助詞              
上      ウエ    ウエ    上      名詞-普通名詞-副詞可能                  0,2
に      ニ      ニ      に      助詞-格助詞              
人      ヒト    ヒト    人      名詞-普通名詞-一般                      0
を      オ      ヲ      を      助詞-格助詞              
造ら    ツクラ  ツクル  作る    動詞-一般       五段-ラ行       未然形-一般     2
ず      ズ      ズ      ず      助動詞  助動詞-ヌ       連用形-一般 
人      ヒト    ヒト    人      名詞-普通名詞-一般                      0
の      ノ      ノ      の      助詞-格助詞              
下      シタ    シタ    下      名詞-普通名詞-一般                      0
に      ニ      ニ      に      助詞-格助詞              
人      ヒト    ヒト    人      名詞-普通名詞-一般                      0
を      オ      ヲ      を      助詞-格助詞              
造ら    ツクラ  ツクル  作る    動詞-一般       五段-ラ行       未然形-一般     2
ず      ズ      ズ      ず      助動詞  助動詞-ヌ       終止形-一般


今回処理したものは、以下のようになります。

「
天
は
人
の
上
に
人
を
造ら
ず
人
の
下
に
人
を
造ら
ず
」
.
.
.
省略


使ったPythonプログラムは以下にあり、python3 処理前のファイル名 処理後のファイル名と実行すればOKです。
https://github.com/kujiraitakahiro/python/blob/master/janome_kugiri.py


③単語データのソート
続いて、単語のソート。
次工程(④単語データの精査や加工)に向けてデータを見やすくします。

以下を使いました。
単語をソートするPythonプログラム
https://github.com/kujiraitakahiro/python/blob/master/text_sort.py

単語に含まれるスペース(半角・全角)を削除するPythonプログラム ※必要に応じて使ってください
https://github.com/kujiraitakahiro/python/blob/master/remove_spaces2.py


④単語データの精査や加工
前工程(③単語データのソート)で作成した単語データから、求めたい可視化で不要となるもの(例:句読点・記号・単体で意味を持たない助詞や副詞など)を削除や英単語の大文字・小文字(Linux/LINUX/linux)や全角・半角の統一、表記のゆれの調整(ファイア/ファイヤー)などを行います。

単語データを確認しながら不要なものを見つけては削除作業を繰り返しますが、
不要なもののパターンを見つけgrepなどのテキスト加工ツールを使った方が時間がかからないと思います。


⑤WordCloudで可視化
良質な単語データに加工できたら、いよいよWordCloudで可視化します。
https://github.com/kujiraitakahiro/python/blob/master/kashika_wordcloud.py

解像度(DPI350)バージョン
※A3程度の印刷に耐えれる画像
https://github.com/kujiraitakahiro/python/blob/master/kashika_wordcloud_dpi350.py

使用するフォントを変更する場合、以下を参考にフォントファイルを変更すればOKです。
https://www.opensourcetech.tokyo/entry/20230607/1686144210

よく出てくる単語ほど大きな文字で表示されるので、
ざっくりですが、「人(国民)が学ぶことの重要性、学習がこれからの国や政府の形成につながること、日本が海外(西洋)に対向するために何をするべきか」などを読み取ることが出来ます。
※このような解釈は、人が行う必要があります。


学問ノススメの要約 by ChatGPT

福沢諭吉の「学問のすすめ」は、日本の明治時代初期に書かれた重要な著作で、西洋の学問とその重要性を日本人に紹介するためのものです。福沢諭吉は、自己啓発と自己向上を通じて個人の地位を向上させるためには、学問、特に西洋の学問が必要であると主張しました。

彼はまた、人間は自然と社会を理解し、それらを変革するための能力を持っていると主張しました。この能力を「独立心」と呼び、それが本物の自由を生み出すと述べました。彼にとって、学問は独立心を育むための重要な道具でした。

さらに、彼は学問が社会全体の進歩にも寄与すると主張しました。教育が普及すれば、それが新しい思考と新しい技術を生み出し、それによって国家が成長し、社会が発展すると述べています。

これらの主張は、明治時代の日本が西洋の科学技術と近代的な組織を導入しようとしていた時期に書かれました。福沢諭吉自身が西洋の学問を深く学び、その価値を理解していたため、彼の「学問のすすめ」は、日本の近代化と西洋化の推進力の一つとなりました。



参考までに、加工前データをWordCloudで可視化したものは以下のようになります。
助詞などがピックアップされて本来確認したい単語が埋もれてしまっています。



⑥データ集計
最後ですが、それぞれの単語の出現回数の集計です。
可視化して直感的には分かったけど、実際の数字としてはどれくらいなのか確認するためです。
https://github.com/kujiraitakahiro/python/blob/master/word_count_sort.py

人: 520
者: 329
政府: 264
国: 171
言う: 159
人民: 143
今: 129
事: 110
独立: 96
得: 92
法: 87
働き: 85
身: 82
心: 81
理: 78
学問: 75
有様: 75
世: 73
文明: 72
力: 71
人間: 70
日本: 65
学者: 64
知ら: 63
他人: 62
百: 58
見: 57
言い: 55
今日: 53
権: 52
西洋: 52
必ず: 51
私: 51
至り: 49
世間: 47
交際: 47
家: 47
名: 46
大: 46
.
.
.
省略



おわりに
今回WordCloudによるテキストデータの可視化をやってみましたが、
・元となるデータとしてどれを使うか
・可視化前にどれだけデータ加工するか
・可視化した後にそこから何を読み取るか
など考慮するべきポイントがあるなと感じました。

確認のため、紀貫之の土佐日記も同手順で分析してみましたが、
当時の左遷時の心情をなんとなく感じることが出来ます。


土佐日記の要約 by ChatGPT

「土佐日記」は、平安時代の日本の詩人であり宮廷人の紀貫之によって書かれた旅行日記です。貫之は、949年に従五位下から左少弾正(左馬寮の職員)へと降格され、遠く離れた土佐国(現在の高知県)へと左遷されました。この出来事は、彼が都を離れて旅立つきっかけとなりました。

「土佐日記」は、その旅の記録です。特に有名なのは、貫之が船で都を出発した日(949年12月22日)のエントリーです。貫之は都からの出発を深く悲しみ、船から都を見つめる自分の姿を詩的に描写しています。

この日記は、主に和歌を中心に詠まれ、その中に貫之の感情や考えが織り交ぜられています。また、紀貫之が出会った人々や見た風景、経験した出来事を描き出しています。そのため、「土佐日記」は、平安時代の旅行や人々の生活、風俗についての重要な情報源となっています。

ただし、紀貫之が土佐に到着した後の記録は残されていません。「土佐日記」は都を出発し、土佐へ向かう途中の旅の記録だけが残されているのです。

「土佐日記」は、その情感豊かな文体と詩的な表現で知られ、日本文学の中でも特に重要な作品とされています。

Opensourcetech by Takahiro Kujirai