手元のテキストデータでワードクラウド描こう


>2021/11/04：①動詞と形容詞も抽出できるようにした（改訂前は一般名詞のみ）②ストップワードが設定できるようにした。③ワードアートを任意の画像の形に描画するコード追加、④ミスチルのSimpleをドーナツ形状に描いたワードクラウドを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/ba0b3851-ee07-f194-8775-98c16e51a055.png)
>これは夏目漱石「こころ」でワードアートを描いたものです。

#はじめに

ワードクラウド（word cloud）は頻出語を頻度に比例する大きさで雲のように並べた、SNSでたまにお見かけする図だ。
Axrossに以下のレシピがあり、以前から興味があったのでやってみました。

https://axross-recipe.com/recipes/17

上記レシピは、青空文庫の「走れメロス」をワードクラウドで描くというものですが、
私は追加で以下も実行してみました。

- 青空文庫の「こころ（夏目漱石）」のデータ
- 書籍「古風堂々数学者（藤原正彦）」の読書メモをテキスト化したデータ
- 勤め先の強みをテキスト化したデータ

うん、これはなかなかおもしろいです。
ワードクラウドで表現したいテキストデータ（手元にあるデータなら何でもいい、もちろん元ソースが実行している青空文庫のデータでもいい）があれば、それを読ませるだけで簡単に描けます。

##実行条件など
>・**Google colab**で実行
・**青空文庫の「こころ」**で実行
※手元データを読込んで実行する場合も記載していますので、簡単にできるはずです。

　
#ライブラリのインストール

```:MeCabのインストール
#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）を読み込む場合

```:任意（sample.txt）を読込む場合
#任意のテキストファイル読み込み
text_file = open('sample.txt')
contents = text_file.read()
```

```:テキストファイル表示
#テキストファイル表示
print(contents)
```

#Mecabを用いた形態素解析の実行

```: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 = ["ある", "おる", "せる", "ない", "いる", "する", "の", "よう", "なる", "それ", "そこ", "これ", "こう", "ため", "そう", "れる", "られる"]

    #品詞と品詞細分類１を抽出
    pos_type = node.feature.split(',')[0]
    subtype = node.feature.split(',')[1]
    features = node.feature.split(",")

    #品詞が名詞[表層型]、品詞細分類１が一般のとき
    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()
```

以下は、書籍「古風堂々数学者（藤原正彦）」の読書メモで描いたワードクラウドです。（これは一般名詞のみを抽出し描いたものです）
読んだ時の意識が瞬時によみがえった感を受けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/6123545a-3e89-a1ae-41e0-ee0f3d09f149.png)
　
以下は、ミスターチルドレンの「Simple」の歌詞をドーナツ形状で描いたワードクラウドです。（これは一般名詞,動詞,形容詞を抽出して描いたものです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b8caddbe-0db0-70f6-7b08-d2b4edf370fb.png)



#最後に
**ワードクラウド** いいです。
ここでは紹介できませんが、勤め先の強みに関するテキストで描いた結果も「う～ん、なるほど」とうなずける内容でした。
ワードクラウドは、気がついているようで気がつけていないことに、気づかせてくれる可能性を秘めていると思います。

#参考サイト
https://qiita.com/str32/items/4539e417a9cb333abd52

https://qiita.com/kngsym2018/items/3719f8da1f129793257c

https://ichi.pro/python-de-kasutamuwa-dokuraudo-o-sakuseisuru-145227399773811

https://analytics-note.xyz/programming/frequencies-word-cloud/

http://non-kuri.blogspot.com/2017/10/python.html

https://www.ai-shift.co.jp/techblog/1751

https://qiita.com/y-s-y-s/items/a945e7888fb3f7cf8f8b

https://rinsaka.com/python/nltk/04-tfidf.html

***

**[古風堂々数学者（藤原正彦）](https://www.amazon.co.jp/dp/B01GT712OA/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)**
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d8fb0e66-76c8-6c12-e5cd-e2d897c3ac29.jpeg)