Python2.7 の Word Cloud で AWS Summit 2018 のトレンド分析(風なこと)してみた

python2.7でwordcloudを作成する方法のメモ

AWS Summit 2018 の講演タイトルの頻出単語から、トレンド分析（風）なことをやってみた。

結果はこちら

![wordcloud_sample2_title.png](https://qiita-image-store.s3.amazonaws.com/0/112537/e9a76b83-086a-d9dd-9a50-4b0c5b4cc136.png)

キーワード的には
・セキュリティ
・機械学習
・IoT
・データ
あたりが上位。

金融やエッジというキーワードも気になるところ。

※結果はややチューニング次第なので、あくまで今回の試行結果です。

#Word Cloudの作り方

参考）
https://qiita.com/kenmatsu4/items/9b6ac74f831443d29074
https://qiita.com/nekoumei/items/b1afca7cfb9e54303ab4

##試した環境
・OS：Windows 10
・anaconda
・jupyter notebook
・python 2.7

##全体の流れ
![flow.png](https://qiita-image-store.s3.amazonaws.com/0/112537/17b3a551-82c0-cf8a-1f5f-2b138c8dbc06.png)

AWSのWEBサイトからセッション情報をGETして、タイトル文のみパースする。
その後日本語文を形態素解析して単語で分離し、それを入力値としてWordCloudを作成する。
最後はその結果を出力する流れ。

##使うツール/ライブラリ

・WordCloud（Python用WordCloud作成ライブラリ）
https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html

・BeautifulSoup（Python用HTML/XMLパースライブラリ）
https://www.crummy.com/software/BeautifulSoup/bs4/doc/

・MeCab（オープンソース形態素解析エンジン）
http://taku910.github.io/mecab/

・Matplotlib（可視化ライブラリ）
https://matplotlib.org/

##ソース

```py

#coding: utf-8

import urllib2
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import MeCab as mc
import matplotlib.pyplot as plt
%matplotlib inline

## WEBスクレイピング + Parse ############
# アクセスURL(AWSのセッションサイト)
url = "https://www.awssummit.tokyo/tokyo_session/session/"

# html取得
html = urllib2.urlopen(url)

# BeautifulSoupで扱う
soup = BeautifulSoup(html, "html.parser")

# タイトルを取得
text = ','.join([e.string for e in soup.find_all("h3")
                  if e.string!=None and e.name not in ('script','style')])

## 形態素解析 ###########################
# 形態素解析 実行関数
def mecab_analysis(text):
    t = mc.Tagger()
    enc_text = text.encode('utf-8') 
    node = t.parseToNode(enc_text) 
    output = []
    while(node):
            word_type = node.feature.split(",")[0]
            if word_type in ["名詞"]:
                output.append(node.surface)
            node = node.next
    return output


## Word Cloud作成 #######################
# 除外キーワード規定（トレンドと関係なさげな単語を指定。適宜チューニング）
stop_words = [ u'登壇', u'再演', u'同時', u'通訳', u'AWS', u'実現', u'クラウド', \
               u'ため', u'Amazon', u'on', u'事例', u'活用',  \
               u'Tech', u'入門', u'最新', u'利用', u'サービス', u'ベストプラクティス', \
               u'パネルディスカッション', u'管理', u'紹介', u'化', u'こと', u'技術', u'株式会社']

# Word Cloud生成
wordcloud = WordCloud(background_color="white",
    font_path="msgothic.ttc",
    width=1000,height=1000, 
    max_words=200,
    min_font_size=15,
    relative_scaling=0.9,
    stopwords=set(stop_words)).generate(",".join(mecab_analysis(text)).decode('utf-8'))

# 結果出力1（Matplotlib）
plt.figure(figsize=[20,20])
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis("off")

# 結果出力2（ファイル）
wordcloud.to_file("./wordcloud_sample2_title.png")
```

Word Cloudに入力する単語の件数を見たい場合は

```py
from collections import Counter

list = mecab_analysis(text)
ctlist = Counter(list).most_common()

for word in ctlist:
    print str(word).decode("string-escape")
```

を加えると、以下のように確認できる。

```py

('事例', 68)
('登壇', 44)
('様', 44)
('活用', 36)
('クラウド', 30)
('入門', 28)
：
```

#はまりどころ

主に、形態素解析（MeCab）で色々はまったメモ

###[1] MeCabのインストール/環境設定

anaconda navigatorからターミナルを起動してpipで入れようとしても下記のエラーに。

```bash
>pip install mecab
Collecting mecab
  Could not find a version that satisfies the requirement mecab (from versions: )
No matching distribution found for mecab
```

```bash

>pip install mecab-python
Collecting mecab-python
  Using cached https://files.pythonhosted.org/packages/86/e7/bfeba61fb1c5d1ddcd92bc9b9502f99f80bf71a03429a2b31218fc2d4da2/mecab-python-0.996.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "c:\users\optim\appdata\local\temp\pip-install-hmqt9j\mecab-python\setup.py", line 13, in <module>
        version = cmd1("mecab-config --version"),
      File "c:\users\optim\appdata\local\temp\pip-install-hmqt9j\mecab-python\setup.py", line 7, in cmd1
        return os.popen(str).readlines()[0][:-1]
    IndexError: list index out of range

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in c:\users\optim\appdata\local\temp\pip-install-hmqt9j\mecab-python\
```

色々試行錯誤し、以下の辞書データを含むインストーラ実行で成功した（気がする）
https://github.com/ikegami-yukino/mecab/releases/tag/v0.996

また、Windows側の環境変数でPathの設定も必要

例）
```C:\Program Files\MeCab\bin```


###[2] ユーザ辞書の追加

「EC2」が ECと2で別れたり、IoTを名詞として含めなかったりしたので、ユーザ辞書を追加して補完。

参考）
http://fqz7c3.hatenablog.jp/entry/2013/07/27/193232

手順）

①C:\Program Files\MeCab\dic\ipadic\user.csv を作成

例えばこんな感じ

```
データサイエンティスト,-1,-1,1000,名詞,一般,*,*,*,*,データサイエンティスト,データサイエンティスト,データサイエンティスト
機械学習,-1,-1,1000,名詞,一般,*,*,*,*,機械学習,キカイガクシュウ,キカイガクシュウ
EC2,-1,-1,1000,名詞,一般,*,*,*,*,EC2,イーシーツー,イーシーツー
可視化,-1,-1,1000,名詞,一般,*,*,*,*,可視化,カシカ,カシカ
クラウド,-1,-1,1000,名詞,一般,*,*,*,*,クラウド,クラウド,クラウド
ベストプラクティス,-1,-1,1000,名詞,一般,*,*,*,*,ベストプラクティス,ベストプラクティス,ベストプラクティス
パネルディスカッション,-1,-1,1000,名詞,一般,*,*,*,*,パネルディスカッション,パネルディスカッション,パネルディスカッション
Deep Dive,-1,-1,1000,名詞,一般,*,*,*,*,Deep Dive,ディープダイブ,ディープダイブ
生産性,-1,-1,1000,名詞,一般,*,*,*,*,生産性,クラウド,クラウド
バックエンド,-1,-1,1000,名詞,一般,*,*,*,*,バックエンド,バックエンド,バックエンド
コンタクトセンター,-1,-1,1000,名詞,一般,*,*,*,*,コンタクトセンター,コンタクトセンター,コンタクトセンター
コンサル,-1,-1,1000,名詞,一般,*,*,*,*,コンサル,コンサル,コンサル
IoT,-1,-1,1000,名詞,一般,*,*,*,*,IoT,アイオーティー,アイオーティー
Alexa,-1,-1,1000,名詞,一般,*,*,*,*,Alexa,アレクサ,アレクサ
Serverless,-1,-1,1000,名詞,一般,*,*,*,*,Serverless,サーバーレス,サーバーレス
DevOps,-1,-1,1000,名詞,一般,*,*,*,*,DevOps,デブオプス,デブオプス
ワークロード,-1,-1,1000,名詞,一般,*,*,*,*,ワークロード,ワークロード,ワークロード
```

②コマンドプロンプトで以下実行

```bash

>cd C:\Program Files\MeCab\dic\ipadic
>mecab-dict-index -f utf-8 -t utf-8  -u user.dic user.csv
```

以下となればOK

```bash
reading user.csv ... 17
emitting double-array: 100% |###########################################|

done!
```

###[3] 記号が名詞扱いに（ゴミを除去）

「【 」とか記号が名詞としてカウントされてしまう問題対策

参考）
http://nymemo.com/mecab/564/

C:\Program Files\MeCab\dic\ipadic\unk.def

を以下の通り編集する。

before)

```
SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*
```

after)

```
SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*
```

最後に辞書を再読み込み

```bash
>cd C:\Program Files\MeCab\dic\ipadic
>mecab-dict-index
```

###[4] python文字エンコード

utf-8 と string などのエンコードで出力が文字化けするケースが多い。

標準出力する際は、ケースバイケースだが以下対処で解消。

```py
str(word).decode("string-escape")
```