サッカー日本代表戦の盛り上がり度を可視化してみた

## 動機
思い久しぶりにTwitter使って何か作ってみようと思ったわけです。
ただ、題材が思いつかない。。。

そしたら、巷ではサッカーワールドカップ盛り上がってるらしいじゃないですか。
もちろん、僕も夜な夜なサッカー中継見ながら次の日死んでる輩の１人な訳ですが。

サッカー観戦情報を可視化してみよう☆と思ったわけです。(24日17時頃)
丁度夜には日本VSセネガルが控えてた訳で、さっそくPythonとMySQLを使って作ってみたわけです。

##実行環境
* MacBookPro
* MySQL(Docker)
* Python3.6

## いざ準備
日本戦まで時間もなかったのでとりあえず、動くものを作る。
完成したソースコードは[Github](https://github.com/yakult1995/twitter_stream)で公開しています。
ミスや改善点あればコメントください。

## 起動方法
この辺の説明に関しては調べたら無限に出てくるので割愛

  * MySQLのパスワードを設定する(./docker/mysql/password.yml と ./app/db/db_conf.py)
  * MySQLのデータベース名を設定する(./app/db/db_conf.py)
  * Twitterの認証情報を入力する(./app/twitter_stream.py)
  * docker-composeの起動
  ```docker-compose up -d```  
  * 立ち上がったらMySQLクライアントでdb_conf.pyに設定したデータベースを作成する
  * 検索ワードの指定(./app/twitter_stream.py)(今は"ワールドカップ"が設定されてます)
  * pythonの実行
  ```python twitter_stream.py``` 
  * しばらくデータを集めたらanalytics.pyで可視化出来る
  ```python analytics.py```  

まぁこの辺に関しては希望があったら詳しく書く。

## 実行結果
３時間ほど実行して約38,000件ほどのツイートデータが集まった。
可視化した結果が下の画像
![IMG_5960.JPG](https://qiita-image-store.s3.amazonaws.com/0/155875/cdf0e5f8-fc13-bb93-9ccb-8eb0e03d27f1.jpeg)
中々面白い。最悪中継見なくても何があったか分かるんじゃないかくらいにはなる。

## 今後の展望
ツイート内容も保存しているので自然言語解析とかすれば選手のスコア付とかも出来るんじゃないかとは思うけど、そんな能力ないので今回はここまで。
次の日本戦までにまた何かアイディア思い付いたら実装してみよ。

## その後Part1
集めたデータに対してワードカウントを行い、どの選手が一番呟かれてるかを取得してみた

```python
# ------------------------------------------
# モジュールインポート
# ------------------------------------------
# sqlalchemy
from sqlalchemy.orm import *

# DB設定ファイル
from db.db_conf import ENGINE
from db.twitter import Tweet

# MeCab
import MeCab

# ワードカウント
from collections import Counter

# ------------------------------------------
# 変数宣言
# ------------------------------------------
# W杯の日本選手
japanese_player = ['本田', '香川', '長友', '乾', '岡崎', '長谷部', '大迫', '柴崎', '武藤', '吉田', '酒井', '宇佐美', '川島', '槙野', '原口', '大島', '山口', '昌子', '東口', '中村', '遠藤', '植田', '西野']

# セッション作成
Session = sessionmaker(bind=ENGINE)
db_session = Session()

# MeCab設定
mecab = MeCab.Tagger ("-Ochasen")

# 最終的な結果格納用
word_counter = Counter()

# tweets = db_session.query(Tweet).all()
tweets = db_session.execute("select * from tweet.tweets where tweetd_at between '2018-06-25 00:00:00' and '2018-06-25 01:45:00'")

# MeCabのリストから名詞だけ抜き出す
def fetch_norm(list):
    if '名詞' in list[3]:
        return list[0]

for tweet in tweets:
    # 事前処理
    target_str = tweet.tweet.split('https')[0]

    # 形態素解析
    # 改行で分けてリスト化
    mecabed = mecab.parse(target_str).split('\n')
    # 各単語を\tで分割してリスト化(最後の改行記号とか放置)
    mecabed = list(map(lambda x: x.split('\t'), mecabed[:-2]))
    # 単語の情報だけ抜き出し
    mecabed = list(map(fetch_norm, mecabed))
    # 名詞じゃないリスト要素を消去
    mecabed = list(filter(None, mecabed))

    # ワードカウント
    word_counter += Counter(mecabed)

    # 結果表示
    print('{} : {}({})'.format(tweet.id, mecabed, tweet.tweetd_at))

# 最終結果
for word, cnt in word_counter.most_common():
    # 日本人選手だったら
    if word in japanese_player:
        print('{} : {}'.format(cnt, word))
```

日本戦が行われていた時間のみのツイートを取得して呟き回数の多い選手から並べてみた結果がこちら
(呟かれた回数) : (選手名)
```
2179 : 乾
2145 : 本田
1836 : 川島
779 : 大迫
581 : 長友
575 : 柴崎
452 : 西野
451 : 長谷部
312 : 香川
289 : 岡崎
242 : 原口
168 : 宇佐美
92 : 吉田
92 : 昌子
76 : 酒井
52 : 武藤
41 : 中村
15 : 東口
12 : 山口
11 : 槙野
10 : 大島
9 : 植田
7 : 遠藤
```

まぁ、予想通りの結果って感じでしたね

## コメント募集中