プログラミング全くの初心者が形態素解析→ワードクラウドをやってみた
こんにちは
今回はわたしが担当しているプロダクトを使ってデータをいろいろ可視化するために、ワードクラウドをつかったら面白いのではないかということで、急遽pythonでワードクラウドを作ってみることにしましたのでご紹介します!!
※Anacondaをつかって紹介していきます。
試したい方は事前にAnacondaをインストールしてください!
ワードクラウドというのはあれです。
記事のタイトルの背景写真になっているやつです。
ぱっとみてどんな内容かを大まかに把握できるやつ?です
ちなみにわたしはプログラミングをほぼしたことありません。。
しててもHello worldできるくらいw
プログラミングって準備段階が難しすぎて挫折するんですよね。。。。
準備
まずはjupyter note book 上でMecabとmecab-NEolgdをインストールします。Mecabのインストール
ここがわけわからんかったですが、jupyter note book上でインストールすると行けました!
$ pip install mecab
$ pip install mecab-ipadic
つづいてMecab-NEologdのインストール
ちなみに「ねおろぐでぃ」って読むらしいです。
インストールの詳細はこちら
僕はMecabのディレクトリの中に入れちゃいました!
$ pip install git curl xz
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
Pythonスタート!!
いよいよコード書いていきます!
コードの綺麗さとかは正直全くわかりませんので、お許しください笑
まずは色々形態素解析やワードクラウドをするのに使用するものをインポートしていきます。
import MeCab
import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
ほんとは、会社で分析したものをお見せしたかったのですが、個人名とかが載ってしまっているので今回は一例としてアインシュタインの相対性理論を形態素分析して、ワードクラウド化をしていきます。
まずはファイルの読み込みを行っていきます。
相対性理論をテキストファイルとして読み込みしました。
#ファイルの読み込み
f = open('Relativitätstheorie.txt')
text = f.read() # ファイル終端まで全て読んだデータを返す
f.close()
テキストファイルの中身はこんな感じ
細かい文字ばっかりで読みたくないですよねw
MeCabの準備と利用
MeCabの準備をしていきます!
今回はMeCab-NEologdを使うので直接指定しました。
MeCab.Taggerは
形態素解析に使う辞書を何使うかみたいなイメージです!
いろんな種類があるので詳しくはqiita記事があったのでこちらを見てください!
ほかの部分はよくわからないですが、Mecabを使うときのお作法みたいな感じらしいです。。。適当ですみませんw
# MeCabの準備
tagger = MeCab.Tagger('/Users/izuru.takahashi/opt/anaconda3/lib/python3.8/site-packages/MeCab/mecab-ipadic-neologd')
tagger.parse('')
node = tagger.parseToNode(text)
続いて、
膨大なテキストの中を形態素解析して名詞を取り出し、word_listの中に入れていきます。
# 名詞を取り出す
word_list = []
while node:
word_type = node.feature.split(',')[0]
if word_type == '名詞':
word_list.append(node.surface)
node = node.next
この時点でワードクラウド化してみます。
するとこんな感じです。
パッと見て、相対性理論のことがわかりそうですが、まだまだ「こと」や「よう」とか無駄なワードが多いですよね。伝わりにくいと思うので、単語の除外リスト(以下:ストップワード)を作って無駄なワードを取り除いて行きます。
ストップワードの設定
ストップワードをテキストで作って読み込みます。
ストップワードのテキストファイルはこんな感じ
ただの単語の羅列ですw
今後省きたい単語があればここに入れていくとより精度の高いワードクラウドが出来上がります!!!
#ストップワードのファイルを読み込む
stop_words = []
with open("ストップワード.txt") as f:
stop_words = f.read().split()
次に名詞を取り出したword_listからストップワードを除いたnew_word_listを作成します。以下の表記の方法を内包表記というらしいです。
難しいらしいですが、調べてたらこれが見つかってやりやすそうだったので使ってみました笑
#ストップワードを覗いたリストを作成する
new_word_list= [word for word in word_list if word not in stop_words]
続いてリストを文字列に変換します。
# リストを文字列に変換
word_chain = ' '.join(new_word_list)
ワードクラウド
いよいよワードクラウド作成します。
大きさの指定と背景色、フォントのパスを通します。
フォントのパスは通さないとワードクラウドが□だらけになります。
なんでかわかりませんw
※フォントのパスを通す=なんのフォントをつかうのか案内してあげるみたいなイメージ??あってます??笑
# ワードクラウド作成
W = WordCloud(width=4000,
height=2500,
max_words=150,
background_color='white',
font_path="/Users/izuru.takahashi/Documents/Noto-unhinted/NotoSansCJKjp-DemiLight.otf").generate(word_chain)
フォントパスを通さないと以下□だらけのワードクラウドになりますw
英字のみ表示されてるので言語的な問題??っぽいですね
しっかりフォントパスを通したワードクラウドがこちら!
ストップワードもちゃんと動いてくれてますね!
パッと見ただけで相対性理論の輪郭をつかめるようになったかと思います!
アレンジ!
ワードクラウドできたのはいいのですがせっかくなので、少しアレンジを加えたいと思います。
使うのはこれ!
アインシュタインの画像ですw
この影の中にワードクラウドを入れ込んで行きます!
まずはこの画像を読み込みます。
#アインシュタインの画像読み込み
einstein_mask = np.array(Image.open('einstein.png'))
ワードクラウドの条件を指定していきます。
勉強がてら先ほどとやり方を変えてみました。
調べたところ、ストップワードもワードクラウドの条件指定で簡単にできるようでした!
表示するワードの数も指定してみました。
若干最初のものと異なるかもしれませんが。。。
#ワードクラウドの条件指定
def generate_wordcloud(data, title):
einstein = WordCloud(scale=3,
max_words=150,
mask=einstein_mask,
stopwords=stop_words,
background_color='white',
contour_color='black',#アインシュタインの画像に枠線をつける
contour_width=1,#枠線の太さ
font_path="/Users/izuru.takahashi/Documents/Noto-unhinted/NotoSansCJKjp-DemiLight.otf",
collocations=True).generate(word_chain)
画像を出していきます!
画像サイズや画質を指定してあげます
plt.figure(figsize=(10,8))
plt.imshow(einstein)
plt.axis('off')
plt.title(title)
plt.savefig("einstein_wordcloud", format="png", dpi=400)
plt.show()
できたのがこちら!!!
アインシュタインってわかりにくいですが、まあなんとかできたので良しとしましょう笑
感想
プログラミング未経験でも非常に簡単に形態素分析→ワードクラウド化をすることができました!
まったくの初心者なので調べたいことがわからないみたいな状態だったのでかなり調べる時間はかかりましたが、皆さんに見せられる状態になったのでよかったです!
パイソン初心者の方も簡単にできるので試してみてください!
最後まで読んで頂きありがとうございました!