じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

アイドルのブログからword_cloudを生成するオタク気持ち悪い()

概要

僕自身が精神的に追い込まれると何も進捗を生やせなくなるアイドルオタクになる。 しかし、怠惰なオタクはアイドルの全ブログを読んでチェックしていくわけにはいきません。そこでワードクラウドを用いてアイドルが何に興味があるかどのような発言をブログ上で行うかを解析したいと思います。
なお、今回のブログの文章の取得元は私の趣味に依存しないものとします。

環境

パッケージのインストールとか面倒だけどがんばれ~()

実装

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
from wordcloud import WordCloud
import MeCab as mc
from bs4 import BeautifulSoup
import sys
from urllib import request
import time
import re 



def mecab_analysis(text):
    t = mc.Tagger("-Ochasen")
    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_blog(url):
    headers = {
                    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
                                          }
    req = request.Request(url, None, headers)
    res = request.urlopen(req)
    soup = BeautifulSoup(res.read(),'html.parser')
    #soup = soup.find(class_="box-article")
    text = soup.get_text()
    return mecab_analysis(text)
    #return text


def create_wordcloud(text):
    fpath = "/usr/share/fonts/truetype/takao-mincho/TakaoExMincho.ttf"
##ブロックする文字
    stop_words = [ 'てる', 'いる', 'なる', 'れる', 'する', 'ある', 'こと', 'これ', 'さん', 'して', \
                   'くれる', 'やる', 'くださる', 'そう', 'せる', 'した',  '思う',  \
                   'それ', 'ここ', 'ちゃん', 'くん', '', 'て','に','を','は','の', 'が', 'と', 'た', 'し', 'で', \
                   'ない', 'も', 'な', 'い', 'か', 'ので', 'よう', '', 'れ','さ','なっ',\
                   'update','member','更新']

    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.savefig("graph.png")
    plt.show()

#imoはページ数 ctはメンバー数
def page_info(url):
    url = url + "&ima=" + "0000"
    url = url + "&cd=member&ct=" + "17"
    return url

url = "http://www.keyakizaka46.com/mob/news/diarKiji.php?site=k46o"
url = page_info(url)
wordlist = get_wordlist_from_blog(url)
print(wordlist)
create_wordcloud(" ".join(wordlist))

最後に

f:id:syu-m-5151:20161219001056p:plain

改善点

メンバーのブログを全部解析しているわけではないです。自動取得の部分でブログの本文だけではなく不要なゴミをたくさん集めてしまいました。class_で選んだあとに中身のみを取り出す方法が分からず爆死しておりました。bs4を削除する方法に詳しい方教えてくださいMecabの辞書を作ってメンバーの名前を登録するのが面倒でした…本当にごめんなさい…。

f:id:syu-m-5151:20161219130454p:plain メンバーによって差異があるのとある程度頻出単語が出るので嬉しいです。

改善依頼

cloud_work_keyaki.py · GitHub
blogのURLからbox-articleのみを全て抜き出す方法が知りたいです。Help !!!

オタクとしてこのようなことに利用してしまいましたがワードクラウドは活用方法がおもしろく研究や仕事のいろんな場面で利用できると思います。

参照

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

http://www.keyakizaka46.com/mob/news/diarKiji.php?site=k46o&ima=0000&cd=member

Python3.5でワードクラウドを描く - データ解析備忘録