自然言語処理でツイートがバズるかをちゃんと予測する


この記事はニフティグループ Advent Calendar 2020の7日目の記事です。

ツイートがバズるかを予測したい

昨年、自然言語処理でツイートがバズるかを予測しようとした話
という記事であるツイートがバズるかを予測してみました。

最近、社内ではAIを活用するという動きが活発になってきており、
機械学習畑出身の自分もだいぶさまざまなところに投入されております。

その中でSNS分析を行った際に良質なデータが集まったので、再度ツイートのバズを予測してみたいと思います。

自然言語処理とは

自然言語処理は、人が話している言葉をコンピュータに認識させることの一連の技術を指します。

プログラミング言語はパターンに沿って設計されているので、コンピュータが解析するにも苦労しないのですが、人間が話している言葉はパターンが複雑だったり例外が多く、機械学習が活発に研究されている今でも難しい分野と言われています。

近年の自然言語処理

難しいと言われていた自然言語処理も深層学習の登場でかなり改善されており
近年ではGPT-3という自然言語処理モデルがほぼ人間のような文章生成を可能にしているというニュースもあります。

Talk to Transformer」というサイトでは、GPT-3の前身のGPT-2というモデルで誰でも文章生成を楽しむことができます。
(GPT-3も開発元のOpenAIがAPIを公開し始めているので、人間と見分けのつかない文章生成が完成するまで時間の問題でしょう・・・)

ツイートのバズを予測する

それではあるツイートに対して
そのツイートがバズるかを事前に予測する機械学習モデルを構築していきます。

近年の自然言語処理の進歩は文章生成についてですが
今回の問題は「あるツイートがバズるかバズらないか」の2値分類問題になるので
高度な自然言語処理モデルは必要ありません。
(なんなら深層学習も使いません・・・)

データを集める

バズを定義する

去年は上位200位のアカウントのツイートという乱暴なデータ収集を行いました。
その結果、以下のようなことが起こっていました。

  • バズるかよりもフォロワーが多くなるツイートの分類になってしまっている
  • Youtuberが多く、「動画をあげました」というツイートがバズると予測されていた
  • 企業の定型文や地震速報の形式などがバズるという予測がされていた

ツイートの秀逸さ以外で人気がある人達のツイートデータのため
本来予測したいバズるかが全く予測できていませんでした。

そこで今回はRT数2000以上のツイートデータをバズると定義し、真面目に収集したいと思います。

スクレイピング禁止・・・?

そこでTwitterからデータを集めたいのですが
Twitter APIは1週間以上前のデータはけっこうな額の課金をしないと集められません。
(これが原因で去年の自分は雑なデータ収集をしていました)

じゃあスクレイピングかという話ですが、スクレイピングは規約で明確に禁止されています。

というわけで手作業で30000ツイートくらい収集しました。
(8月頃の業務中の自分が)

数年前に学会に行ったときに
卒業研究のために20000枚の画像をアノテーションしましたという人に会いましたが
機械学習はだいたいデータ集めが辛くて、データ集めが9割だなと思います。

学習する

データを整形し学習をしてみます。

11337  __label__Buzz                 レバノン爆発の原因物質は2015年に韓国から輸入した硝酸アンモニウム
12203  __label__Buzz                             極小ネタ(さすがにピュアな3歳下はかわいい)
11059  __label__Buzz                          超能力者同士の戦いにしか見えないトルコのデモの画像
3251   __label__Buzz               スカラビアの宴でうっかりはしゃいじゃったオクタヴィネルの爽やか3コマ漫画
2414   __label__Buzz   GO!senzoたちがヘリで帰ってくる ナマ足 割り箸 マーメイド☀️ はやかわ #精霊馬...
15561  __label__Buzz                               #ツイステファンアート 仲良しオクタビア
2270   __label__Buzz                                         プリコネ2期〜!!!
22743  __label__Buzz                                たまに遭遇する #ツイステファンアート
6472   __label__Buzz   【ミカサデコ&カフェ】 @原宿駅から徒歩5分 厚みが半端ないリコッタパンケーキを食べられる...
17235  __label__Buzz                       王様ゲームで真っ赤になるオフ会なかよし部【プリコネ漫画】

今回もfastTextを使って学習をしてみます。
詳しくは:FacebookのfastTextでFastに単語の分散表現を獲得する

学習済みモデルとしてfastTextの学習済みモデルを公開しましたのNeologd版を使わせていただきました。

% ./fasttext supervised -input tweet_data/tweet_data_train.txt -output result/tweet -dim 300 -lr 0.1 -wordNgrams 2 -minCount 1 -epoch 100 -thread 4 -pretrainedVectors model.vec
Read 0M words
Number of words:  100873
Number of labels: 2
Progress: 100.0% words/sec/thread:  615466 lr:  0.000000 loss:  0.013649 ETA:   0h 0m
% ./fasttext test result/tweet.bin tweet_data/tweet_data_test.txt
N   5277
P@1 0.689
R@1 0.689

テストデータに対して68.9%の正答率です。
ランダムに予測するよりもちょっと当たりそうぐらいですね・・・。

実際に予測する

今回のモデルで実際にバズったツイートを予測してみます。

最近延々とサーバーエラーと戦っています。

__label__notBuzz, 0.88015

バズらない
(実際はバズ)

強制的にiOSエンジニアにさせられたので、iOS完全理解しました。

__label__notBuzz, 0.877977

バズらない
(実際はバズ)

弊社の最寄りは新宿駅です。

__label__notBuzz, 0.623716

バズらない
(実際はバズ)

敗因はなにか

今回実際のツイートを予測してみましたが、ほとんど正しく予測できませんでした。

理由としては2つあると考えられます。

1つはデータ数がそもそも足りないこと。
手作業で30000ツイートほど収集しましたが、機械学習の文脈ではかなり少ないデータ数です。
去年は機械的に収集しただけあって、60万ツイートほど集められていたので、データ数はかなり不足していたと考えられます。

もう1つがリツイートをバズの基準にしたことにあります。
検索してみるとわかるのですが、最近のTwitterではRT&フォローでプレゼントということが企業のアカウントで頻繁に行われています。
そうなってくると、リツイートされやすいツイートというのは必然的に企業のプレゼント系のツイートになってしまい、全体的な傾向もそれに引っ張られます。

会社でSNS分析をやった際にもデータクレンジングに多くの時間を使ったのですが
SNSはノイズがかなり大きいのでそれを除去することが重要になってくると再認識しました。

来年もリベンジしたいと思います。(希望的観測)


弊社ではエンジニアを募集しています(多分)

普段はWEBアプリケーションを作りつつ
機械学習を嗜む環境へぜひご応募ください。

ニフティ株式会社採用情報