てっしーの雑記

主に技術系のネタを

ツイートをバブルチャートで可視化してみる

またまたPythonです
Qiitaで以下の記事を発見しました

qiita.com

面白そうというのとPythonだけでもイケる?ということで真似させていただきました(勝手にごめんなさい<( )>)

環境

TwitterAPIでツイートを検索

ツイート検索APIを使ってハッシュタグのツイートを検索します
APIを利用するために Twitter Developer Platform — Twitter Developers でアプリケーションの登録をします
登録ができると4種類キーが発行されるのでメモしておいてください.API実行で必要となります

  • CONSUMER_KEY
  • CONSUMER_SECRET
  • ACCESS_TOKEN
  • ACCESS_TOKEN_SECRET
session = OAuth1Session(settings.TWITTER['CONSUMER_KEY'], settings.TWITTER['CONSUMER_SECRET']
                        , settings.TWITTER['ACCESS_TOKEN'], settings.TWITTER['ACCESS_TOKEN_SECRET'])
yesterday = datetime.date.today() - datetime.timedelta(1)
params = {'q': u'#lovelive', 'count': 200, 'lang': 'ja', 'until': yesterday.strftime("%Y-%m-%d")}
response = session.get('https://api.twitter.com/1.1/search/tweets.json', params=params)

#lovelive タグが付いている昨日ツイートを200件検索しています
TwitterAPIには色々制限があるようで、一度に検索できる件数に上限があるようなので件数指定を行っています

制限対策

件数以外にも何度かAPIを実行しているとwait時間がAPIの結果に設定されてきます
だいたい15分程度の時間が返ってきますが念のため+5秒待つようにしてみました

sec = int(response.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple())
print("{0}---{1} sec sleep".format(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"), sec))
time.sleep(sec + 5)

ファイル書き込み

取得できたファイルをSparkで解析させるためにファイルに書き込みます
そのときに不要となるツイートを除去しておきます

params['max_id'] = max_id は200件以降のツイートを取得するために指定します

res_text = json.loads(response.text)

max_id = ""
for tweet in res_text['statuses']:
    match = re.search(r'(全員|ふぁぼ|ファボ|定期|相互|RT)', tweet['text'], re.MULTILINE)
    if match is None:
        f.write(tweet['text'] + '\n')
    max_id = tweet['id']

params['max_id'] = max_id

文言解析

ツイートを単語に切り分けてお好みで不要な文言も除きます

①:検索ワードに使ったハッシュタグを除外
②:ハッシュタグを除外 ③:2文字以下の文言は除外
などなど

textfile = sc.textFile("tweets.txt")

words = textfile.flatMap(lambda line: line.split())
words_filter = words.filter(lambda x: SEARCH_KEYWORD not in x)  # ①
words_filter = words.filter(lambda x: "#" not in x)  # ②
words_filter = words.filter(lambda x: len(x) >= 2)  # ③

words_tuple = words_filter.map(lambda word: (word, 1))
words_count = words_tuple.reduceByKey(lambda a, b: a + b)
words_count_sorted = words_count.sortBy(lambda t: t[1], False)

D3.jsのバブルチャート表示

名称と値をD3.jsにJSONで渡してあげると簡単にチャートを表示することができます

f:id:chichi1091:20180326001023p:plain

まとめ

TwitterAPIの制限でツイート集めに多少の時間が掛かるのが難ですが、比較的かんたんに作れたかと思います
参考にさせていただいたAKB428様ありがとうございました!

今回作ったソースはGitHubにあげてあります

github.com