動機
思い久しぶりにTwitter使って何か作ってみようと思ったわけです。
ただ、題材が思いつかない。。。
そしたら、巷ではサッカーワールドカップ盛り上がってるらしいじゃないですか。
もちろん、僕も夜な夜なサッカー中継見ながら次の日死んでる輩の1人な訳ですが。
サッカー観戦情報を可視化してみよう☆と思ったわけです。(24日17時頃)
丁度夜には日本VSセネガルが控えてた訳で、さっそくPythonとMySQLを使って作ってみたわけです。
##実行環境
- MacBookPro
- MySQL(Docker)
- Python3.6
いざ準備
日本戦まで時間もなかったのでとりあえず、動くものを作る。
完成したソースコードはGithubで公開しています。
ミスや改善点あればコメントください。
起動方法
この辺の説明に関しては調べたら無限に出てくるので割愛
- 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
まぁこの辺に関しては希望があったら詳しく書く。
実行結果
3時間ほど実行して約38,000件ほどのツイートデータが集まった。
可視化した結果が下の画像
中々面白い。最悪中継見なくても何があったか分かるんじゃないかくらいにはなる。
今後の展望
ツイート内容も保存しているので自然言語解析とかすれば選手のスコア付とかも出来るんじゃないかとは思うけど、そんな能力ないので今回はここまで。
次の日本戦までにまた何かアイディア思い付いたら実装してみよ。
その後Part1
集めたデータに対してワードカウントを行い、どの選手が一番呟かれてるかを取得してみた
# ------------------------------------------
# モジュールインポート
# ------------------------------------------
# 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 : 遠藤
まぁ、予想通りの結果って感じでしたね