この記事は?
- Google Cloud Platform が使い勝手がいいらしい、無償評価もできるようなので使ってみたい。
- 特定の話題をかき集めて保存しておいてみよう!
- となるとTwitterのデータが扱いやすいかな
- 集めたデータの処理については別途検討。
やりたいこと
- Google Cloud Platform にて仮想マシンを作る
- 作ったマシンでfluentdを起動し、指定のハッシュタグのツイートを集める
- 集めたツイートを保存する ⇒ 固有の話題に関するビッグデータの完成だ(確信)
- 保存したデータは後で活用する
実装
Step0 : 事前準備
Googleのアカウントを取得する
やり方はここでは割愛。
後述のGoogle Cloud Platformの登録にてクレカ登録を行うため、
捨て垢での実装はやめた方がいいと思います。
Google Cloud Platform(GCP)に登録する
Google Cloud Platform: BigQuery から無償評価に登録する。
新規ユーザーの場合 $300 分の無償枠がおまけでついてくので、この範囲で遊ぶ。
登録にクレカ必須なので注意してください。
別画面の設定で、「指定の金額の90%になったらメール通知する」という設定ができるので、
メールが確認できていれば無償評価を終え、課金対象になる前に止められます。
Twitterのアカウントを取得する
やり方はここでは割愛。
後にAPI設定を付与するため、悪用されないようにメール認証と携帯電話番号の登録を済ませましょう。
Twitter での API の設定を行う ( Twitter Streaming API )
Twitter OAuth 認証キーの取得を済ませておきます。
ログイン状態を維持したままTwitter Developers ページ にアクセスし、
画面下部にあるメニューの中、Tools
から Manage my apps
をクリック、
リンク先のページの Create New App
をクリックする。
あとは示される必要項目を埋めていきます。その後使われるパラメータは、
- consumer_key
- consumer_secret
- Access Token
- Access Token Secret
が必要となります。
Step1 : 環境用意 ( Google Cloud Platform / Compute Engine )
GCP上に仮想マシンインスタンス(Compute Engine)を用意します。
Compute Engineの課金についてはこちらを参照するとわかりますが、
最小スペックとなる f1-micro VM インスタンスで、かつ30 GB の HDD 永続ディスク ストレージであれば
Always FreeとしてVM 1台を無料で活用できます。
作成方法は、コンソール画面から Compute Engine
> VMインスタンス
へと進んだ こちら
画面上部の インスタンスを作成
ボタンからポチポチ選んでいけばすぐ使える。早い!便利!
Step2 : Twitterからデータ収集 ( fluentd )
fluentdを利用してTwitterからのデータ収集を行う。
設定作業は概ねQiita記事:Fluentd + BigQuery による Tweet データ収集を参考にした。
私はこれに加え、入れ子になっている構造が不便だったので、
こちらの記事を参考にして、フラットな構造として扱った。
閲覧者の皆様の参考までに、私の環境での設定を下記に共有しておく。
Twitterとしては他にもカラムがあるが、必要な項目のみをjsonとして記載、
fluentdで取得され、不要な項目については無視する(ignore_unknown_values true)ようにしている。
また、「やりたいこと」であるハッシュタグの指定はkeyword として設定している。
<source>
@type twitter
consumer_key <YOUR_CONSUMER_KEY>
consumer_secret <YOUR_CNSUMER_SECRET>
access_token <YOUR_ACCESS_TOKEN>
access_token_secret <YOUR_ACCESS_TOKEN_SECRET>
tag twitter.keyword
timeline tracking
keyword ${hashtag}ハッシュタグの名前
lang ja
output_format nest
</source>
<match twitter.keyword>
@type flatten_hash
tag twitter.keyword.flat
separator _
</match>
<match twitter.keyword.flat>
@type copy
#<store>
# @type file
# path /var/log/td-agent/debug_twitter.log
#</store>
<store>
@type bigquery
method insert
schema_path /opt/td-agent/bq_schema/bq_tweet_flat.json
auth_method private_key
email <YOUR_GOOGLE_PROJECT_EMAIL>
private_key_path /opt/td-agent/google-keys/<YOUR_PROJECT_KEY>.p12
project <YOUR_GOOGLE_PROJECT_NAME>
dataset <DATASET_NAME>
auto_create_table true
table <DATATABLE_NAME>
ignore_unknown_values true
schema_path /opt/td-agent/bq_schema/bq_tweet_flat.json
</store>
</match>
[
{
"name": "created_at",
"type": "STRING"
},
{
"name": "timestamp_ms",
"type": "STRING"
},
{
"name": "text",
"type": "STRING"
},
{
"name": "source",
"type": "STRING"
},
{
"name": "in_reply_to_screen_name",
"type": "STRING"
},
{
"name": "user_name",
"type": "STRING"
},
{
"name": "user_screen_name",
"type": "STRING"
},
{
"name": "user_location",
"type": "STRING"
},
{
"name": "user_time_zone",
"type": "STRING"
},
{
"name": "user_lang",
"type": "STRING"
},
{
"name": "entities_media_0_media_url",
"type": "STRING"
},
{
"name": "entities_media_1_media_url",
"type": "STRING"
},
{
"name": "entities_media_2_media_url",
"type": "STRING"
},
{
"name": "entities_media_3_media_url",
"type": "STRING"
},
{
"name": "retweeted_status_created_at",
"type": "STRING"
},
{
"name": "retweeted_status_text",
"type": "STRING"
},
{
"name": "retweeted_status_source",
"type": "STRING"
},
{
"name": "retweeted_status_in_reply_to_screen_name",
"type": "STRING"
},
{
"name": "retweeted_status_user_name",
"type": "STRING"
},
{
"name": "retweeted_status_user_screen_name",
"type": "STRING"
},
{
"name": "retweeted_status_user_location",
"type": "STRING"
},
{
"name": "retweeted_status_retweet_count",
"type": "INTEGER"
},
{
"name": "retweeted_status_favorite_count",
"type": "INTEGER"
},
{
"name": "retweeted_status_entities_hashtags_0_text",
"type": "STRING"
},
{
"name": "retweeted_status_entities_media_0_media_url",
"type": "STRING"
},
{
"name": "retweeted_status_entities_media_1_media_url",
"type": "STRING"
},
{
"name": "retweeted_status_entities_media_2_media_url",
"type": "STRING"
},
{
"name": "retweeted_status_entities_media_3_media_url",
"type": "STRING"
}
]
Step3 : データの保存 ( Google Cloud Platform / BigQuery )
取得確認
データが取得できているか?についてはGoogle BigqueryのGUIから確認できる…が、
Googleのデータ保存の性質上、すぐには画面上に反映されない。
その場合、CUIからbigqueryに対しクエリを叩いてデータを取得する。
$ bq head -n 15 <YOUR_GOOGLE_PROJECT_NAME>:<DATASET_NAME>.<DATATABLE_NAME>
---ずらずらと結果が15行出力される---
$ bq query "SELECT entities_media_0_media_url FROM [<YOUR_GOOGLE_PROJECT_NAME>:<DATASET_NAME>.<DATATABLE_NAME>] WHERE entities_media_0_media_url IS NOT NULL GROUP BY 1 limit 15"
Waiting on bqjob_r147fcaa79d4dbff_0000015d5a0ba870_1 ... (0s) Current status: DONE
+------------------------------------------------+
| entities_media_0_media_url |
+------------------------------------------------+
| http://pbs.twimg.com/media/hogehoge.jpg |
+------------------------------------------------+
注意
ここでも注意しなければいけないのは課金額である。
細かいことはBigQueryのドキュメント:課金についてを確認してもらいたいが、大雑把に言えば
- データを継続的に貯めこみ続けると課金(ストリーミングインサート)
(GoogleCloudStorageからの導入や、「一回CSVから取り込む」などは課金されない) - ずっとデータを保存しておくと課金
(ただし、長いことデータにアクセスしていない状態になれば課金対象から外れる) - クエリを発行してデータを取り出すと課金
(ただし毎月 1 TB まで無料)
である。個人利用においてはできるだけクエリ発行は無料範囲で押さえたい。
Step4 : 可視化 (FooBarBaz)
さぁ集めたデータをどう料理してやろうか
本来はここが一番肝の部分となります…が、まだデータ収集を始めたばかりの段階ではあまり旨みがなく、
後日料理しようと思います。
やりたいことに合わせて道具を選定しましょう。
以下にいくつかツール名を出しておきます。
- Google Data Studio
- Google Cloud Datalab
- Microsoft Power BI
- Tableau
- QlikView
課金制度や機能差異などどれも一長一短なので、利用シーンに合わせて選びましょう。
個人利用となると、無料でサクッと使えるGoogle Data Studio、機械学習に使えるGoogle Cloud Datalabしかない気もしますが、
ビジネスシーンだとすると美麗なグラフが描けるTableauなども視野に入りそうです。
終わりに
さてさて、これで特定の話題に関するツイート収集ができるわけです。
お仕事だったらもっと広く情報を集め、そこから分析をしなければなりませんが、
今回はあくまで個人利用。大切なことは、
どのハッシュタグを使って自分の役に立つビッグデータとするかです。
例えば、#ニチアサ であればその週のプリキュアの展開について賛否ある内容の分析ができるでしょうし、
はたまた #共謀罪 などであれば世の中の面白ツイートの分析ができるでしょう。
固有の話題とはいえ、扱い方によって面白いことができそうです。
この記事が皆様の参考となりますように。
以上