Pythonでワードクラウドを作ろう

2021/09/18 編集:モジュール名修正しました。(matlotlib -> matplotlib)

Webサイトなんかのページ内にどんな単語がよく使われているのか?
発生頻度に応じて単語を視覚化したのがWordCloud(ワードクラウド)です。

表にして出すよりも直感的にわかるので、歌詞をワードクラウド化していたり、サイトをワードクラウド化したり、twitterをワードクラウド化していたりする方がいますね。
テキスト貼り付けるとワードクラウド作成してくれるWEBサービスもあるので結構簡単に作れます。

今回はPythonのモジュール使ってワードクラウド作ってみようと思います。
Webスクレイピングと合わせて、サイトのページのワードクラウドを自由に作れるようにしたいなぁ。

 

wordcloudに使うモジュールをinstall

“wordcloud”と”matplotlib”を使うので、pip使ってインストールします。

参考にしたサイトではwordcloudモジュールだけ書かれていたのですが、実行時にエラーでmatplotlibが無いと怒られました・・・

テキストファイルからwordcloudを生成

今回はローカルに保存してあるテキストファイルの中身から、wordcloudを生成していきます。
手順は次の通りです。

  1. テキストファイルの中身を文字列として取得
  2. wordcloudの生成
  3. wordcloudを画像として保存

とある方のスピーチ(英文)をspeech.txtとして保存してあります。
それを読み込んでwordcloud化させたコードです。

テキストファイル読み込み時にcodecsモジュールも使いましたが、utf-8以外の文字が混入している際に、標準モジュールではエラーが発生してしまったので、utf-8以外の文字読み込みをスキップさせるために使ってます。

できたワードクラウドがこちら。
誰のスピーチかわかります?

型に入れ込んでいこう

ここまでだと、webサービス使えばできちゃうことなんで、
好きな形になるように調整してみます。

ワードクラウドがキャラクターの形をしていたり、雲のような形をしているのを見たことがある方いますか?
wordcloudモジュールでは好きな形でワードクラウドの生成ができるんですよ!

今回はスピーチした人に合わせた形を作っていこうと思います。

PILモジュールのImageとnumpyモジュールを追加でimportします。

形の元になるマスク画像を読み込み、三次元配列へ変換します。

wordcloud生成時のパラメーターにmask情報を追加します。

contour_width,contour_colorは型の境界線を描くかどうかの設定です。

んで、できたワードクラウドがこちら。

マスク画像に使った画像ファイル

Appleの元CEOであり、ピクサーの元CEOでもある
スティーブ・ジョブズ氏がスタンフォード大学の卒業式に話した内容をワードクラウドにしました。

スピーチ文はこちらからお借りしてテキストファイルに保存しました。

はまった事・・・

Pythonでワードクラウドを作る。
マスク画像を使って好きな形でワードクラウドを作る。ってモジュールが用意されているし、短いコードでできちゃうのですが、
マスク画像を指定しても形にならなくて、えぇぇ・・・となりました。

左のマスク画像ではOKですが、右のマスク画像ではダメでした。
(スマホでは上の画像がOK、下の画像はダメ)

マスク画像は白(255,255,255)で4辺を囲まれていなければダメっぽいです。

ダメだった時のマスク画像は、左辺と下辺が黒色と接していました。
画像をちょっと削って、白になるようにマスク画像を変えてなんとかできました。

色んなサイトを調べても、原因と修正箇所が出てこなかったけど
皆こんなマスク画像使わないのでしょうかね?

 

次は日本語をワードクラウド化させてみようと思いまーす。

コメント