Pythonのwordcloudでカスタム画像のスタイルを適用
Pythonのwordcloudでカスタム画像のスタイルを適用

今日は2022年7月のDjango の記事以来のPython ネタです。

テキストを可視化する定番が、ワードクラウド。新聞でのSNS 解析の記事や、朝のテレビ番組でも今日のトレンドとして、このワードクラウドがよく使われています。

Python でのワードクラウドのモジュールは色々とありますが、その名の通りWordCloud モジュール (https://amueller.github.io/word_cloud/) をここでは紹介します。これを使うと標準のワードクラウドだけではなく、画像に合わせてテキストの散らばりや色を指定したスタイルでワードクラウドを作ることができて、オリジナリティあるワードクラウドができます。

Python のwordcloud のセットアップ

まずはインストールから。pip かconda でインストールできます。私はpip でインストールしました。

pip install wordcloudCode language: DOS .bat (dos)

これでfrom wordcloud import WordCloud, STOPWORDS, ImageColorGeneratorが使えるようになりました。

公式サンプルを見ていたら、不思議の国のアリスの画像に合わせてワードクラウドを作るものがあったので、早速これを試しみました。

【wordcloud】Image-colored wordcloud

Git のソースコードからexamples フォルダーにあるcolored.py 、そして入力に使うテキストファイルのalice.txt と画像のalice_color.png をダウンロードして実行してみますが、以下のエラーが。

実行結果 (エラー)

Traceback (most recent call last):
  File "c:\xxx\colored.py", line 27, in <module>
    text = open(path.join(d, 'alice.txt')).read()
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte 
Code language: Python (python)

alice.txt を読み取るところでファイルのデコードで失敗しているようで、エンコーディングの指定がうまくいっていないようです。こちらのstackoverflow の回答の2つ目にあるように、下記の太字のとおりエンコードを指定しました。

text = open(path.join(d, 'alice.txt'), <strong>encoding="utf-8"</strong>).read()Code language: Python (python)

続いてPillow のエラー

するとエラー内容が変わりました。

実行結果 (エラー)

Traceback (most recent call last):
  File "c:\xxx\colored.py", line 38, in <module>
    wc.generate(text)
  File "C:\Python\Python39\lib\site-packages\wordcloud\wordcloud.py", line 639, in generate
    return self.generate_from_text(text)
  File "C:\Python\Python39\lib\site-packages\wordcloud\wordcloud.py", line 621, in generate_from_text
    self.generate_from_frequencies(words)
  File "C:\Python\Python39\lib\site-packages\wordcloud\wordcloud.py", line 508, in generate_from_frequencies
    box_size = draw.textbbox((0, 0), word, font=transposed_font, anchor="lt")
  File "C:\Python\Python39\lib\site-packages\PIL\ImageDraw.py", line 671, in textbbox
    raise ValueError("Only supported for TrueType fonts")
ValueError: Only supported for TrueType fonts
Code language: DOS .bat (dos)

ググると、こちらもstackoverflow の回答の2つ目にPillow のアップデートが必要との情報があったので早速試しました。

pip install --upgrade PillowCode language: DOS .bat (dos)

これでサンプルが無事に実行でき、ワードクラウドの出力が出てきました。

実行結果 (アリスの画像でワードクラウド)

WordCloudのアリスの画像に合わせたスタイルの実行結果
WordCloudのアリスの画像に合わせたスタイルの実行結果

カスタムの画像でトライ

さて、続いてカスタム画像を入れてみて、どんなワードクラウドができるのか試していきます。画像もカラフルなほうがテキストが色々な色で表示されれるので、パッと思いついたのが鳥のオシドリのオスの画像。

今回はあくまでも動作確認のテストなので、とりあえずはWikipedia のオシドリの記事にある画像を使って、背景を削除した画像をつくりました。画像編集ソフトは使わず、パワーポイントに画像を貼り付けてから背景の削除、背景範囲の変更をして作りました。これをoshidori.jpg というファイル名で保存します。

オシドリのWiki画像の背景を取り除いた画像
オシドリのWiki画像の背景を取り除いた画像

また、alice.txt に代わるテキストファイルを、こちらも同じオシドリのWiki の記事を英語版表記にしてからテキストをコピペして作りました。これをoshidori.txt として保存します。英語を使っているのは、wordcloud のcolored.py で指定しているフォントが日本語対応していないため(実際に日本語文字のファイルで試すと、マルチバイト文字が□で表示されます)、そしてwordcloud のtokenizer が日本語に対応していないため文章が適切に単語単位に分割できないためです。日本語のtokenizer ではjanome やMeCab、spaCy などを使えばできますが、それはまた別の機会に紹介したいと思います。

さて、colored.py のテキストファイルをoshidori.txt に、画像ファイルをoshidori.jpg に変更し、アリスのような物語文と違ってsaid で文章が切れないので、 stopwords.add("said") のところだけ「#」を付けてコメントアウトします。

するとこのような実行結果に。

実行結果 (オシドリの画像でワードクラウド)

WordCloudのオシドリの画像に合わせたスタイルの実行結果
WordCloudのオシドリの画像に合わせたスタイルの実行結果

ちゃんと色や形がオシドリの入力画像のようになっていますね。

Python のwordcloud を使ったカスタム画像でのスタイル指定の方法を紹介しました。ではでは。

Categories:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

スポンサーリンク
カテゴリー