ここではPythonにおける「Word Cloud」による文字(テキスト)の可視化方法について解説しています。
この記事の対象
「Word Cloud」とは
「Word Cloud」とは任意の文字列の中から文字を抽出して可視化する外部ライブラリになります。
例えば、以下のようなものになります。
「Word Cloud」のインストール
Word Cloudを用いるには予め、PyPlからpipを用いてインストールしておく必要があります。
$ pip install wordcloud
「Word Cloud」を用いた使用例
デフォルトの使用方法
import matplotlib.pyplot as plt
from wordcloud import WordCloud
#1---テキスト読込
text = open("test.txt").read()
#2---wordcloudにテキストを代入
wordcloud = WordCloud(max_font_size=40).generate(text)
#3---matplotlibで画像生成
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig("wordcloud.png")
上記がプログラムになります。
それでは解説していきます。
#1---テキスト読込
text = open("test.txt").read()
1の部分では、open()を用いて任意のファイルを読み込んでいます。ここではファイルの内容は著作権フリーの英文を予めテキストファイルに保存しています。
#2---wordcloudにテキストを代入
wordcloud = WordCloud(max_font_size=40).generate(text)
2の部分ではwordcloudに読み込んだテキストを入れています。同時に頻出度が高いもののサイズを指定しています。
#3---matplotlibで画像生成
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig("wordcloud.png")
3の部分では、matplotlibで画像生成を行っています。最後には画像として保存しています。
結果
上記が結果になります。単語を見てもらうと政治系の文章だと推測できます。
日本語の表示方法
デフォルトでは日本語は対応していないので出力するときに文字化けします。
回避方法はwordcloudで出力するときに「font_path」を指定することです。
以下のプログラムは「吾輩は猫である」の文章を「janome」で品詞分けしてWordCloudで出力するものになります。
from janome.tokenizer import Tokenizer
import re
import matplotlib.pyplot as plt
from wordcloud import WordCloud
path = r"C:\hoge\Python36-32\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\ipaexg.ttf"
def wordcloud_make(text):
#1---オブジェクト作成
t = Tokenizer()
#2---メソッドに文字列を渡す
token = t.tokenize(text)
word_list = []
#3---品詞の指定
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)
#4---ファイル読み込み
text = open("wagahaiwa_nekodearu.txt", encoding="utf8").read()
#5---文字列取得
word_txt = wordcloud_make(text)
#6---wordcloudにテキストを代入
wordcloud = WordCloud(font_path= path,max_font_size=40).generate(word_txt)#,
#7---matplotlibで画像生成
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig("wordcloud_jap.png")
「font_path」は日本語デジタルフォントのttfファイルを指定する必要があります。ここでは、IPAの「ipaexg.ttf」を指定しています。
日本語デジタルフォントはダウンロードして任意の場所に保存しておく必要があります。
IPAのデジタルフォントの設定方法については以下をご参照下さい。
>>>「「Matplotlib」における日本語表示の設定方法」
以下はプログラムの解説です。
#1---オブジェクト作成
t = Tokenizer()
1の部分では、Janomeのオブジェクトを作成しています。
#2---メソッドに文字列を渡す
token = t.tokenize(text)
word_list = []
2の部分では関数で読み込んだテキストをメソッドに渡しています。次に3の部分で使用するリストを作成しています。
#3---品詞の指定
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)
3の部分では文字を品詞に分けてリストを作成しています。
名詞を指定してその中で「一般」「固有名詞」「代名詞」をリストに格納しています。
最後にリストを戻り値としています。
Janomeについて詳細を知りたい方は以下をご参照下さい。
#4---ファイル読み込み
text = open("wagahaiwa_nekodearu.txt", encoding="utf8").read()
4の部分ではテキストファイルを読み込んでいます。ここでは日本語のテキストなので「utf8」を指定しています。
#5---文字列取得
word_txt = wordcloud_make(text)
5の部分では関数を呼び出しています。
#6---wordcloudにテキストを代入
wordcloud = WordCloud(font_path= path,max_font_size=40).generate(word_txt)
6の部分では品詞分けしたテキストをWordCloudに代入しています。「font_path」は「ipaexg.ttf」のパスを指定します。
#7---matplotlibで画像生成
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig("wordcloud2.png")
7の部分ではmatplotlibで画像作成しています。
結果
日本語での出力ができました。
マスク画像の割当
単なる画像出力をするのではなく、任意の形で出力する事が可能です。注意点は、画像は透過PNG画像を使用する必要があります。
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
import numpy as np
from PIL import Image
path = r"C:\hoge\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\ipaexg.ttf"
#1---テキスト読込
text = open("wagahaiwa_nekodearu.txt",encoding='utf-8').read()
# マスク画像を取得
mask = np.array(Image.open("cat.png"))
wordcloud_mask = WordCloud(font_path=path,mask=mask, background_color="white", max_font_size=250).generate(text)
image_colors = ImageColorGenerator(mask)
wordcloud_mask.to_file("wordcloud3.png")
maskの条件は、デフォルトで黒色は「文字を表示する範囲」、白色は「文字を表示しない範囲」となります。
用意した画像は以下になります。
結果
上記では日本語での形態素解析を用いています。詳細を知りたい方には「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方」がおすすめです。
実践形式で要所を押さえられます。