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

##API使いツイート取得：twitteR

AAA活動休止前最後のドームツアー公演が昨年2021年12月25日で幕を閉じ、ツイートを取得・ワードクラウド作成を試みました。
途中で[「ユーザー辞書」の登録を始め](https://qiita.com/tex_owleyes/items/adc9210937b7d4fe977b)、ワードクラウドが途中で終わっていたので、その続きです。

```R
#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

今回はリツイーされた投稿を使います。

```R
#リツイートされたもの（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

抽出したツイートは複数の項目（下記）を含みます。

```R
colnames(tweetsdf2)
 [1] "text"          "favorited"     "favoriteCount" "replyToSN"     "created"       "truncated"    
 [7] "replyToSID"    "id"            "replyToUID"    "statusSource"  "screenName"    "retweetCount" 
[13] "isRetweet"     "retweeted"     "longitude"     "latitude"     
```

投稿（text）のみ取り出して形態素解析にかけます。

```R
#データフレームのテキスト列だけ抽出
texts <- tweetsdf3$text

#後々使うのでテキスト処理のためのライブラリを呼び出す
library(stringr)
library(magrittr)

#複数の（リスト型）テキストを結合。テキストとテキストの間にはブランクを入れる
class(texts)
str(texts)
texts3 <- paste(texts, collapse = "")
str(texts3)
```

##形態素解析をかける：RMeCab

```R
#一時ファイルを作り、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
```

固有名詞が「真司」と「郎」と分断されたり、「実」と「彩子」が分断されたりします。
そこで、ユーザー辞書を登録しました。[→こちら参照](https://qiita.com/tex_owleyes/items/adc9210937b7d4fe977b)
辞書の内容は以下の通りです。

```
西島,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,にしじま,ニシジマ,ニシジマ
宇野,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,うの,ウノ,ウノ
日高,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,ひだか,ヒダカ,ヒダカ
與,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,あたえ,アタエ,アタエ
末吉,,,1000, 名詞, 固有名詞, 人名, 姓,*,*,すえよし,スエヨシ,スエヨシ
隆弘,,,1000, 名詞, 固有名詞, 人名, 名,*,*,たかひろ,タカヒロ,タカヒロ
実彩子,,,1000, 名詞, 固有名詞, 人名, 名,*,*,みさこ,ミサコ,ミサコ
光啓,,,1000, 名詞, 固有名詞, 人名, 名,*,*,みつひろ,ミツヒロ,ミツヒロ
真司郎,,,1000, 名詞, 固有名詞, 人名, 名,*,*,しんじろう,シンジロウ,シンジロウ
秀太,,,1000, 名詞, 固有名詞, 人名, 名,*,*,しゅうた,シュウタ,シュウタ
```

#ユーザ辞書使い再度形態素解析：RMeCabFreq

この辞書（aaa.dic）を適用してみます。
なお、上記の辞書では、例えば「西島」が認識されても、形態素解析の結果ではひらがな「にしじま」が出るようにしています。
ユーザー辞書の動作を確認しやすくするためです。
形態素解析の結果です。

```R
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」をキーにツイートを取得しているので、入ってて当然のワードなのでなくてもよしとして進めます。

```R
#見やすいように整形するために、「アルファベット」「記号」を削除
#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

```R
#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が「接尾」を外します。

```R
#「名詞」を抽出
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

```R
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の１列目（Term）と４列目（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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/f881cbab-acb8-3252-0e3d-e8bac94ccc3c.png)

**了**