Word Cloudで文章の単語出現頻度を可視化する。[Python]

  • 85
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

amuellerさんの作成したpythonのWord Cloudライブラリを使って単語の出現頻度を可視化をしてみたいと思います。

こういうやつですね。
constitution-compressor.png

このライブラリの説明はこちらにあります。
http://amueller.github.io/word_cloud/index.html

1.各種ライブラリのインストール

1-1.word_cloudライブラリのインストール

gitからソースコードを入手するだけで簡単に導入できます。

git clone https://github.com/amueller/word_cloud
cd word_cloud
python setup.py install

1-2.各種pythonライブラリのインストール

日本語は英語と違って単語の区切りが明確ではないため、単語をバラすためにMeCabというソフトを使って単語に切り出します。Mecabのインストールについてはこのリンクで説明していましたので、こちらを参考にしてインストールができます。

その他、下記のライブラリも必要となりますので準備します。

pip install beautifulsoup4
pip install requests

2.Word Cloudの作成

準備もできたので、早速コードを書いていきます。
最初は必要ライブラリのインポートです。

# ライブラリのインポート
%matplotlib inline
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from bs4 import BeautifulSoup
import requests
import MeCab as mc

MeCabをつかって単語を切り出してリストに詰める関数です。
可視化して意味がありそうな単語を抽出するために品詞は名詞、動詞、形容詞、副詞に限定しています。

def mecab_analysis(text):
    t = mc.Tagger('-Ochasen -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-ipadic-neologd/')
    enc_text = text.encode('utf-8') 
    node = t.parseToNode(enc_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
    return output

BeutifulSoupをつかってURLで指定したテキストを取り込みます。QiitaのHTML構造に応じて本文のみ抽出できるようにしています。

def get_wordlist_from_QiitaURL(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text)
    text = soup.body.section.get_text().replace('\n','').replace('\t','')
    return mecab_analysis(text)

ここからが本番、Word Cloudの生成です。あまり意味のない単語をストップワードとして指定することで除外することができますので、これを使います。
また、Macで実施する場合はフォントの指定が必要なため、font_pathを指定します。

def create_wordcloud(text):

    # 環境に合わせてフォントのパスを指定する。
    #fpath = "/System/Library/Fonts/HelveticaNeue-UltraLight.otf"
    fpath = "/Library/Fonts/ヒラギノ角ゴ Pro W3.otf"

    # ストップワードの設定
    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=fpath, width=900, height=500, \
                          stopwords=set(stop_words)).generate(text)

    plt.figure(figsize=(15,12))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

以上が必要な処理の関数定義でしたので、これらを使ってWord Cloudを作成します。
各単語を空白区切りにして1つの文字列にしてWord Cloud作成関数に渡します。

@t_saeko さんの記事「炎上案件に突如ディレクターとして投入されたときにやってみたこと」を題材にさせていただこうと思います。(最近読んで面白かったので)

url = "http://qiita.com/t_saeko/items/2b475b8657c826abc114"
wordlist = get_wordlist_from_QiitaURL(url)
create_wordcloud(" ".join(wordlist).decode('utf-8'))

なかなかいい感じです!
wordcloud-compressor.png

コードの全文はgistにアップしています。