지정된 계정의 트윗을 WordCloud에서 시각화하는 방법

「Twitter 데이터를 사용해, 뭔가 재미있을 수 없는가」의 제3탄입니다.

제1회:
'정전'에 대한 트윗을 파이썬으로 수집하고 WordCloud에서 시각화하려고했습니다.
htps : // m / poc t_ko / / ms / 0f43c9fd 87bd31cf
제2회:
"쿠파 공주"에 관한 트윗을 파이썬으로 수집하여 버스트를 감지했습니다.
htps : // 이 m / Pocke t_Koo / / ms /에서 4b512b8212 53 3

이번에는 간단하게 지정된 계정의 트윗을 얻고,
WordCloud에서 시각화해 보았습니다.

Twitter 데이터는 어떻게 하면 수집할 수 있는 거야?



다음 흐름으로 수집할 수 있습니다.
  • 개발자용 Twitter 계정 등록
  • Twitter API에 사용자 등록
  • API 사용을위한 액세스 키 토큰 얻기
  • Twitter REST APIs에서 데이터 수집

  • 자세한 내용은 제1회 기사을 참조하십시오.

    지정된 계정의 트윗 수집



    우선 라이브러리 로드 등 트윗 수집 준비입니다.
    Twitter REST APIs의 출력은 json 형식이므로 json 라이브러리를 사용합니다.
    또한 python에서 REST API를 쉽게 호출 할 수 있도록 requests_oauthlib 라이브러리를 사용합니다.
    # Twitterデータ収集用のログインキーの情報
    KEYS = { # 自分のアカウントで入手したキーを記載
            'consumer_key':'*********************',
            'consumer_secret':'*********************',
            'access_token':'*********************',
            'access_secret':'*********************',
           }
    
    # Twitterデータの収集(収集準備)
    import json
    from requests_oauthlib import OAuth1Session
    twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],KEYS['access_token'],KEYS['access_secret'])
    

    지정된 계정의 트윗 수집을 위한 함수는 다음과 같이 작성되었습니다.
    user_name(@이후의 계정명)을 인수로 하고 있습니다.
    한 번에 최대 100 트윗 만 검색 할 수 있으므로 for 문으로 여러 번 요청할 수 있습니다.
    # Twitterデータ取得関数
    def getAccountTwitterData(user_name, repeat=10):
    
        url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
        params ={'screen_name':user_name,'exclude_replies':True,'include_rts':False,'count':200} #取得パラメータ
        tweets = []
    
        mid = -1
    
        for i in range(repeat):
            if mid != -1: # 初回のみmax_idの指定を解除する
                params['max_id'] = mid # midよりも古いIDのツイートのみを取得する
            res = twitter.get(url, params = params)
            if res.status_code == 200: #正常通信出来た場合
    
                sub_tweets = json.loads(res.text) #レスポンスからツイート情報を取得
    
                user_ids = []
                for tweet in sub_tweets:
                    user_ids.append(int(tweet['id']))
                    tweets.append(tweet)
    
                # ループで取得したmidよりも古いツイートを取るための工夫(※もっと良い書き方ありそう)
                if len(user_ids) > 0:
                    min_user_id = min(user_ids)
                    mid = min_user_id - 1
                else:
                    mid = -1
                print(mid) # 時系列で見た時に最も古いツイートID
    
            else: #正常通信出来なかった場合
                print("Failed: %d" % res.status_code)
                break
    
        print("ツイート取得数:%s" % len(tweets))
        return tweets
    

    이 함수를 사용하여 특정 사용자의 트윗을 수집해 봅니다.
    총 팔로워 랭킹 1위인 아리요시 히로유키의 계정 ("ariyoshihiroiki") 트윗을 수집해 보세요.
    tweets = getAccountTwitterData("ariyoshihiroiki", repeat=30)
    

    산출:
    1083030050134323201
    1052193588430364671
    1022730204936953855
    996980908119900161
    965901986422927360
    927507559023460352
    901354707137871872
    883995701314584575
    850964015756869631
    823160757894291455
    796014648101175296
    781414278850936831
    763211195511771135
    747450926097563647
    728578679194820607
    708969135716196351
    706835898747367423
    -1
    :
    (중략)
    :
    -1
    트윗 취득 수: 2520

    2520개의 트윗을 수집했습니다.
    일정량의 트윗을 수집할 수 있었지만 Twitter API에서 특정 사용자의 모든 트윗에 액세스하는 것은 사양상 할 수 없는 것 같습니다.

    획득한 트윗을 시각화



    다음과 같은 함수를 정의하고 janome에서 형태소 해석하여 단어의 출현 빈도를 계산한 후 WordCloud에서 시각화했습니다.
    # 文章を形態素解析して、Bag of Wordsに変換する
    from janome.tokenizer import Tokenizer
    import collections
    import re
    
    def CountWord(tweets):
        tweet_list = [tweet["text"] for tweet in tweets]
        all_tweet = "\n".join(tweet_list)
    
        t = Tokenizer()
    
        # 原形に変形、名詞のみ、1文字を除去、漢字・平仮名・カタカナの連続飲みに限定
        c = collections.Counter(token.base_form for token in t.tokenize(all_tweet) 
                                if token.part_of_speech.startswith('名詞') and len(token.base_form) > 1 
                                and token.base_form.isalpha() and not re.match('^[a-zA-Z]+$', token.base_form)) 
    
        freq_dict = {}
        mc = c.most_common()
        for elem in mc:
            freq_dict[elem[0]] = elem[1]
    
        return freq_dict
    

    WordCloud에서 시각화하는 함수
    # Word Cloudで可視化、WordCloud可視化関数
    def color_func(word, font_size, position, orientation, random_state, font_path):
        return 'white'
    
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    get_ipython().run_line_magic('matplotlib', 'inline')
    from matplotlib.font_manager import FontProperties
    fp = FontProperties(fname=r'C:\WINDOWS\Fonts\meiryo.ttc', size=50) #日本語対応
    
    def DrawWordCloud(word_freq_dict, fig_title):
    
        # デフォルト設定を変更して、colormapを"rainbow"に変更
        wordcloud = WordCloud(background_color='white', min_font_size=15, font_path='C:\WINDOWS\Fonts\meiryo.ttc',
                              max_font_size=200, width=1000, height=500, prefer_horizontal=1.0, relative_scaling=0.0, colormap="rainbow")    
        wordcloud.generate_from_frequencies(word_freq_dict)
        plt.figure(figsize=[20,20])
        plt.title(fig_title, fontproperties=fp)
        plt.imshow(wordcloud,interpolation='bilinear')
        plt.axis("off")
    

    아리요시 히로유키의 계정에 포함된 트윗을 시각화해 봅니다.
    freq_dict = CountWord(tweets)
    DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "ariyoshihiroiki")
    

    산출:


    할 수 있었습니다.
    라디오라는 단어와 다나카 씨, 우에시마 씨 등 사이 좋은 멤버의 이름이 두드러집니다.

    덧붙여서 손정의 님의 계정 ("masason") 트윗을 시각화하면 다음과 같습니다.
    tweets = getAccountTwitterData("masason", repeat=30)
    freq_dict = CountWord(tweets)
    DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "masason")
    

    산출:
    329646069589884927
    241826873217257472
    :
    (중략)
    :
    -1
    트윗 취득 수: 3068



    원전 관련 트윗이 눈에 띄는 것을 알 수 있습니다.

    정리와 앞으로



    고급 분석을 위해 노력하면 REST API에서 수집 할 수있는 범위에서 부족한 느낌이 들지만,
    유저 계정마다의 트윗을 간이하게 취득할 수 있는 것을 알았으므로, 응용할 수 있을 것 같은 예감은 합니다.

    Twitter 데이터의 다른 활용 방법에 대해서도 살펴보겠습니다.

    좋은 웹페이지 즐겨찾기