8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【python】TwitterAPIからツイートをBigQueryに取得、公開するデータ基盤をGCPに構築した(ネガポジスコア付)

Posted at

はじめに

初投稿です。
社内向けにTwitter APIからツイートをBigQueryに取得、公開するデータ基盤をGCP上に構築したので、備忘録と今後のtodoリストも兼ねて投稿します。

データ基盤構築とGCPを利用するのは初めてなので、何か気が付いた方はコメント頂ければ嬉しいです。
datapotal.JPG

開発環境

Google Cloud Platform
python3系

概要

スプレッドシートに記載されているキーワードをもとに、Twitter APIからツイート内容を取得してネガポジスコアを算出し、BigQueryに保存してDataPotalで表示&ダウンロード。

GCSとBigQueryに保管するロジックは、Cloud Functions上にpythonで構築しています。

Cloud Schedulerで1日1回実行するように設定しているため、初期設定さえすれば後は毎日全自動で取得してきてくれます。
gcp-twitter.JPG

解説

#① TwitterAPIでツイートを取得
Standard Search APIを利用するためには、英語で申請が必要です。
申請に関してはこちらを参考にしました。
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ

また、Standard Search APIによる取得は以下のような制限があります。
・1回で最大100ツイート
・15分で180回リクエスト
・取得できるツイートは過去7日間まで

15分間で最大18000ツイートまでしか取得できません。
15分経過すれば、リクエスト回数が180回に戻ります。
ここら辺はロジックを組めば何とかなりますが、7日以上前のツイートは取得できません。
本格的に取得したい場合は、有償のAPIを利用することでほぼ無制限に取得することができます。(どこまでもお金が必要)

Twitter APIに関してはこちらのページを30回以上見ました。
500万件を超えるTwitter のリツイート データを取得・分析する方法

制限あるならスクレイピングすれば良いじゃん、と思う方もいるかもしれませんが、Twitterのスクレイピングは規約で禁止されているので自重しましょう。
#② Cloud FunctionsでツイートをCloud Storageに保管
Cloud FunctionsはJavaScriptやpythonをクラウド上で動作できるサービスです。
2019年からpythonの3系も利用できるようになりました。

Googleドライブ上のスプレッドシートから、あらかじめ入力しておいたキーワードを取得して、Twitter APIに投げます。
帰ってきたjsonをcsvに変換して、1日分のツイートをCloud Storageに保管します。
gcs.JPG

取得したツイート内容を直接BigQueryに保管しても良かったのですが、データ基盤を勉強している時に「データレイク」「データウェアハウス」「データマート」という概念を知ったので、一度Cloud Storageに保管しています。
データを限定して保管すると、あとから「あ、この項目も欲しかった!」なんてことになるかもしれないですしね。

データ基盤の概念についてはこちらを参考にしました。
データ基盤の3分類と進化的データモデリング

データレイクは「元データをコピーしたもの」と位置付けられているため、本来はcsvではなくjson形式で保管したかったのですが、エラーがでまくってやり方が分からなかったため断念しました。

#③ Cloud Schedulerでツイート取得を定期実行
Cloud Schedulerは安価で簡単に利用することの出来るcronサービスで、oogle Pub/Sub のトピックへのメッセージ送信が可能です。
一言でいうと、日時を指定してCloud Functionsの実行が可能です。

ペイロードに値を設定することで、Cloud Functionsでその値を利用することができます。
現在はキーワードを入力しているスプレッドシートの行数を指定しているので、取得したいキーワードの数だけCloud Schedulerを設定しています。

また、①で記載したTwitter APIの制限もあるため、キーワードごとに15分の間隔を空けて実行しています。
有償のTwitter APIを契約できればこの辺りの仕組みは変わってくると思います。

#④ Cloud StorageからBigQueryにネガポジスコアを追加して保管
ここでもCloud Functionsを利用しています。
pythonで感情分析を実施し、スコア化しています。
データフレームで処理しているためBigQueryへの保管はto_gbqを使っています。
pandas.DataFrame.to_gbq

to_gbqのtable_schemaでBigQueryのスキーマを指定しておかないと、ほとんどnullの項目(geo等)を保管する際に「スキーマが違う!」と怒られる場合があるので注意が必要です。

感情分析に関しては以下のサイトを参考にしましたが、まだまだ精度が低いため、精度を上げることが今後の課題です。
ツイートのデータセットが手元に約50万件あるので、これを利用してtwitterに特化した感情分析ツールを作成したいと思っています。
ディープラーニングでネガポジ分析アプリを作ってみた(python)

今回は感情分析がメインのため、BOTやリツイートを除外しています。
BOTに関しては、sourceに「twitter.com」が含まれているものだけを選定、
リツイートはツイート本文が「@ RT」で始まっているものを除外しています。

キャンペーン等でハッシュタグのカウントをしたい場合は、ロジックの変更が必要です。

#⑤ Cloud Schedulerで④を実行
③とやっていることは同じです。
Cloud Storageへの保管をトリガーにCloud Schedulerで実施します。

#⑥ BigQueryに保管
キーワードごとにテーブルが存在します。
Twitterの時刻が協定世界時(UTC)になっている関係で、前日午前9時~当日午前9時のツイート内容を保管しています。
ツイート内容の他に、ツイート日時、アカウント情報、ネガポジスコア等を保管しています。

#⑦ DataPotalで公開
会社でGsuiteを契約しており、社員全員がGoogleアカウントを利用できるため、DataPotalでツイート内容を表示&ダウンロードができるようにしています。
csvでダウンロードすればもちろんですが、DataPotal上でもネガポジスコア順に並び替えることができます。
この部分はまだ全然触っていなくて、現在は期間指定のみですが、今後はフィルタや項目を追加していきたいと思います。

Tableauにも興味があったのですが、トライアルに申込したら認証メールが返ってこなくて断念しました。またの機会にチャレンジします。

今後の課題、やりたいこと

・キーワードが増えてきた際に、GCPの課金やロジックを変更しなければならない
・感情分析の精度UP、又はNLPを利用
・分かち書き(Mecab + NEologd)で一緒につぶやかれているワードを表示させる
・ツイートのアカウント情報からインフルエンサー影響スコアを算出、プライベートグラフやインタレストグラフ、ツイ廃等の分類を実施

最後に

python最強。検索すれば95%でてくる。英語分かれば99%でてくる。
小官にとっちゃ毎日が検索、全人類に感激感謝。

JupyterNotebookでGCPを扱うことができるので、コードのテストはJupyter上で行ったほうが良いです。(Cloud Functionsのデプロイがめっちゃ遅い)

他にも嵌った部分があったと思うので、コードも含めて今後公開していきたいと思います。

面白いこと、できることあったら教えてください。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?