API使いツイート取得:twitteR
AAA活動休止前最後のドームツアー公演が昨年2021年12月25日で幕を閉じ、ツイートを取得・ワードクラウド作成を試みました。
途中で「ユーザー辞書」の登録を始め、ワードクラウドが途中で終わっていたので、その続きです。
# TwitterAPI認証情報設定
consumerKey <- "************"
consumerSecret <- "*****************"
accessToken <- "*****************"
accessSecret <- "*********************"
## TwitterAPIにログイン
library("twitteR")
options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)
# 「#AAA」を含む日本語ツイートを15000件取得。2021年12月25日から
tweets2 <- searchTwitter('#AAA', n = 15000, since = "2021-12-25" , lang="ja" , locale="ja")#日本語とロケールを指定(日本なら"ja")# 目的に応じて"popular","recent","mixed"を指定 #◼️
# 22時時点で取得できたのは8064ツイートでした
doRppAPICall("search/tweets", n, params = params, retryOnRateLimit = retryOnRateLimit, で:
15000 tweets were requested but the API can only return 8064
# データフレームに変換
tweetsdf2 <- twListToDF(tweets2)
# 型を確認
class(tweets2)
[1] "list"
class(tweetsdf2)
[1] "data.frame"
# 取得できたか確認
library(dplyr)
tweetsdf2 %>% head()
リツイート使用:isRetweet
今回はリツイーされた投稿を使います。
# リツイートされたもの(TRUE)、そうでないもの(FALSE)の数を確認
table(tweetsdf2$isRetweet)
FALSE TRUE
3665 4399
# 今回リツイートのみ使ってみる
tweetsdf3 <- tweetsdf2 %>% filter(isRetweet %in% c("TRUE"))
head(tweetsdf3) #確認
nrow(tweetsdf3) #確認
[1] 4399
# 一応csvに出力しておく
library(readr)
write_csv(tweetsdf3, "tweetsdf3_AAA.csv")
# write.csv(tweetsdf3, "tweetsdf3_jougen.csv", fileEncoding = "CP932")
テキストのみ抽出:$text
抽出したツイートは複数の項目(下記)を含みます。
colnames(tweetsdf2)
[1] "text" "favorited" "favoriteCount" "replyToSN" "created" "truncated"
[7] "replyToSID" "id" "replyToUID" "statusSource" "screenName" "retweetCount"
[13] "isRetweet" "retweeted" "longitude" "latitude"
投稿(text)のみ取り出して形態素解析にかけます。
# データフレームのテキスト列だけ抽出
texts <- tweetsdf3$text
# 後々使うのでテキスト処理のためのライブラリを呼び出す
library(stringr)
library(magrittr)
# 複数の(リスト型)テキストを結合。テキストとテキストの間にはブランクを入れる
class(texts)
str(texts)
texts3 <- paste(texts, collapse = "")
str(texts3)
形態素解析をかける:RMeCab
# 一時ファイルを作り、xfileという名前で保存
xfile <- tempfile()
write(texts3, xfile)
## 形態素解析のライブラリー
library(RMeCab)
# 形態素解析。頻度を集計
frq_Tw2 <- RMeCabFreq(xfile)
# 上位50を確認
frq_Tw2 %>% arrange(Freq) %>% tail(50)
Term Info1 Info2 Freq
3568 みつひろ 名詞 固有名詞 1041
3569 最後 名詞 一般 1073
3570 と 助詞 格助詞 1081
3571 すえよし 名詞 固有名詞 1096
3572 する 動詞 自立 1127
3573 この 連体詞 * 1128
3574 みさこ 名詞 固有名詞 1151
3575 https 名詞 固有名詞 1174
3576 ) 名詞 サ変接続 1183
3577 と 助詞 並立助詞 1208
3578 しんじろう 名詞 固有名詞 1224
3579 たかひろ 名詞 固有名詞 1244
3580 ライブ 名詞 一般 1263
3581 ひだか 名詞 固有名詞 1271
3582 あたえ 名詞 固有名詞 1342
3583 年 名詞 接尾 1343
3584 にしじま 名詞 固有名詞 1494
固有名詞が「真司」と「郎」と分断されたり、「実」と「彩子」が分断されたりします。
そこで、ユーザー辞書を登録しました。→こちら参照
辞書の内容は以下の通りです。
西島,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,にしじま,ニシジマ,ニシジマ
宇野,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,うの,ウノ,ウノ
日高,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,ひだか,ヒダカ,ヒダカ
與,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,あたえ,アタエ,アタエ
末吉,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,すえよし,スエヨシ,スエヨシ
隆弘,,,1000, 名詞, 固有名詞, 人名, 名,*,*,たかひろ,タカヒロ,タカヒロ
実彩子,,,1000, 名詞, 固有名詞, 人名, 名,*,*,みさこ,ミサコ,ミサコ
光啓,,,1000, 名詞, 固有名詞, 人名, 名,*,*,みつひろ,ミツヒロ,ミツヒロ
真司郎,,,1000, 名詞, 固有名詞, 人名, 名,*,*,しんじろう,シンジロウ,シンジロウ
秀太,,,1000, 名詞, 固有名詞, 人名, 名,*,*,しゅうた,シュウタ,シュウタ
ユーザ辞書使い再度形態素解析:RMeCabFreq
この辞書(aaa.dic)を適用してみます。
なお、上記の辞書では、例えば「西島」が認識されても、形態素解析の結果ではひらがな「にしじま」が出るようにしています。
ユーザー辞書の動作を確認しやすくするためです。
形態素解析の結果です。
frq_Tw2 <- RMeCabFreq(xfile)
frq_Tw2 %>% arrange(Freq) %>% tail(50)
Term Info1 Info2 Freq
3568 みつひろ 名詞 固有名詞 1041
3569 最後 名詞 一般 1073
3570 と 助詞 格助詞 1081
3571 すえよし 名詞 固有名詞 1096
3572 する 動詞 自立 1127
3573 この 連体詞 * 1128
3574 みさこ 名詞 固有名詞 1151
3575 https 名詞 固有名詞 1174
3576 ) 名詞 サ変接続 1183
3577 と 助詞 並立助詞 1208
3578 しんじろう 名詞 固有名詞 1224
3579 たかひろ 名詞 固有名詞 1244
3580 ライブ 名詞 一般 1263
3581 ひだか 名詞 固有名詞 1271
3582 あたえ 名詞 固有名詞 1342
3583 年 名詞 接尾 1343
3584 にしじま 名詞 固有名詞 1494
3585 」 記号 括弧閉 1509
3586 「 記号 括弧開 1562
3587 しゅうた 名詞 固有名詞 1570
アルファベット、記号を外す:str_match
ここから、フィルタリングを行います。
アルファベッや記号トは外します。
「AAA」も外れてしまいます。
「AAA」をキーにツイートを取得しているので、入ってて当然のワードなのでなくてもよしとして進めます。
# 見やすいように整形するために、「アルファベット」「記号」を削除
# termが英語を削除。noun列が作られ「<NA>」が表示。mutateは列を追加したり修正する
frq3_Tw2 <- frq_Tw2
frq4_Tw2 <- frq3_Tw2 %>% mutate(noun=str_match((Term), '[^a-zA-Z]+')) #◼️
frq4_Tw2 %>% arrange(Freq) %>% tail(50)
# 以下適用例
Term Info1 Info2 Freq noun
3575 https 名詞 固有名詞 1174 <NA>
3588 co 名詞 一般 1608 <NA>
# 削除。na.omitでNA含む行を削除。
frq5_Tw2 <- na.omit(frq4_Tw2) #◼️
frq5_Tw2 %>% arrange(Freq) %>% tail(50)
Term Info1 Info2 Freq noun
7908 「 記号 括弧開 302 「
7909 思う 動詞 自立 303 思う
7910 _ 名詞 サ変接続 320 _
7911 # 名詞 サ変接続 331 #
7912 から 助詞 接続助詞 349 から
7913 れる 動詞 接尾 350 れる
7914 無限 名詞 一般 360 無限
7915 編 名詞 接尾 367 編
7916 な 助詞 終助詞 394 な
7917 列車 名詞 一般 428 列車
7918 :// 名詞 サ変接続 429 ://
7919 . 名詞 サ変接続 448 .
7920 / 名詞 サ変接続 452 /
7921 って 助詞 格助詞 463 って
# termが記号を識別。noun列が作られ「<NA>」が表示。「\\W」は記号
frq6_Tw2 <- frq5_Tw2 %>% mutate(noun=str_match((Term), '[^\\W]+'))
frq6_Tw2 %>% arrange(Freq) %>% tail(50)
# 以下適用例
Term Info1 Info2 Freq noun
2615 ) 名詞 サ変接続 1183 <NA>
2624 」 記号 括弧閉 1509 <NA>
# 削除。na.omitでNA含む行を削除。
frq7_Tw2 <- na.omit(frq6_Tw2)
frq7_Tw2 %>% arrange(Freq) %>% tail(50)
2353 にしじま 名詞 固有名詞 1494 にしじま
2354 しゅうた 名詞 固有名詞 1570 しゅうた
2355 は 助詞 係助詞 1632 は
2356 だ 助動詞 * 1670 だ
2357 ありがとう 感動詞 * 1726 ありがとう
2358 うの 名詞 固有名詞 1783 うの
2359 も 助詞 係助詞 1832 も
2360 ます 助動詞 * 2309 ます
2361 15 名詞 数 2816 15
2362 が 助詞 格助詞 3029 が
2363 を 助詞 格助詞 3230 を
2364 _ 名詞 サ変接続 3234 _
2365 で 助詞 格助詞 3563 で
2366 た 助動詞 * 4246 た
2367 て 助詞 接続助詞 5289 て
2368 に 助詞 格助詞 5405 に
2369 の 助詞 連体化 7424 の
1文字のワードも外す:grep
# Termが1文字の行を削除。まず、2文字ワードの行番号を抽出
index <- grep('..', frq7_Tw2[,1])
head(index)
[1] 2 4 5 7 8 9
frq7_Tw2[index,] %>% arrange(Freq) %>% tail(50) #確認
1965 みさこ 名詞 固有名詞 1151 みさこ
1966 しんじろう 名詞 固有名詞 1224 しんじろう
1967 たかひろ 名詞 固有名詞 1244 たかひろ
1968 ライブ 名詞 一般 1263 ライブ
1969 ひだか 名詞 固有名詞 1271 ひだか
1970 あたえ 名詞 固有名詞 1342 あたえ
1971 にしじま 名詞 固有名詞 1494 にしじま
1972 しゅうた 名詞 固有名詞 1570 しゅうた
1973 ありがとう 感動詞 * 1726 ありがとう
1974 うの 名詞 固有名詞 1783 うの
1975 ます 助動詞 * 2309 ます
1976 15 名詞 数 2816 15
# 上記結果値を「frq8_Tw2」に設定
frq8_Tw2 <- frq7_Tw2[index,]
frq8_Tw2 %>% arrange(Freq) %>% tail(50)
# ここまで行って、目につくワードが外れることがわかり、1文字のTermを外すのをやめる
# 1文字はず目に戻す
frq8_Tw2 <- frq7_Tw2
frq8_Tw2 %>% arrange(Freq) %>% tail(50)
品詞を選別:filter
ざっと眺めてInfo1が「連体詞」「助動詞」「動詞」、Info2が「接尾」を外します。
# 「名詞」を抽出
frq9_Tw2 <- frq8_Tw2
frq10_Tw2 <- frq9_Tw2 %>% filter(!(Info1 %in% c("連体詞", "助動詞", "動詞"))) %>% filter(!(Info2 %in% "接尾"))
frq10_Tw2 %>% arrange(Freq) %>% tail(50)
1497 ドームツアー 名詞 一般 1017 ドームツアー
1498 みつひろ 名詞 固有名詞 1041 みつひろ
1499 最後 名詞 一般 1073 最後
1500 すえよし 名詞 固有名詞 1096 すえよし
1501 みさこ 名詞 固有名詞 1151 みさこ
1502 しんじろう 名詞 固有名詞 1224 しんじろう
1503 たかひろ 名詞 固有名詞 1244 たかひろ
1504 ライブ 名詞 一般 1263 ライブ
1505 ひだか 名詞 固有名詞 1271 ひだか
1506 あたえ 名詞 固有名詞 1342 あたえ
1507 にしじま 名詞 固有名詞 1494 にしじま
1508 しゅうた 名詞 固有名詞 1570 しゅうた
1509 ありがとう 感動詞 * 1726 ありがとう
1510 うの 名詞 固有名詞 1783 うの
1511 15 名詞 数 2816 15
ワードクラウド作成:wordcloud2
frq11_Tw2 <- frq10_Tw2
# wordcloud2で描画準備
frq12_Tw2 <- frq11_Tw2 #下記の作業でミスをした場合元のデータフレームに戻せるようにする
# Freqが300以上にする
frq13_Tw2 <- frq12_Tw2$Freq >= 300
tail(frq13_Tw2) #確認
[1] FALSE FALSE FALSE FALSE FALSE FALSE
frq14_Tw2 <- frq12_Tw2[frq13_Tw2,]
frq14_Tw2 %>% arrange(Freq) %>% head()
Term Info1 Info2 Freq noun
1 皆さん 名詞 一般 305 皆さん
2 24 名詞 数 308 24
3 ツアー 名詞 一般 316 ツアー
4 25 名詞 数 325 25
5 から 助詞 格助詞 340 から
6 セット 名詞 一般 353 セット
# wordcloud2で描画。frq13_Tw2の1列目(Term)と4列目(Freq)を使う
library(wordcloud2)
# frq14_Tw2[,c(1,4)] %>% wordcloud2(size=2,minSize=1) #sise=2では全体が大きすぎるので下記利用
# frq14_Tw2[,c(1,4)] %>% wordcloud2(size=1.3,minSize=1,gridSize=10) #gridSizeは文字間隔
frq14_Tw2[,c(1,4)] %>% wordcloud2(size=1.2,minSize=1,gridSize=10) #上記で一番大きいワードが入らなかったのでこっち使用
了