WordCloudで日本語文字が豆腐になる問題を解決する

こんにちは。R&D室のsiidaです。 R&D室には様々なミッションがありますが、その中でも主要なものとしてAI/MLプロジェクトの企画からMVPリリースまでEnd-to-Endに推進するというものがあります。最近はちょうどプロジェクトのPoCに力を入れていたため、データサイエンティストらしくJupyterを使ってデータ分析する機会も多くありました。今回はそのような中で遭遇したトラブルとその対処法を残していきたいと思います。

TL;DR

WordCloudで日本語が豆腐になる場合には WordCloud(font_path="/path/to/my-font.ttf") というように font_path を指定する。

問題

WordCloudを使用して日本語の単語をプロットしようとすると、豆腐(文字化け状態)になることがある。作り込んだ環境では特に意識せずとも正しく表示されるかもしれないが、Google Colab利用する場合など新たに立ち上げた環境においてはよく発生するトラブルである。

たとえばColab上でこのコードを実行すると、日本語の文字は豆腐になる。

from wordcloud import WordCloud

wordcloud = WordCloud().generate(" ".join(["hoge", "fuga", "piyo", "ほげ", "ふが", "ぴよ"])

wordcloud_bad

こういう場合のよくあるプラクティスは japanize_matplotlib を使うことや plt.rcParams['font.family'] を設定することだが、これではタイトルや軸ラベルは日本語になってもWordCloudでプロットされる単語は豆腐になってしまう。

ならどうするか?

WordCloud オブジェクトを作成する際 font_path 引数に使用するフォントファイルのパスを与えてやればいい。

具体的にはこうする。

from wordcloud import WordCloud

wordcloud = WordCloud(
    font_path="NotoSansJP-Regular.ttf"
).generate(" ".join(["hoge", "fuga", "piyo", "ほげ", "ふが", "ぴよ"])

wordcloud_good

この例だとカレントディレクトリに直接フォントファイルを置いてしまっているが、環境によって適切なフォントファイルの置き場があるので、適宜パスは書き換えると良い。

ちなみにサンプルで利用したNoto Sans JPはここからダウンロードできる。

ふりかえってみると単純な話だけど、原因がどこにあるのかを特定するまでが結構大変な問題だった。フォント周りの設定なのか、パッケージの問題なのか、色々と試して時間を使ってしまった。またいつか突発的にWordCloudを使って困ることがあると思うので備忘録代わりに残しておく。


本記事は Qiitaで投稿した記事と同じ内容です。 アクセス解析を目的としてマルチポストしています。 qiita.com


また弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。

herp.careers