4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-11-03

2021/11/04:①動詞と形容詞も抽出できるようにした(改訂前は一般名詞のみ)②ストップワードが設定できるようにした。③ワードアートを任意の画像の形に描画するコード追加、④ミスチルのSimpleをドーナツ形状に描いたワードクラウドを追加
image.png
これは夏目漱石「こころ」でワードアートを描いたものです。

#はじめに

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

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

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

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

##実行条件など

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

    #品詞と品詞細分類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()

以下は、書籍「古風堂々数学者(藤原正彦)」の読書メモで描いたワードクラウドです。(これは一般名詞のみを抽出し描いたものです)
読んだ時の意識が瞬時によみがえった感を受けました。
image.png
 
以下は、ミスターチルドレンの「Simple」の歌詞をドーナツ形状で描いたワードクラウドです。(これは一般名詞,動詞,形容詞を抽出して描いたものです)
image.png

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

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


古風堂々数学者(藤原正彦)
image.jpeg

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?