2021/11/04:①動詞と形容詞も抽出できるようにした(改訂前は一般名詞のみ)②ストップワードが設定できるようにした。③ワードアートを任意の画像の形に描画するコード追加、④ミスチルのSimpleをドーナツ形状に描いたワードクラウドを追加
これは夏目漱石「こころ」でワードアートを描いたものです。
#はじめに
ワードクラウド(word cloud)は頻出語を頻度に比例する大きさで雲のように並べた、SNSでたまにお見かけする図だ。
Axrossに以下のレシピがあり、以前から興味があったのでやってみました。
上記レシピは、青空文庫の「走れメロス」をワードクラウドで描くというものですが、
私は追加で以下も実行してみました。
- 青空文庫の「こころ(夏目漱石)」のデータ
- 書籍「古風堂々数学者(藤原正彦)」の読書メモをテキスト化したデータ
- 勤め先の強みをテキスト化したデータ
うん、これはなかなかおもしろいです。
ワードクラウドで表現したいテキストデータ(手元にあるデータなら何でもいい、もちろん元ソースが実行している青空文庫のデータでもいい)があれば、それを読ませるだけで簡単に描けます。
##実行条件など
・Google colabで実行
・**青空文庫の「こころ」**で実行
※手元データを読込んで実行する場合も記載していますので、簡単にできるはずです。
#ライブラリのインストール
#Mecabのインストール
!pip install mecab-python3==0.996.5
#日本語フォントをインストール
!apt-get -y install fonts-ipafont-gothic
#データ読込み
以下、3つのパターン(青空文庫「走れメロス」、青空文庫「こころ」、任意のテキストデータ)があります。実行される場合はいずれかを選択してください。
###青空文庫「走れメロス」を読み込む場合
#走れメロスのテキストデータ(zipファイル)をダウンロード
!curl -O "https://www.aozora.gr.jp/cards/000035/files/1567_ruby_4948.zip"
#zipファイルを解凍
!unzip 1567_ruby_4948.zip
#文章のみ切り出し
!sed -n 17,91p hashire_merosu.txt > hashire_merosu_data.txt
#テキストファイル読み込み
#text_file = open('/content/hashire_merosu_data.txt',encoding = 'shift_jis')
#contents = text_file.read()
###青空文庫「こころ」を読み込む場合
#こころのテキストデータ(zipファイル)をダウンロード
!curl -O "https://www.aozora.gr.jp/cards/000148/files/773_ruby_5968.zip"
#zipファイルを解凍
!unzip 773_ruby_5968.zip
#文章のみ切り出し
!sed -n 17,91p kokoro.txt > kokoro_data.txt
#テキストファイル読み込み
text_file = open('/content/kokoro_data.txt',encoding = 'shift_jis')
contents = text_file.read()
###任意のテキストデータ(sample.txt)を読み込む場合
#任意のテキストファイル読み込み
text_file = open('sample.txt')
contents = text_file.read()
#テキストファイル表示
print(contents)
#Mecabを用いた形態素解析の実行
import MeCab
from wordcloud import WordCloud
from collections import Counter
#MeCabで形態素解析
mecab = MeCab.Tagger('-Ochasen')
node = mecab.parseToNode(contents)
words = []
while node is not None:
#ストップワード設定(出力結果から手動で設定)
stop_words = ["ある", "おる", "せる", "ない", "いる", "する", "の", "よう", "なる", "それ", "そこ", "これ", "こう", "ため", "そう", "れる", "られる"]
#品詞と品詞細分類1を抽出
pos_type = node.feature.split(',')[0]
subtype = node.feature.split(',')[1]
features = node.feature.split(",")
#品詞が名詞[表層型]、品詞細分類1が一般のとき
if pos_type in ['名詞']:
if subtype in ['一般']:
words.append(node.surface)
#動詞、形容詞[基礎型]を抽出(名詞のみを抽出したい場合は以下コードを除く)
elif pos_type in ['動詞','形容詞'] and not (features[6] in stop_words):
words.append(features[6])
node = node.next
#出現回数を集計し、最頻順にソート
words_count = Counter(words)
result = words_count.most_common()
#出現回数結果の画面出力
for word, cnt in result:
print(word, cnt)
ワードクラウド生成
#wordcloud取込用に辞書型ヘ変換
dic_result = dict(result)
#Word Cloudで画像生成
from wordcloud import WordCloud
wordcloud = WordCloud(background_color='white',
max_words=125,
font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
width=1000,
height=600,
).fit_words(dic_result)
#生成した画像の表示
import matplotlib.pyplot as plt
from matplotlib import rcParams
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
###ワードクラフトを任意の画像の形に描画する場合
#wordcloud取込用に辞書型ヘ変換
dic_result = dict(result)
#Word Cloudで画像生成
from wordcloud import WordCloud
from PIL import Image
import numpy as np
#画像(png)のファイル名は任意
custom_mask = np.array(Image.open('〇〇.png'))
wordcloud = WordCloud(background_color='white',
max_words=125,
mask=custom_mask,
font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
width=1200,
height=1200
).fit_words(dic_result)
#生成した画像の表示
import matplotlib.pyplot as plt
from matplotlib import rcParams
plt.figure(figsize=(15,10))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
以下は、書籍「古風堂々数学者(藤原正彦)」の読書メモで描いたワードクラウドです。(これは一般名詞のみを抽出し描いたものです)
読んだ時の意識が瞬時によみがえった感を受けました。
以下は、ミスターチルドレンの「Simple」の歌詞をドーナツ形状で描いたワードクラウドです。(これは一般名詞,動詞,形容詞を抽出して描いたものです)
#最後に
ワードクラウド いいです。
ここでは紹介できませんが、勤め先の強みに関するテキストで描いた結果も「う~ん、なるほど」とうなずける内容でした。
ワードクラウドは、気がついているようで気がつけていないことに、気づかせてくれる可能性を秘めていると思います。
#参考サイト
https://qiita.com/str32/items/4539e417a9cb333abd52