トップ «前の日記(2017/11/25) 最新 次の日記(2018/01/09)» 編集

kaztomo日記


2017/11/29 [長年日記]

_ [Python]URLを入力したら wordcloud を作成&表示する CGIを作ってみた

wordcloud が作れる環境が出来たんで、 jupyter notebook 上で色々と URLを変えてみて wordcloud を表示して楽しんではみたものの、 毎回チマチマと URL文字列を修正して ctrl+ret するのが面倒になってきた (+_+)

そこで URLを入力したら wordcloud を作成&表示する CGIを作ってみたらいい感じに (^o^)/

FreeBSD-10.3R
Python2.7 + requests-2.8.4 + BeautifulSoup4-4.5.1
+ mecab-python-0.996post2
+ matplotlib-1.5.3post0 + wordcloud-1.3.1
mecab-ipadic-neologd を使用
  • URL入力

画像の説明

  • wordcloud 表示結果

画像の説明

コードはいつものごとくエッセンスのみで (^^;

from wordcloud import WordCloud
from bs4 import BeautifulSoup, NavigableString, Declaration, Comment
import requests
import MeCab as mc

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

html_body = u"""
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head>
<body>
%s
<br>
<img src="%s">
</body>
</html>"""

# wordcloud.html で入力された URL を取得する
form = cgi.FieldStorage()
url_str = form.getvalue('urls', '')

# URL で指定されたサイトのテキストからワードリスト(utf-8)を作成する
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
res = requests.get(url_str, timeout=10, headers = headers)

# エンコーディングが正しく取得できていないようなので制御を追加
res.encoding = res.apparent_encoding

# BeautifulSoupでタグを除去してテキストだけ抜き出す
soup = BeautifulSoup(res.content, "lxml")
text = '\n'.join(getNavigableStrings(soup))

# 形態素解析
wordlist = mecab_analysis(text)

# unicode化した文字列をスペース区切りで連結し、WordCloud を作成
_str = " ".join(wordlist).decode('utf-8')
create_wordcloud(_str, img_file)

print (html_body % (url_str, img_file)).encode('utf-8')

最後に、Google News を wordcloud してみたけど全くニュース感がない (>_<)

画像の説明

stopwords を工夫するか、個別ニュースに限定するしかないんだろうなぁ


参考にさせていただいたサイト: