Buzz ORIGINについて

はじめに 本サイトに興味をお持ちいただき、誠にありがとうございます。
ここでは、本サイト「Buzz ORIGIN」の内容と、バズ起源ツイートとは何なのかについて解説します。
Buzz ORIGINとは? 本サイト「Buzz ORIGIN」は、Twitterのトレンドキーワードをメインとして、いわゆる「バズった」キーワードの起点を探して紹介するためのサイトです。
バズの起点となったツイートを、ここでは「バズ起源ツイート」と呼称しています。
Buzz ORIGIN作成のきっかけ そもそも「Buzz ORIGIN」を作ろうと思ったきっかけは、TwitterのAPIについて使い方を勉強していた時に、期間指定をしてツイートを検索する、という機能があったので、
「あるキーワードを含むツイートの、一番最初のツイートを拾えないだろうか?」
と考えたのです。

トレンド入りしたキーワードやハッシュタグを、一番最初にツイートしたのは誰なのだろう?ということですね。
APIがあるなら、そのくらいは簡単に出来るだろうと思ったのです。

が。

実際にやってみると、以下のようなAPIの仕様による限界があり、ぜんぜん簡単ではないことが分かりました…。

一度に100件しか取得できない
APIで期間とキーワードを指定して、合致するツイートを取得することは簡単に出来るのですが、例えば合致したツイートが1,000件あったとしても、無料版のAPIでは一度のリクエストで取得できるのが100件までとなっており、全てを取得するには100件×10回のリクエストを繰り返す必要があります。

また加えて、例では1,000件と言いましたけれど、全体で何件あるのかは教えてもらえないのです。

どういうことかというと、具体的な記述は割愛しますが、リクエストしてまず100件取り出した時に、
「まだ残ってる分がありますよ」
ということと、続きを取得するためのコンティニュー用パラメータみたいなものだけは教えてもらえるのです。

それで仕方無く、パラメータを使って続きの100件を取得しても、まだ取りきれていなかったら、
「まだまだ残ってる分がありますよ」
と、またその続きのパラメータだけを示されて…という感じで、こちらは言われるがまま、もう残りはありません、と言われるまでひたすらリクエストし続けるしか無いのです。


検索結果のソートが出来ない
そしてこれが、バズ起源ツイートをAPIで探す上で最も絶望的な事象でした…。
先項の、一度に100件しか取得できないという事情があっても、普通に考えれば、

1.期間をある程度絞って指定し、
2.キーワードを指定して検索した結果を、
3.日付けの古い順に並べ替えて抽出する

というだけでポンと取り出せそうな気がするのですが、問題は「3.日付けの古い順に並べ替えて抽出する」でして、実はこの検索機能は、常に新しい順でしか持ってくることが出来ない、つまりソート条件の指定が出来ないのです。

そのため普通にやろうとすると、先項の通りに最後の1件が出てくるまでひたすら取得し続けるしか無くなります。


APIのリクエスト回数には限度がある
とはいえ、そういう仕様なら仕方ない、真面目に全部取るか…と思っても、TwitterのAPIにはリクエストの使用回数に限度があります。
本格的にバズったツイートは数十万件におよぶこともありますので、全件を拾ってくるだけでAPIの使用制限数をすぐに使い切ってしまいます。


そういうわけで、これはアカンという結論に達し、どうやら工夫が必要だということになりました。

なお、もう一つ大きな懸念事項として、
過去一週間分までのツイートしか検索対象にできない
というものがあるのですが、これは少し後でお話します。
起源ツイートの調べ方 前項の通り、スマートな方法でバズ起源ツイートを取り出すのは厳しいと思われたため、よりスマートではない方法に頼ることになりました。
それが、
「日時の範囲指定を細かく区切って検索し、それとおぼしき日時が見つかったら、さらにそれを詳細化して調べる」
という、何のことはない、ただの力技です。

下記の一覧は、あるキーワードのバズ起源を実際に調べた時の履歴です。
各ツイート詳細の画面でも、同様のものを表示しています。

こんな感じに、まず日ごとに検索し、起源と思われる日が見つかったら、それを半日で分割し、さらに6時間ごと、1時間ごと…と、次第に細かく分けて探してゆきます。

[1日ごと]
2021-04-20_00:00:00 〜 23:59:59 : 100cnt
2021-04-19_00:00:00 〜 23:59:59 : 100cnt
2021-04-18_00:00:00 〜 23:59:59 : 0cnt
2021-04-17_00:00:00 〜 23:59:59 : 0cnt
2021-04-16_00:00:00 〜 23:59:59 : 0cnt
19日に起源があると暫定的に見なした後、さらに3日前まで遡って調べて、3日間ゼロの日が続いたらその暫定日を起源として検索を続ける

[午前/午後の判定]
2021-04-19_00:00:00 〜 11:59:59 : 0cnt
この場合、午前の12時間が0件なので、午後にバズ起源ツイートがあるとして継続する

[6時間ごと]
2021-04-19_12:00:00 〜 17:59:59 : 0cnt
2021-04-19_18:00:00 〜 23:59:59 : 100cnt

[1時間ごと]
2021-04-19_18:00:00 〜 18:59:59 : 0cnt
2021-04-19_19:00:00 〜 19:59:59 : 0cnt
2021-04-19_20:00:00 〜 20:59:59 : 0cnt
2021-04-19_21:00:00 〜 21:59:59 : 0cnt
2021-04-19_22:00:00 〜 22:59:59 : 1cnt

[5分ごと]
2021-04-19_22:00:00 〜 22:04:59 : 0cnt
2021-04-19_22:05:00 〜 22:09:59 : 0cnt
2021-04-19_22:10:00 〜 22:14:59 : 0cnt
2021-04-19_22:15:00 〜 22:19:59 : 0cnt
2021-04-19_22:20:00 〜 22:24:59 : 0cnt
2021-04-19_22:25:00 〜 22:29:59 : 0cnt
2021-04-19_22:30:00 〜 22:34:59 : 0cnt
2021-04-19_22:35:00 〜 22:39:59 : 0cnt
2021-04-19_22:40:00 〜 22:44:59 : 0cnt
2021-04-19_22:45:00 〜 22:49:59 : 0cnt
2021-04-19_22:50:00 〜 22:54:59 : 0cnt
2021-04-19_22:55:00 〜 22:59:59 : 1cnt

[1分ごと]
2021-04-19_22:55:00 〜 22:55:59 : 0cnt
2021-04-19_22:56:00 〜 22:56:59 : 0cnt
2021-04-19_22:57:00 〜 22:57:59 : 0cnt
2021-04-19_22:58:00 〜 22:58:59 : 0cnt
2021-04-19_22:59:00 〜 22:59:59 : 1cnt
これがお目当ての、バズ起源ツイート!
バズ起源ツイートの注意事項 こんな感じでバズった時の起源とみられるツイートを拾ってくることは出来るのですが、Twitterの特性上、いくつか注意事項がありますので、そちらについて触れておきます。

バズ起源とされたツイートが、目標キーワードを必ずしも一番最初に含んだツイートでは無い場合がある
え、どういうこと?と思われるかも知れませんが、これは技術的にどうこうではなく、冷静に考えれば当然の話なのです。

例えば、端午の節句が近づいて「#かしわ餅食べたい」というタグが急にバズってトレンド入りして、Buzz ORIGINで調べて1つのツイートが見つかったとします。
でも、「かしわ餅食べたい」なんて、あまりに普通の言葉ですから、昨年の節句の時にも同じタグがあったかも知れません。

ですが、上の方で軽く触れていたのですけれども、このAPIは過去一週間分までしか検索することができないのです。
このため、「指定したキーワードを含んで投稿された最初のツイート」ではなく、あくまで「直近の一週間で、指定したキーワードでバズりが発生した時の、そのバズの起源となったツイート」を探すためのものだとご理解ください。

なお、前項で日時を指定しながらの検索履歴を紹介した際、「起点日から3日遡ってもツイートが無いこと」を条件にしているのもこのためで、あくまで調査日から数日以内に一気にドドッとツイートが湧き上がったものを探すためでして、何かしらちょこちょこと定期的にツイートされているようなキーワードは除外しています。

トレンドに挙がったハッシュタグでもBuzz ORIGINに入っていないものは、そうしたものがほとんどだとお考えください。
削るのが惜しいキーワードも正直あったりしますが、「起源」という意味合いが薄れるのでここは機械的に切っています。

また、同じ理由で、現状ではトレンドキーワードの中でもハッシュタグのみに限定しています。
ハッシュタグのつかない言葉ですと、バズとは関係の無いツイートも大量に検索結果に含まれてしまい、起源ツイートが特定できないためです。


バズ起源ツイートが削除されたら、2番目や3番目のツイートが「起源」として扱われることがある
これも当然ではあるのですが、バズ起源となったツイートが調査のタイミングですでに削除されていた場合は、その次のツイートが「バズ起源ツイート」として認識されます。
こちらも機械的に取得してきているのが理由ではありますが、逆に公平性を保つために、内容を見て判断するということは行わないようにしておりますので、ご了承ください。

バズ起源ツイートの今後の予定 実は元々やりたかったこととしては、バズったツイートに「いいね!」やRTをしているアカウントの傾向を調べる、みたいなことで、バズ起源ツイートを調べる、というのは、その作業の途中で発生する副産物みたいなものなのです。

ですが、あるツイートに「いいね!」をしているアカウントの一覧を取得する、みたいなことが、APIだけでは出来ないのです。
「いいね!」の数を調べるくらいまでしか出来ず…。

TwitterのAPIって、ユーザのOAuth認証(ブラウザベースのツールなど)や、自動投稿(いわゆるbotなどの用途)についてはかなり機能が充実しているのですけれども、データの取得や分析に関しては、意外にかゆいところに手が届かない作りになっていてもどかしいです。
Web経由でのスクレイピングなどと組み合わせるしかなさそうですが、もう少し充実させたいと思っていますので、引き続き研究してみます。