축구 일본 대표전의 고조도를 시각화해 보았다

동기



오랫동안 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 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 : 遠藤

    음, 예상대로 결과가 느껴졌습니다.

    코멘트 모집중

    좋은 웹페이지 즐겨찾기