[Python]銀河鉄道の夜をWordCloudで可視化してみた!


初めに

  • WordCloudを作ってみたくて作成しました。
  • コードが誤っているかもしれません(すいません)

環境

  • Python 3.7.3
  • Jupyter Notebook
  • Windows

流れ

1. スクレイピングでテキストの抽出
2. MeCabを使って単語を分ける
3. WordCloudの作成

1.スクレイピング

こちらのサイトに「銀河鉄道の夜」が載っていたので、ここからテキストだけ抽出する


 <div class ="main-text">

見た感じだと、この'div'をより下の階層のテキストを抽出すれば大丈夫そう!

scrapy.py
import urllib.request
from bs4 import BeautifulSoup

text = []

#対象サイトのURL
url = 'https://www.aozora.gr.jp/cards/000081/files/456_15050.html'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html,'html.parser')

#classではなくclass_とすることに注意する
ginga =  soup.findAll('div' , class_= 'main_text')

for i in ginga:
#テキストだけ取り出し追加していく
    text.append(i.text)

#ginga.txtという名前でテキストファイルとして保存する
file = open('ginga.txt','w',encoding='utf-8')
file.writelines(text)
file.close()


テキストファイルの確認

ちゃんと全文抽出できていることが確認できました!

2. MeCabを使って単語を分ける

MeCabとは対象となる言語の文法や単語の品詞情報をもとに、文章を形態素(単語が意味を持つ最小の単位)に分解、解析してくれるものです。
詳しくは下のサイトを参考にしてください

【技術解説】形態素解析とは?MeCabインストール手順からPythonでの実行例まで
 https://mieruca-ai.com/ai/morphological_analysis_mecab/

Ginga_MeCab.py
import MeCab

#保存したテキストファイルをひらく
data = open("ginnga.txt","rb").read()
text = data.decode('utf-8')

mecab = MeCab.Tagger("-ochasen")
#perseToNodeで形態素解析する
#nodeに解析の結果を入れる
node = mecab.parseToNode(text)

ginga_text = []

#品詞を使って単語を分ける

while node:
    #単語
    word = node.surface
    #品詞
    hinnsi = node.feature.split(",")[0]
  #配列の追加する単語を品詞で指定する
    if hinnsi in ["動詞","副詞","形容詞","名詞"]:
        ginga_text.append(word)
    else:
    #どんな言葉が追加されていないか確認(なくてもいい)
        print("|{0}|の品詞は{1}だから追加しない".format(node.surface,node.feature.split(",")[0]))
        print("-"*35)
    node = node.next

["動詞","副詞","形容詞","名詞"]この中身を変えることで、配列に追加する単語を変えることができます。

あともう少しでWordCloudが作れます!

3.WordCloudの作成

WordCloudを作るには、モジュールをインストールする必要があります。
pip install wordcloudでインストールします。
多分、これで使えるようになったはずです。
もし使えなかったら調べて下さい(すいません)!

先ほどのファイルの下に書いていきました。

Ginga_MeCab.py
from wordcloud import WordCloud
text = ' '.join(ginga_text)
#日本語のパスらしいです
fpath = "C:/Windows/Fonts/YuGothM.ttc"
wordcloud = WordCloud(background_color="white",#背景を白に
                     font_path=fpath,width = 800,height=600).generate(text)

#pngで保存する
wordcloud.to_file("./ginnga.png")

結果

ginnga.png

「よう」や「なっ」など意味が分からないのを配列に追加するときに取り除いていれば、もっと意味が分かる物ができあがります。

今回はこれで満足!

おまけ

宮沢賢治の画像の中に言葉を入れたい
↓準備した画像

先ほどのWordCloudを作るところを変えます

Ginga_MeCab.py
import numpy as np
from wordcloud import WordCloud ,ImageColorGenerator
from PIL import Image

text = ' '.join(ginga_text)

imagepaht = "./miyazawa.png"
img_color = np.array(Image.open( imagepaht ))
wc = WordCloud(width=800,
              height = 800,
              font_path=fpath,
              mask = img_color,
              background_color= "white",
              collocations=False,).generate(text)

wc.to_file("./wc_miyazawa.png")

結果

きれいに出来てとてもうれしいー!

参考記事

米津玄師の歌詞をWordCloudで可視化してみた
Power BI × Pythonで日本語ワードクラウド ~Pythonビジュアル編~

終わりに

思っていたよりも綺麗に出来てよかったです。
次はニュースの記事を可視化してみたなーと思っています。
最後までお読みいただきありがとうございます。