LoginSignup
1
1

More than 1 year has passed since last update.

活動休止前最後のライブ当日のツイートを固有名詞設定ユーザー辞書を使い「RMeCab」でワードクラウド

Posted at

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)  #上記で一番大きいワードが入らなかったのでこっち使用

image.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1