【Python】ワードクラウドでギレン閣下の演説を可視化

Pythonを使ってワードクラウドを描画

ギレン閣下の演説を形態素解析

ワードクラウドってかっこいいな〜と思い、
ギレン閣下の演説を形態素解析して描画してみました。

ネタ元

ここのサイトから演説内容を拝借しました。
利用したのはギレン総帥の演説①です。

実行手順

  1. MeCabの準備
  2. ワードクラウドを描画

1.MeCabの準備

環境構築に関してはこちらののサイトを参考にしました。
MacでPython3系を前提として環境構築をしておりますので、 Windowsは別の方法になるかもしれません。

MeCabのインストール

homebrewはすでにインストールされておりますでしょか。
MeCabのインストールはhomebrewを使って行います。

brew install mecab
brew install mecab-ipadic

neologdのインストール

形態素解析するためには、辞書が必要になります。

brew install mecab mecab-ipadic git curl xz
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
echo `mecab-config --dicdir`"/mecab-ipadic-neologd" 
mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/

これを実行することで辞書がインストールされました。

インストールとあわせて、mecabrcを編集してパスを変更しておきましょう。 mecabrcは/usr/local/etc/mecabrcにあります。

; dicdir =  /usr/local/lib/mecab/dic/ipadic ←既存コードをコメントアウト   
dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd

Pythonから呼び出せるようにする

インストールしたMeCabPythonから呼び出せるように、pipを使ってインストールしましょう。

pip install mecab-python3

2.ワードクラウドを描画

こちらのサイトを参考に描画してみました。

%matplotlib inline
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import MeCab as mc

def wordcloud(text):
    stop_words = [ u'てる', u'いる', u'なる', u'れる', u'する', u'ある', u'こと', u'これ', u'さん', u'して',
             u'くれる', u'やる', u'くださる', u'そう', u'せる', u'した',  u'思う',
             u'それ', u'ここ', u'ちゃん', u'くん', u'', u'て',u'に',u'を',u'は',u'の', u'が', u'と', u'た', u'し', u'で', 
             u'ない', u'も', u'な', u'い', u'か', u'ので', u'よう', u'']
    wordcloud = WordCloud(background_color="white", 
                          font_path="/System/Library/Fonts/ヒラギノ明朝 ProN W3.ttc",
                          stopwords=set(stop_words),
                          width=1024,height=674).generate(text)

    plt.figure(figsize=(15,12))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    # 描画したグラフを保存
    wordcloud.to_file("speech_wordcloud.png")

# テキストファイルに格納した演説内容を読み込み
with open('speech', 'r') as f:
    speech = f.read()

# 読み込んだだけでは不要なテキストが含まれているので、replaceで除去
text = speech.replace('\n','').replace('\t','')
t = mc.Tagger('-Ochasen')
node = t.parseToNode(text) 
output = []
while(node):
    if node.surface != "":
        word_type = node.feature.split(",")[0]
        if word_type in ["形容詞", "動詞","名詞", "副詞"]:
            output.append(node.surface)
    node = node.next
    if node is None:
        break

wordcloud(" ".join(output))

出力した結果はこちらです!

f:id:gotto50105010:20180506152947p:plain

なんとなく出来たのではないでしょうか。