★データ解析備忘録★

ゆる〜い技術メモ

Python3.5でワードクラウドを描く

Pythonでワードクラウドを描く方法は、すでに結構な数の記事があるので、基本はそこを見ればいけます。
なので、今更僕が解説するようなことはしません。
例えば
qiita.com
ライブラリの入れ方も丁寧に説明してくださってます。
今回もこのページをほぼそのままトレースさせていただいてます。

ただ、上のページはPython2系でやっているので、最新のPython3.5でやったらどうなるのかを試してみます。


今回のスクレイピングの題材は、
モダンな日本語 TeX 環境を整える - Qiita
でいきます。理由は特にありません。

環境はMacOS X)です。

# coding:utf-8

import matplotlib.pyplot as plt
from wordcloud import WordCloud
from bs4 import BeautifulSoup
import requests
import MeCab as mc

def mecab_analysis(text):
    t = mc.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/")
    t.parse('')
    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
    return output


def get_wordlist_from_QiitaURL(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text, "lxml")

    text = soup.body.section.get_text().replace('\n','').replace('\t','')
    return mecab_analysis(text)
    
def create_wordcloud(text):

    fpath = "/Library/Fonts/ヒラギノ角ゴ Pro W3.otf"

    # ストップワードの設定
    stop_words = [ 'てる', 'いる', 'なる', 'れる', 'する', 'ある', 'こと', 'これ', 'さん', 'して', \
             'くれる', 'やる', 'くださる', 'そう', 'せる', 'した',  '思う',  \
             'それ', 'ここ', 'ちゃん', 'くん', '', 'て','に','を','は','の', 'が', 'と', 'た', 'し', 'で', \
             'ない', 'も', 'な', 'い', 'か', 'ので', 'よう', '', 'れ','さ','なっ']

    wordcloud = WordCloud(background_color="black",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()
    
url = "http://qiita.com/ynakayama/items/706ae9e59c1b6fd3e3d2?utm_content=bufferb4cb8&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer"
wordlist = get_wordlist_from_QiitaURL(url)
create_wordcloud(" ".join(wordlist))

出力

f:id:songcunyouzai:20160122215259p:plain
やっぱりタイトルにあるワードがでかいですね。
せっかくなので背景を黒くしてみました。
このあたりの引数とかの説明は
http://amueller.github.io/word_cloud/index.html
に載ってたりします。


ストップワードの設定はもう少しうまくやれる方法はないかなーと思ったのですが、
Python弱者のため分かりませんでした*1
これだと作るたびに手動チューニングになってしまうので、もう少し効率的に書けないかなーと思います。

また、形態素解析の辞書としてipadic-neologd*2を使っているので、それを使わないときは

t = mc.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/")

t = mc.Tagger("-Ochasen")

とします。

さらに、今回は題材がQiitaだったので楽でしたが、javascriptの部分を取ってこようとかいうときは

text = soup.body.section.get_text().replace('\n','').replace('\t','')

の部分の書き方が変わってきます。

*1:ちなみに、英語のストップワードリストはかなりあるようです。

*2:overlastさんによる、MeCabのための固有名詞に強い辞書→ GitHub - neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic