見出し画像

R言語でrtweetパッケージを使う

※Twitter(現X)の仕様変更により、以下のコードは実行できなくなっています。

.tgzからrtweetをインストール

「R言語」から「Twitter」のツイート情報を取得する際に、「twitteR」パッケージを使っています。
Twitter連携については、「twitteR」より「rtweet」の方が主流のようなので、使ってみました。
まず、「rtweet」をインストールします。

※使用環境は「macOS Ventura 13.1」です。

# rtweetインストール

install.packages("rtweet")
trying URL 'https://mirror.las.iastate.edu/CRAN/bin/macosx/big-sur-arm64/contrib/4.2/rtweet_1.0.2.tgz'
Content type 'application/x-gzip' length 869848 bytes (849 KB)
==================================================
downloaded 849 KB

The downloaded binary packages are in
	/var/folders/44/3m206wpj4db2vyqz3bt_ltkm0000gn/T//Rtmp7kCV2w/downloaded_packages

# 「trying URL」メッセージが出てうまくいかないので tgz をダウンロードしてインストール
# ブラウザで 'https://mirror.las.iastate.edu/CRAN/bin/macosx/big-sur-arm64/contrib/4.2/rtweet_1.0.2.tgz'にアクセスしダンロード

setwd("~/Downloads")
install.packages("rtweet_1.0.2.tgz", repos = NULL, type = "source")

アカウントを指定してツイートを取得

「get_timeline」関数を利用してツイートを取得します。
「NHK紅白歌合戦」のアカウント「@nhk_kouhaku」から最新ツイート1000件取得してみます(取得時は2023年0時過ぎ)。

# 最新のツイート1000件取得

nhk_kohaku_tw <- get_timeline("nhk_kouhaku", n = 1000)

Error in `default_cached_auth()`:
! No default authentication found. Please call `auth_setup_default()`
Run `rlang::last_error()` to see where the error occurred.

# 上記メッセージが出た場合、まず認証設定。「auth_setup_default()」を実行

auth_setup_default()
ℹ The package `httpuv` is required.
✖ Would you like to install it?

1: Yes
2: No
 
# (略)
# (ブラウザ画面に切り替わりTwitter認証の許可を求められる)

The downloaded binary packages are in
# (略)	
Waiting for authentication in browser...
Press Esc/Ctrl + C to abort
Authentication complete.

「twitteR」の場合、Twitterから取得した4つのキーが必要ですが、「rtweet」では自分のTwitterのアカウント経由で認証許可を取得します。

# リツイート数が多い順に並べ替える場合

nhk_kohaku_tw <- get_timeline("nhk_kouhaku", n = 1000)
nhk_kohaku_df <- nhk_kohaku_tw %>% 
  arrange(desc(retweet_count)) %>%
  select(text, retweet_count)

# データ型を確認
class(nhk_kohaku_df)
[1] "tbl_df"     "tbl"        "data.frame"

head(nhk_kohaku_df)
# A tibble: 6 × 2
  text                                                                          retwe…¹
  <chr>                                                                           <int>
1 "【♥♥このツイートをRT&いいね♥♥】\n\n#なにわ男子 の紅白初出場のステージを\n…   171312
2 "「第73回NHK紅白歌合戦」\n\n出場歌手が決定✨\n\n紅組21組、白組21組。\n初出場…  123714
3 "「第73回NHK紅白歌合戦」\n\n🎊曲目が決定🎊\n\nhttps://t.co/lxGhe6BlYI\n\n#NH…   79152
4 "「第73回NHK紅白歌合戦」\n\n🎊曲順が決定🎊\n\n🔽詳しくはこちら\nhttps://t.co…   62573
5 "══════════\n  ONE PIECE UTA LIVE \n         RED×WHITE\n══════════\n\nウタ、…   55701
6 "/\nいよいよ今夜 7:20~\n「第73回NHK紅白歌合戦」📢\n\\n\n🎊みどころを…    49221
# … with abbreviated variable name ¹​retweet_count

# 列名確認
colnames(nhk_kohaku_tw)
 [1] "created_at"                    "id"                           
 [3] "id_str"                        "full_text"                    
 [5] "truncated"                     "display_text_range" 
#・・・
[41] "withheld_copyright"            "withheld_in_countries"        
[43] "possibly_sensitive_appealable"

投稿時間を指定してツイート取得

「NHK紅白歌合戦」の放送が始まった時間(2022年12月31日19時20分)以降のツイートに絞り込みます。

# 2022年12月31日19時20分以降の投稿を選ぶ
# 列項目は、 text, retweet_count, created_at の3つにする

# データ型を確認
class(nhk_kohaku_tw$created_at)
[1] "POSIXct" "POSIXt"

nhk_kohaku_df2 <- nhk_kohaku_tw %>% 
	arrange(desc(retweet_count)) %>%
	select(text, retweet_count, created_at) %>%
	filter(created_at >= "2022-12-31 19:20:00")

nhk_kohaku_df2
# A tibble: 123 × 3
   text                                                     retwe…¹ created_at         
   <chr>                                                      <int> <dttm>             
 1 "【♥♥このツイートをRT&いいね♥♥】\n\n#なにわ男子 の紅白…  171312 2022-12-31 19:34:26
 2 "══════════\n  ONE PIECE UTA LIVE \n         RED×WHITE\…   55701 2022-12-31 21:04:12

RMeCabとNEologdを使う

いい機会なので、上記で作成したデータフレーム「nhk_kohaku_df2」に形態素解析をかけたツイートを収録する練習もしました。
形態素解析に「RMeCab」、辞書に「NEologd」を使いました。

# text列を形態素解析。その解析値を、データフレームのetxt2列に収録する
# 辞書はNEologdを使用
# リツイート数順

# 指定した変数(text、retweet_count、created_at)でデータをグループ化
nhk_kohaku_df <- nhk_kohaku_df2 %>%
	nest_by(text, retweet_count, created_at) %>%
	mutate(
		text2 = list(
		RMeCabC(text, dic = "//usr/local/lib/mecab/dic/ipadic/mecab-user-dict-seed.20200910.csv.dic")
		)
	) %>% arrange(desc(retweet_count))

「text2」列に「RMeCabC」関数で処理されたテキストが「list型」のデータとして収録されています。

nhk_kohaku_df
# A tibble: 123 × 5
# Rowwise:  text, retweet_count, created_at
   text                                           retwe…¹ created_at             data text2 
   <chr>                                            <int> <dttm>              <list<> <list>
 1 "【♥♥このツイートをRT&いいね♥♥】\n\n#なにわ…   171312 2022-12-31 19:34:26 [1 × 0] <list>
 2 "══════════\n  ONE PIECE UTA LIVE \n         …   55701 2022-12-31 21:04:12 [1 × 0] <list>
 3 "🎵 Good Luck!\n────────\n⬜️ SixTONES\n\nNH…   10755 2022-12-31 22:14:55 [1 × 0] <list>

「pluck」を使い内容を確認します。

nhk_kohaku_df %>%
	pluck("text2", 2) %>% unlist() 
        名詞         名詞         名詞         名詞         名詞         記号         名詞 
"══════════"  "ONE PIECE"        "UTA"       "LIVE"        "RED"          "×"      "WHITE" 
#(略)

関数を使い名詞を取り出しやすく

特定の行の「text2」列の内容は、ツイートに形態素解析にかけたものです。
単語の並びからどういうツイートなのかわかりやすくするために、「名詞」のみ抽出します。
加えて、確認するたびに上記のパイプ処理を実行するのは多少面倒なので、関数を使って扱いやすくしました。

# 形態素解析した結果を取り出しやすくするための関数)
# 名刺だけを抽出

kohaku_func <- function(x) {
  tw_result <- nhk_kohaku_df %>%
	pluck("text2", x) %>%
	unlist() 
  tw_result2 <- tw_result[names(tw_result) %in% "名詞"]
  return(tw_result2)
}

kohaku_func(2)
        名詞         名詞         名詞         名詞         名詞         名詞         名詞 
"══════════"  "ONE PIECE"        "UTA"       "LIVE"        "RED"      "WHITE" "══════════" 
        名詞         名詞         名詞         名詞         名詞         名詞         名詞 
      "ウタ"       "最高"     "ライブ"      "!!!!!"          "#"        "NHK"       "紅白" 
        名詞         名詞         名詞         名詞         名詞         名詞         名詞 
         "#"     "みんな"     "シェア"     "新時代"  "NHKプラス"      "https"        "://" 
        名詞         名詞         名詞         名詞         名詞         名詞         名詞 
         "t"          "."         "co"          "/" "MuJbhamYPD"      "https"        "://" 
        名詞         名詞         名詞         名詞         名詞         名詞         名詞 
         "t"          "."         "co"          "/"          "M"         "5w"    "CufwEgo" 

データフレームオブジェクトの保存

リスト型データを収録したデータフレームを保存します。
「write_csv」関数などを使ってCSV形式に保存する場合、数字と文字列データは保存できますが、データフレーム型のデータは保存できません。
このため、「RDS」形式で保存します。

# RDSの出力
nhk_kohaku_df %>% 
  write_rds("nhk_kohaku_df.rds")

# RDSの入力
nhk_kohaku_rdf <- read_rds("nhk_kohaku_df.rds")

# 確認
nhk_kohaku_rdf 
# A tibble: 123 × 5
# Rowwise:  text, retweet_count, created_at
   text                                           retwe…¹ created_at             data text2 
   <chr>                                            <int> <dttm>              <list<> <list>
 1 "【♥♥このツイートをRT&いいね♥♥】\n\n#なにわ…   171312 2022-12-31 19:34:26 [1 × 0] <list>
 2 "══════════\n  ONE PIECE UTA LIVE \n         …   55701 2022-12-31 21:04:12 [1 × 0] <list>
 3 "🎵 Good Luck!\n────────\n⬜️ SixTONES\n\n⚡NH…   10755 2022-12-31 22:14:55 [1 × 0] <list>

nhk_kohaku_rdf %>%
	pluck("text2", 2) %>% unlist()
        名詞         名詞         名詞         名詞         名詞         記号         名詞 
"══════════"  "ONE PIECE"        "UTA"       "LIVE"        "RED"          "×"      "WHITE" 
#(略)

参考サイト


いいなと思ったら応援しよう!