前回、文章要約のために羅生門を形態素解析しました。
せっかく分かち書きしたので、ついでにwordcloudの可視化もやってみようと思います。
データの前処理~分かち書き
個々の箇所はスクリプトだけ書いておきます。
詳細はsumyで文章要約した記事に書いてあります。(冒頭のリンクです。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import re from janome.tokenizer import Tokenizer with open("rashomon.txt","r",encoding="shift_jis") as f: data = f.read() data = re.sub("《[^》]+》", "", data) data = re.sub("[[^]]+]", "", data) data = re.sub("[| 「」\n]", "", data) lines = data.split("。") mainText = lines[1:-3] mainText = [x+"。" for x in mainText] t = Tokenizer() wakati = [] tmp1 = [] tmp2 = [] for line in mainText: for token in t.tokenize(line): tmp1.append(token.surface) tmp2 = " ".join(tmp1) wakati.append(tmp2) tmp1 = [] wakati = " ".join(wakati) print(wakati) ''' '一 人 の 下人 が 、 羅生門 の 下 で 雨 やみ を 待っ て い た 。 広い ・・・' ''' |
wordcloudで可視化
pip install wordcloud
をしたら、WordCloud.generate()で作成することができます。
wordcloud.to_file()で指定のディレクトリに画像として保存できます。
1 2 3 4 |
from wordcloud import WordCloud wordcloud = WordCloud(background_color="white",width=800,height=600).generate(wakati) wordcloud.to_file("./sample.png") |
さて保存された画像を見てみるとこのように悲惨なことになっています。

デフォルトでは日本語対応していないので、日本語フォントでwordcloudを作って、という指示を出さなければいけません。
日本語フォントは好きなのを使えるので、ちょろっと検索して見つけた「トガリテ」というのを使ってみようと思います。
文字にとげとげのあるユニークなフォントだそうです。
1 2 |
wordcloud = WordCloud(background_color="white",font_path=r"フォントのパス",width=800,height=600).generate(wakati) wordcloud.to_file("./sample2.png") |
フォントのパスをfont_path引数の値に入力するだけです。
出力結果はこのようになります。

いい感じにとんがってますね!老婆、がロックな感じでいかしてます。
しかし「この」とか「その」とかが邪魔です。
こういうのいらないな、と思ったらとる手段は2つあります。
①ストップワードを指定する
②助詞助動詞系の品詞を最初から省いてしまう
まずはストップワードからやってみます。
「この」を表示しないように設定しましょう。
stopwords引数を設定するだけです。
1 2 3 |
stopwords = ['この'] wordcloud = WordCloud(background_color="white",font_path=r"フォントのパス",width=800,height=600,stopwords=stopwords).generate(wakati) wordcloud.to_file("./sample3.png") |
「この」、ちゃんと消えてくれましたね。そして紫色だとよりとげとげしい感じが出ますね。
とくに「死骸」、がなかなかいい感じです。
では次に品詞を限定してしまうのもやってみます。
名詞形だけ残すことにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
wakati2 = [] tmp1 = [] tmp2 = [] for line in mainText: for token in t.tokenize(line): word = token.surface part = token.part_of_speech.split(",")[0] if part == "名詞": tmp1.append(token.surface) tmp2 = " ".join(tmp1) wakati2.append(tmp2) tmp1 = [] wakati2 = " ".join(wakati2) wordcloud = WordCloud(background_color="white",font_path=r"フォントのパス",width=800,height=600,stopwords=stopwords).generate(wakati2) wordcloud.to_file("./sample3.png") |
こうやってみると羅生門はなかなかダークな世界観なのが見て取れますね。
というわけでwordcloudで遊んでみた話でした。
最後まで読んでいただきありがとうございました!