Python3.5でワードクラウドを描く
Pythonでワードクラウドを描く方法は、すでに結構な数の記事があるので、基本はそこを見ればいけます。
なので、今更僕が解説するようなことはしません。
例えば
qiita.com
ライブラリの入れ方も丁寧に説明してくださってます。
今回もこのページをほぼそのままトレースさせていただいてます。
ただ、上のページはPython2系でやっているので、最新のPython3.5でやったらどうなるのかを試してみます。
今回のスクレイピングの題材は、
モダンな日本語 TeX 環境を整える - Qiita
でいきます。理由は特にありません。
# 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))
出力
やっぱりタイトルにあるワードがでかいですね。
せっかくなので背景を黒くしてみました。
このあたりの引数とかの説明は
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