Pythonでは、WordCloud(ワードクラウド)を作成できます。
word_cloudライブラリを使えば、それもとても簡単にです。
その方法に関しては、次の記事で解説しています。
しかし、そのままでは致命的な問題がありました。
その問題とは、日本語でWordCloudを作成できないということです。
この記事では、その致命的な問題を解決する方法を解説していきます。
word_cloudライブラリの日本語化と言えますね。
本記事の内容
- word_cloudの日本語化
- 形態素解析ができる環境の用意
- 日本語フォントの用意
- サンプルコード用に日本語の文章を取得する
- 【サンプルコード(Mecab版)】WordCloudを日本語で作成する
- 【サンプルコード(Janome版)】WordCloudを日本語で作成する
それでは、上記に沿って解説していきましょう。
word_cloudの日本語化
word_cloudの日本語化には、以下の二つの対応が必要です。
- 形態素解析ができる環境の用意
- 日本語フォントの用意
ここで、word_cloudの仕組みを説明しておきます。
word_cloudに文字列を入力データとして渡します。
その結果として、word_cloudはその文字列中に出てくる単語の頻度に応じてWordCloudの画像を出力します。
これが、 word_cloudの仕組みです。
ただし、入力データとなる文字列に制約というか条件があります。
それぞれの対応策に関して、以下で解説していきます。
形態素解析ができる環境の用意
word_cloudの入力データは、スペース区切りでないといけません。
そうじゃないと、単語の表示頻度をカウントできません。
つまり、日本語の場合は形態素解析した結果の文字列を渡す必要があります。
英語はもとから単語と単語の間にスペースがあるから、特に問題になりません。
「形態素解析とは?」という方は、次の参考にしてください。
形態素解析を行う手段は、何個か候補があります。
でも、ここはPythonで行うこと前提でいきます。
その場合、以下の二つが候補として考えられます。
- Mecab
- Janome
気軽に形態素解析をやりたいという場合は、Janomeを選択してください。
Janomeのインストールは、次の記事で解説しています。
がっつりと形態素解析をやりたいという場合は、Mecabの選択となります。
Mecabのインストールは、次の記事で解説しています。
なお、LinuxへのMecabのインストールは、Windowsより圧倒的に簡単です。
そのため、あえて解説することはしていません。
JanomeかMecabかどちらかを動かすことができるようになれば、次へ進みましょう。
次は、日本語フォントを用意することです。
日本語フォントの用意
word_cloudはデフォルトでは、以下のフォントを利用します。
Droid Sans Mono フォント(DroidSansMono.ttf)
ただ、このフォントは日本語に対応していません。
だから、デフォルトのままなら日本語が文字化けしてしまいます。
その文字化けを解消するために、日本語フォントが必要となります。
日本語フォントを自分で用意できる場合は、これ以降は読む必要がありません。
用意できない・わからない場合は、次の記事を参考にしてください。
Windowsの場合
Linuxの場合
記事を参考にして、IPAexゴシックを用意しましょう。
用意できたら、フォントの保存場所(フルパス)を控えておいてください。
プログラムを書く際に、このフルパスを利用します。
日本語フォントを用意できたら、準備は完了です。
あとは、実際にコーディングしていきます。
ただ、その前にプログラムで利用する日本語の文章を用意しましょう。
サンプルコード用に日本語の文章を取得する
WordCloudを作成する対象の文章を用意します。
今回は、青空文庫を利用しましょう。
芥川龍之介の「羅生門」
https://www.aozora.gr.jp/cards/000879/card127.html
上記ページから、「127_ruby_150.zip」をダウンロード。
そのzipファイルを解凍すると、「rashomon.txt」というテキストファイルがあります。
このテキストファイルを利用します。
利用するにあたって、文字コードをUTF-8にして保存し直します。
そうしないと、Pythonで読み込む際にいろいろと面倒です。
このテキストファイルは、スクリプトファイルと同じ場所に設置してください。
【サンプルコード(Mecab版)】WordCloudを日本語で作成する
前提条件は、PythonからMecabを利用できることです。
もちろん、利用するライブラリが異なると動きません。
https://pypi.org/project/mecab/
そのため、上記ページでサポート対象のPythonバージョンを確認しましょう。
Mecab用のPythonライブラリは、複数存在しています。
そのため、案内した記事の方法でMecabのインストールを行っておいてください。
以下のプログラムは、Mecabで形態素解析した結果を利用しています。
get_word_str関数内のみMecabに関するコードです。
from wordcloud import WordCloud FONT_PATH = "フォントPath" TXT_NAME = "rashomon" def get_word_str(text): import MeCab import re mecab = MeCab.Tagger() parsed = mecab.parse(text) lines = parsed.split('\n') lines = lines[0:-2] word_list = [] for line in lines: tmp = re.split('\t|,', line) # 名詞のみ対象 if tmp[1] in ["名詞"]: # さらに絞り込み if tmp[2] in ["一般", "固有名詞"]: word_list.append(tmp[0]) return " " . join(word_list) # テキストファイル読み込み read_text = open(TXT_NAME + ".txt", encoding="utf8").read() # 文字列取得 word_str = get_word_str(read_text) # 画像作成 wc = WordCloud(font_path=FONT_PATH, max_font_size=40).generate(word_str) # 画像保存(テキストファイル名で) wc.to_file(TXT_NAME + ".png")
上記プログラムで変更する必要があるのは、以下の箇所。
FONT_PATH = "フォントPath" TXT_NAME = "rashomon"
FONT_PATHには、「日本語フォントの用意」で説明したフォントのフルパスを設定します。
TXT_NAMEは、読み込むテキストファイル名を記述。
今回は、「rashomon.txt」を利用するので「rashomon」と設定しています。
では、上記プログラムを実行しましょう。
その結果、「rashomon.png」という名前で以下のような画像が作成されます。
「羅生門」という感じですね。
以上、Mecabを利用をしたサンプルコードの説明でした。
【サンプルコード(Janome版)】WordCloudを日本語で作成する
前提条件は、PythonからJanomeを利用できることです。
以下は、get_word_str関数のコードとなります。
def get_word_str(text): from janome.tokenizer import Tokenizer import re t = Tokenizer() token = t.tokenize(text) word_list = [] for line in token: tmp = re.split('\t|,', str(line)) # 名詞のみ対象 if tmp[1] in ["名詞"]: # さらに絞り込み if tmp[2] in ["一般", "固有名詞"]: word_list.append(tmp[0]) return " " . join(word_list)
関数以外のコードは、上記で載せたMecab版のプログラムとすべて同じです。
そのため、「【サンプルコード(Mecab版)】WordCloudを日本語で作成する」をご覧ください。
実行すると、同じように「rashomon.png」が作成されます。
細かいところを見ていくと、若干Mecab版の結果とは異なります。
これは、形態素解析エンジンとしての違いということになるでしょう。
以上、Janomeを利用をしたサンプルコードの説明でした。