Botチェックのやり方
Twitterの世界にはBotと思われるアカウントも数多く見られます。あるアカウントがBotかどうか判別したい際に機械学習のツールを使用することができます。例えばBotometerは、当該アカウントのスクリーンネーム(@以下の英数字)を入れるとBotかどうか判定してくれます。(下の画像のような感じ)
Botometerは1,2個のアカウントを調べる分には問題ないのですが、100個とかになるとあまり使い勝手がよくありません。BotometerにはPythonのライブラリがあるようですが、Pythonはほとんどやったことがないので使い方がよくわかりませんでした。
tweetbotornot2パッケージ
Rしか分からない私はtweetbotornot2と言うモデルを使用する事にしました。tweetbotornot2は教師あり学習のモデルで、アカウントの属性・ツイートの統計・ツイートのテキスト内容の3つのカテゴリを元にBotかどうか判定します。tweetbotornot2はRでパッケージが提供されている点が優れています。(実はBotometerもRで実行することができますが、BotometerのAPIを取得する手間がかかり面倒です)
では早速このパッケージの内容を見ていきます。
tweetbotornot2パッケージはまだCRANには登録されていないようなので、 install_github()
でパッケージをインストールします。
remotes::install_github("mkearney/tweetbotornot2")
次に、あるアカウントがBotかどうか判定してみます。ここではおそらくBotだろうと思われるアカウント(@sharenewsjapan1)を例に見ていきます。
Botかどうか判定するにはpredict_bot()
を使用し、引数にスクリーンネームかユーザーIDのいずれかを入れます。
predict_snj <- tweetbotornot2::predict_bot("sharenewsjapan1") #引数はuser_idでもok
predict_snj
結果はこんな感じに出ます。prob_bot
が0.96と1に近い数字をとっているためBotの可能性が高いと考えられます。
user_id screen_name prob_bot
1: 1161186227279654912 sharenewsjapan1 0.9659563
どのような要素がBot判定に使用されたかを調べるにはexplain_bot()
を使用します。
explain_snj <- tweetbotornot2::explain_bot("sharenewsjapan1")
explain_snj[c(1:5),]
結果をみるとTweet source of popular service
などがBot判定に大きく寄与していることがわかります。
user_id screen_name prob_bot feature value feature_description
1: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srcas -2.0583100 Tweet source of popular service
2: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srctw 2.0131807 Tweet source of Twitter (official)
3: 1161186227279654912 sharenewsjapan1 0.9659563 usr_actyr 0.6793488 User account age
4: 1161186227279654912 sharenewsjapan1 0.9659563 twt_rtwts 0.5672238 Tweet via retweets
5: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srcna -0.4722273 Tweet source of unknown
なお、今使用したpredict_bot()
やexplain_bot()
はベクトルやデータフレームの引数にも対応しています。
screen_names <- c( "sugawitter", "JoeBiden") #ベクトルも対応可能
predict_bot(screen_names)
screen_names <- c( "sugawitter", "JoeBiden")
screen_names_df <- data.frame(screen_name = screen_names)
predict_bot(screen_names_df) #データフレームも対応可能
実際に使用してみる
このtweetbotornot2
パッケージを使用して簡単な分析をしてみたいと思います。
今日(2020/1/17)の朝に「【映像流出】なぜ中国は大量に人を消し始めたのか」と言う動画が拡散されトレンド入りされていたので、今回はこれに関するツイートを投稿したユーザーにBotがいるかどうかみてみます。
tweetbotornot2
はrtweet
パッケージとの相性もいいので、ここではrtweet
パッケージと組み合わせた使用をしてみます。
scripts <- "【映像流出】なぜ中国は大量に人を消し始めたのか" #今回使用するテキスト内容
tweet_china <- search_tweets(scripts,n = 100, include_rts = FALSE) #scriptsに関するツイートを100件収集
account_china <- tweet_china$screen_name #tweet_chinaからスクリーンネームを抽出
## rtweetパッケージ
name_tweets <- get_timelines(account_china, n = 200, check = FALSE)
#account_chinaの100アカウントについてそれぞれ200件ツイートを収集
#tweetbotornot2パッケージ
pred_china <- tweetbotornot2::predict_bot(name_tweets)
#name_tweetを元にそれぞれのアカウントのBot確率を計算
結果はこんな感じです。
pred_china %>% arrange(desc(prob_bot) %>% head(10) #Bot確率が高い上位10つを抜き出す
########
user_id screen_name prob_bot
1: 1218334562024972288 GenkiKusano 0.8895582557
2: 1299905176552132608 mao_twice_111 0.6415558457
3: 1317390868769173504 mini___0108 0.6333681941
4: 1305020751297146880 me2ro5nn9 0.5322452784
5: 1047812051601514496 Ryota9856 0.4668125212
6: 1212059230775083009 At3K3Yko7WHDlOp 0.4525235295
7: 1295471147446722560 kQlPMTs0LrApTK4 0.4238883555
8: 1271010741600976896 TM_MICAN 0.3104926646
9: 1010098103691538432 Real_K_1683 0.2870370150
10: 1112408161971896320 wD4UVuii4mBbTCF 0.2740830183
0.5を超えているアカウントは100個中4個ありました。実際この4つをみると不自然なツイート内容・ツイートタイミングがみられるのである程度予測が当たっているのかなと思います。
ただ、全体としてはほとんどがBotではないアカウントと予測されました。下の図は横軸にBotである確率(0~1)、縦軸にカウント数をとったものです。
今回は特に大きな発見はありませんでしたが、今後tweetbotornot2を使用して日本のトランプ支持者のアカウントなどを調べてみたりすると面白いことが言えるかもしれません。