「getTrends」であるエリアのトレンド
**「R」**のパッケージ「twitteR」を使うと、Twitterのツイートの情報を取得できます。
(TwitterからAPIの使用許可を得る必要があリます)
ある地域の情報を得る場合、を考えました。
例えば**「getTrends」**関数を使えます。
install.packages("twitteR") #インストールしてない場合
ibrary("twitteR")
library(dplyr) #パイプ処理などの使用に必要
# TwitterAPI認証情報設定
consumerKey <- "************"
consumerSecret <- "*****************"
accessToken <- "*****************"
accessSecret <- "*********************"
## TwitterAPIにログイン
library("twitteR")
options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)
# Twitter APIから地域名とIDを取得する
# その中から日本のIDだけを抽出
woeid <- availableTrendLocations()
woeid %>% filter(country == "Japan")
name country woeid
1 Kitakyushu Japan 1110809
2 Saitama Japan 1116753
3 Chiba Japan 1117034
4 Fukuoka Japan 1117099
5 Hamamatsu Japan 1117155
6 Hiroshima Japan 1117227
7 Kawasaki Japan 1117502
8 Kobe Japan 1117545
9 Kumamoto Japan 1117605
10 Nagoya Japan 1117817
11 Niigata Japan 1117881
12 Sagamihara Japan 1118072
13 Sapporo Japan 1118108
14 Sendai Japan 1118129
15 Takamatsu Japan 1118285
16 Tokyo Japan 1118370
17 Yokohama Japan 1118550
18 Okinawa Japan 2345896
19 Osaka Japan 15015370
20 Kyoto Japan 15015372
21 Japan Japan 23424856
22 Okayama Japan 90036018
# 東京のIDみ抽出
woeid %>% filter(name == "Tokyo")
# name country woeid
# 1 Tokyo Japan 1118370
# 東京のトレンドワードを取得
trends <- getTrends(1118370)
head(trends)
trends$name %>% head(10)
[1] "流れ弾1位" "生田さん" "田中将大"
[4] "イノッチ" "紅林くん" "#Rocketeer"
[7] "文書回答" "#スカロケ" "#さがらFFF"
[10] "嵐活動休止後初の公の場"
「geocode」で緯度と軽度を指定
**「searchTwitter」**関数を使うと、「緯度」と「軽度」を指定できます。
「searchTwitter」で使えるパラメータ**「geocode」**を使います。
ただ、getTrendsと違い、「トレンドワード」を返すのではなく、指定したキーワードを含むツイート文言やリツイート数など、ツイート関連の各種情報を取り出します。
例えば、「澁谷駅から半径10kmの範囲』を指定します。
緯度と軽度は、「澁谷駅の緯度と軽度」とGoogle検索すれば確認できます。
「35.6598003」「139.7023894」となります。
あまり偏らないように、キーワードには「です。」と指定し、最大10000ツイート取得します。
(「です。」を指定した特別な意図はありません。動作確認が目的なので、なんとなく選びました)
tweets2 <- searchTwitter('です。', geocode='35.689607,139.700571,10km', n = 10000, since = "2021-10-25", lang="ja")
head(tweets2)
トピックワードは「RMeCab」で
このデータからトレンドキーワードを出そうとする場合、例えば形態素解析をかけます。
パッケージには**「RMeCab」**を使います。
今回は固有名詞を指定します。
# データフレームに変換
tweetsdf2 <- twListToDF(tweets2)
# 型を確認
class(tweets2)
[1] "list"
class(tweetsdf2)
[1] "data.frame"
# 確認
tweetsdf2 %>% head(10)
# リツイートされたもの(TRUE)、そうでないもの(FALSE)の数を確認
table(tweetsdf2$isRetweet)
FALSE
10000
# データフレームのテキスト列だけ抽出
tweetsdf3 <- tweetsdf2
texts <- tweetsdf3$text
# 複数の(リスト型)テキストを結合。テキストとテキストの間にはブランクを入れる
texts3 <- paste(texts, collapse = "")
# 一時ファイルを作り、xfileという名前で保存
xfile <- tempfile()
write(texts3, xfile)
## 形態素解析のライブラリー
library(RMeCab)
# 形態素解析。頻度を集計
frq_Tw2 <- RMeCabFreq(xfile)
# 上位50を確認
frq_Tw2 %>% arrange(Freq) %>% tail(50)
35237 1 名詞 数 1130
755 が 助詞 接続助詞 1156
2811 くださる 動詞 非自立 1230
747 まで 助詞 副助詞 1237
34658 日 名詞 接尾 1325
38869 ) 記号 括弧閉 1336
36710 方 名詞 非自立 1342
# 固有名詞のみに絞り込む
frq3_Tw2 <- frq_Tw2 %>% filter(Info2 %in% c("固有名詞"))
frq3_Tw2 %>% arrange(Freq) %>% tail(50) #確認
Term Info1 Info2 Freq
32664 太郎 名詞 固有名詞 14
33103 毎日 名詞 固有名詞 14
32512 北海道 名詞 固有名詞 15
32758 山下 名詞 固有名詞 15
32805 工藤 名詞 固有名詞 15
32966 月野 名詞 固有名詞 15
33316 祐 名詞 固有名詞 15
31072 s 名詞 固有名詞 16
31645 オリックス 名詞 固有名詞 16
32231 リツ 名詞 固有名詞 16
32265 ロッテ 名詞 固有名詞 16
ノイズになりそうな言葉を外す
ここで、(自分の場合は)1つのワードとして意味を成しにくい文字列を外します。
# Termが1文字の行を削除。まず、1文字のワードの行番号を抽出
index <- grep('..', frq3_Tw2[,1])
head(index)
[1] 2 3 4 5 6 7
frq3_Tw2[index,] %>% arrange(Freq) %>% tail(50) #確認
Term Info1 Info2 Freq
33159 流通センター 名詞 固有名詞 11
33251 生田 名詞 固有名詞 11
30333 YouTube 名詞 固有名詞 12
33286 眞子 名詞 固有名詞 12
33676 韓国 名詞 固有名詞 12
32085 プレ 名詞 固有名詞 13
32973 朝日 名詞 固有名詞 13
# 1文字のワードの行を外したデータフレームにする
frq4_Tw2 <- frq3_Tw2[index,]
frq4_Tw2 %>% arrange(Freq) %>% tail(50)
# アルファベットと数値で表現される文字列をgrep
# invert = TRUEで、grep対象以外の行を残す
index2 <- grep('[0-9A-Za-z]', frq4_Tw2[,1], invert = TRUE)
head(index2)
[1] 1851 1852 1853 1854 1855 1856
frq4_Tw2[index2,] %>% arrange(Freq) %>% tail(50) #確認
# アルファベットと数値で表現される文字列を含まない要素をデータフレーム化
frq5_Tw2 <- frq4_Tw2[index2,]
frq5_Tw2 %>% arrange(Freq) %>% tail(50)
Term Info1 Info2 Freq
33506 衆議院 名詞 固有名詞 9
33507 衆院 名詞 固有名詞 9
33674 静岡 名詞 固有名詞 9
32332 中国 名詞 固有名詞 10
32734 小室 名詞 固有名詞 10
31830 スマ 名詞 固有名詞 11
33136 沖縄 名詞 固有名詞 11
33159 流通センター 名詞 固有名詞 11
なお、アルファベットと数値のgrepに
grep('[0-9A-Za-z]', frq4_Tw2[,1], invert = TRUE)
を使いましたが、以下の正規表現を使ってもできると思います。
ただ、自分の技量不足か、余計なスペースなどがあったからか、取りこぼし(うまく引っかからない文字列)が出ました、
**'[0-9A-Za-z]'**で、やりたいことができたので、こちらを使いました。
# 正規表現
# [:alnum:] :アルファベットと数値 = [:alpha:] + [:digit:]
index2 <- grep('[:alnum:]', frq4_Tw2[,1], invert = TRUE)
# [:alpha:] :大小文字アルファベット = [:lower:] + [:upper:]
grep('[:alpha:]', frq4_Tw2[,1], invert = TRUE)
# アルファベット小文字、大文字の順
grep('[:lower:]', frq4_Tw2[,1], invert = TRUE)
grep('[:upper:]', frq4_Tw2b[,1], invert = TRUE)
≈
**「ggplot2」**を使い、出現頻度順に棒グラフも作っておきます
# Freqが10以上にする
frq6_Tw2 <- frq5_Tw2$Freq >= 10
frq7_Tw2 <- frq5_Tw2[frq6_Tw2,]
frq7_Tw2 %>% arrange(Freq) %>% tail(50)
# ggplot2で棒グラフを描く
# reorderは並び順指定
# stat="identity"はデータラベルつけるときに必要
# fill=ーFreqにすると値が大きいほど色が濃くなる
# coord_flip()を追加すると、x軸とy軸が入れ替わる
# geom_textとlabelで棒グラフにラベル(Freq)を追加。hjustはラベルの位置
library(ggplot2)
par(family = "HiraKakuProN-W3")
ggplot(frq7_Tw2, aes(x=reorder(Term, Freq), y=Freq))+
geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
xlab("")+
theme_gray (base_family = "HiraKakuPro-W3") +
geom_text(aes(x=reorder(Term,Freq), y=Freq,label = Freq), hjust=-0.1,colour = " blue", size = 2.5) +
coord_flip()
了