LoginSignup
1
1

More than 1 year has passed since last update.

R言語で「総裁選」を含むツイートを形態素解析 by using library("twitteR")

Posted at

image.png

TwitterAPIを利用:twitteR

#TwitterAPI認証情報設定
consumerKey <- "************"
consumerSecret <- "*****************"
accessToken <- "*****************"
accessSecret <- "*********************"

##TwitterAPIにログイン
library("twitteR")
options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

#「総裁選」を含む日本語ツイートを10000件取得。2021年9月4日から
tweets2 <- searchTwitter('総裁選', n = 10000, since = "2021-09-04" , lang="ja" , locale="ja")#日本語とロケールを指定(日本なら"ja")# 目的に応じて"popular","recent","mixed"を指定 #◼️

#データフレームに変換
tweetsdf2 <- twListToDF(tweets2) 
#型を確認
class(tweets2)
[1] "list"
class(tweetsdf2)
[1] "data.frame"

#取得できたか確認
library(dplyr)
tweetsdf2  %>% head()

リツイートのみ使用:table

#リツイートされたもの(TRUE)、そうでないもの(FALSE)の数を確認
table(tweetsdf2$isRetweet)
FALSE  TRUE 
 1252  8748 

#今回リツイートのみ使ってみる
tweetsdf3 <- tweetsdf2 %>% filter(isRetweet %in% c("TRUE")) 
head(tweetsdf3) #確認
nrow(tweetsdf3) #確認
[1] 8748

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

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

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

形態素解析をかける:RMeCab

#一時ファイルを作り、xfileという名前で保存
xfile <- tempfile()
write(texts3, xfile)

##形態素解析のライブラリー
library(RMeCab)

#形態素解析。頻度を集計
frq_Tw2 <- RMeCabFreq(xfile)
#上位50を確認
frq_Tw2 %>% arrange(Freq) %>% tail(50)

       Term  Info1                    Info2  Freq
8831   出る   動詞                     自立  1792
8832   出馬   名詞                 サ変接続  1802
8833   れる   動詞                     接尾  1803
8834      /   名詞                 サ変接続  1808
8835   って   助詞                   格助詞  1815
8836      .   名詞                 サ変接続  1863
8837    ://   名詞                 サ変接続  1865
8838   早苗   名詞                 固有名詞  1885
8839      t   名詞                     一般  1890
8840   さん   名詞                     接尾  1907
8841   安倍   名詞                 固有名詞  1912

アルファベット、記号を外す:str_match

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

8851   いる   動詞                   非自立  2625   いる
8852     RT   名詞                     一般  2625   <NA>
8853        名詞                   非自立  3207     
8854   高市   名詞                 固有名詞  3490   高市
8855        名詞                     接尾  3679     
8856 自民党   名詞                 固有名詞  3906 自民党
8857      _   名詞                 サ変接続  4228      _
8858        助詞                   格助詞  4765     
8859        記号                   括弧閉  5112     
8860        記号                     一般  5211     
8861     RT   名詞                 固有名詞  5272   <NA>
8862        記号                   括弧開  5434     

#削除。na.omitでNA含む行を削除。
frq5_Tw2 <- na.omit(frq4_Tw2) #◼️
frq5_Tw2 %>% arrange(Freq) %>% tail(50)

6716   いる   動詞                   非自立  2625   いる
6717        名詞                   非自立  3207     
6718   高市   名詞                 固有名詞  3490   高市
6719        名詞                     接尾  3679     
6720 自民党   名詞                 固有名詞  3906 自民党
6721      _   名詞                 サ変接続  4228      _
6722        助詞                   格助詞  4765     
6723        記号                   括弧閉  5112     
6724        記号                     一般  5211     
6725        記号                   括弧開  5434     

#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
6694 だから 接続詞                        *  1699 だから
6695   派閥   名詞                     一般  1744   派閥
6696   河野   名詞                 固有名詞  1765   河野
6697   出る   動詞                     自立  1792   出る
6698   出馬   名詞                 サ変接続  1802   出馬
6699   れる   動詞                     接尾  1803   れる
6700      /   名詞                 サ変接続  1808   <NA>
6701   って   助詞                   格助詞  1815   って
6702      .   名詞                 サ変接続  1863   <NA>
6703    ://   名詞                 サ変接続  1865   <NA>
6704   早苗   名詞                 固有名詞  1885   早苗
6705   さん   名詞                     接尾  1907   さん
6706   安倍   名詞                 固有名詞  1912   安倍

#削除。na.omitでNA含む行を削除。
frq7_Tw2 <- na.omit(frq6_Tw2) 
frq7_Tw2 %>% arrange(Freq) %>% tail(50)

6408   派閥   名詞                     一般  1744   派閥
6409   河野   名詞                 固有名詞  1765   河野
6410   出る   動詞                     自立  1792   出る
6411   出馬   名詞                 サ変接続  1802   出馬
6412   れる   動詞                     接尾  1803   れる
6413   って   助詞                   格助詞  1815   って
6414   早苗   名詞                 固有名詞  1885   早苗
6415   さん   名詞                     接尾  1907   さん
6416   安倍   名詞                 固有名詞  1912   安倍

1文字のワードも外す:grep

#Termが1文字の行を削除。まず、1文字ワードの行番号を抽出
index <- grep('..', frq7_Tw2[,1])
head(index)
[1] 2 3 4 7 8 9
frq7_Tw2[index,] %>% arrange(Freq) %>% tail(50) #確認

         Term  Info1          Info2  Freq     noun
5583     反省   名詞       サ変接続   888     反省
5584     政権   名詞           一般   892     政権
5585     から   助詞       接続助詞   901     から
5586 について   助詞         格助詞   921 について
5587     どう   副詞     助詞類接続   927     どう
5588     今回   名詞       副詞可能   940     今回
5589     戦争   名詞       サ変接続   965     戦争
5590     この 連体詞              *   975     この
5591     親分   名詞           一般   980     親分
5592     それ   名詞         代名詞  1032     それ

frq8_Tw2 <- frq7_Tw2[index,] 
frq8_Tw2 %>% arrange(Freq) %>% tail(50)

         Term  Info1          Info2  Freq     noun
5583     反省   名詞       サ変接続   888     反省
5584     政権   名詞           一般   892     政権
5585     から   助詞       接続助詞   901     から
5586 について   助詞         格助詞   921 について
5587     どう   副詞     助詞類接続   927     どう
5588     今回   名詞       副詞可能   940     今回
5589     戦争   名詞       サ変接続   965     戦争
5590     この 連体詞              *   975     この
5591     親分   名詞           一般   980     親分
5592     それ   名詞         代名詞  1032     それ

品詞を指定して抽出:filter

#「固有名詞」を抽出
frq9_Tw2 <- frq8_Tw2
frq10_Tw2 <- frq9_Tw2 %>% filter(Info2 %in% c("固有名詞")) 
frq10_Tw2 %>% arrange(Freq) %>% tail(50)

374           文雄  名詞 固有名詞  491           文雄
375           次郎  名詞 固有名詞  583           次郎
376           三笠  名詞 固有名詞  616           三笠
377           石破  名詞 固有名詞  699           石破
378           自民  名詞 固有名詞  751           自民
379           衆院  名詞 固有名詞  760           衆院
380           太郎  名詞 固有名詞  791           太郎
381           麻生  名詞 固有名詞 1213           麻生
382           日本  名詞 固有名詞 1365           日本
383           岸田  名詞 固有名詞 1438           岸田
384           河野  名詞 固有名詞 1765           河野
385           早苗  名詞 固有名詞 1885           早苗
386           安倍  名詞 固有名詞 1912           安倍
387           高市  名詞 固有名詞 3490           高市
388         自民党  名詞 固有名詞 3906         自民党

#ノイズになるなど外したいワードがある場合。行を削除
frq10_Tw2 <- frq10_Tw2 %>% filter(Term != "外したいワード")
frq10_Tw2 %>% arrange(Freq) %>% tail(50)

ワードクラウド作成:wordcloud2

#wordcloud2で描画準備
frq11_Tw2 <- frq10_Tw2 #下記の作業でミスをした場合元のデータフレームに戻せるようにする

#Freqが100以上にする
frq12_Tw2 <- frq11_Tw2$Freq >= 100
tail(frq12_Tw2) #確認

[1]  TRUE FALSE FALSE FALSE FALSE FALSE

frq13_Tw2 <- frq11_Tw2[frq12_Tw2,]
frq13_Tw2 %>% arrange(Freq) %>% tail(50)

             Term Info1    Info2 Freq           noun
1          キング  名詞 固有名詞  104         キング
2          民主党  名詞 固有名詞  105         民主党
3          衆議院  名詞 固有名詞  108         衆議院
4            山田  名詞 固有名詞  118           山田
5            ツイ  名詞 固有名詞  133           ツイ
6            森友  名詞 固有名詞  142           森友
7            中国  名詞 固有名詞  156           中国
8            小泉  名詞 固有名詞  182           小泉
9            枝野  名詞 固有名詞  182           枝野
10           竹中  名詞 固有名詞  182           竹中

#wordcloud2で描画。frq13_Tw2の1列目(Term)と4列目(Freq)を使う
library(wordcloud2)
#frq13_Tw2[,c(1,4)] %>% wordcloud2(size=2,minSize=1) #sise=2では全体が大きすぎるので下記利用
frq13_Tw2[,c(1,4)] %>% wordcloud2(size=1.3,minSize=1,gridSize=10)  #gridSizeは文字間隔

image.png

ラベル付き棒グラフも作成:geom_text

#次に、ワードの出現回数順に棒グラフ作成
#そのための準備
#扱いやすいようにTerm(ワード)とFreq(出現回数)の2列のデータフレームに
frq14_Tw2 <- frq13_Tw2
frq15_Tw2 <- data.frame(frq14_Tw2$Term, frq14_Tw2$Freq)
frq15_Tw2 #確認

   frq14_Tw2.Term frq14_Tw2.Freq
1          キング            104
2            ツイ            133
3            フジ            186
4            三笠            616
5            中国            156
6            太郎            791
7            安倍           1912
8            小泉            182
9            山田            118
10           岸田           1438

#Freq(frq14_Tw2.Freq)の降順に並び替え
frq16_Tw2 <- frq15_Tw2[order(frq15_Tw2$frq14_Tw2.Freq, decreasing=T), ] #◼️
frq16_Tw2 #確認

   frq14_Tw2.Term frq14_Tw2.Freq
24         自民党           3906
28           高市           3490
8            安倍           1912
14           早苗           1885
19           河野           1765
11           岸田           1438
13           日本           1365

#列名が元のデータフレーム から変わっているので、わかりやすい名称に変更
#列名を変更
colnames(frq16_Tw2) <- c("Word","Freq")
head(frq16_Tw2)

     Word Freq
24 自民党 3906
28   高市 3490
8    安倍 1912
14   早苗 1885
19   河野 1765
11   岸田 1438

#ggplot2で棒グラフを描く
#reorderは並び順指定
#stat="identity"はデータラベルつけるときに必要
#fill=ーFreqにすると値が大きいほど色が濃くなる
#coord_flip()を追加すると、x軸とy軸が入れ替わる
#geom_textとlabelで棒グラフにラベル(Freq)を追加。hjustはラベルの位置
library(ggplot2)
par(family = "HiraKakuProN-W3") 
ggplot(frq16_Tw2, aes(x=reorder(Word, Freq), y=Freq))+
   geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
   xlab("")+
   theme_gray (base_family = "HiraKakuPro-W3") +
  geom_text(aes(x=reorder(Word,Freq),y=Freq,label = Freq), hjust=-0.1,colour = " blue", size = 2.5) +
   coord_flip()

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