カテゴリ:
hr.icon
ツイート分析と機械学習
Twitterで大学についてどのようなつぶやきがされているか、頻出単語リストやワードクラウドを作って見てみると、すぐに何かの役に立つわけではなくても面白いものです。しかし、例えば、“ICU”で検索をしてツイートを取得してみても、”国際基督教大学“のことではなく、”集中治療室”に関するつぶやきも引っかかってしまい、”国際基督教大学”に関する頻出単語リストやワードクラウドを作成できません。 たとえば普通に”ICU 国際基督教大学”で検索したときに作るワードクラウドは次のようになってしまいます。 https://gyazo.com/8d138b23dda6cb29b34c719e78059b55
「ICU=集中治療室」の意味で使われているツイートを多く拾ってしまっていることが推測できます。
これを、機械学習を用いて、「ICU=国際基督教大学」の意味で使われているツイートを予測してワードクラウドを作成すると、次のようになります。 https://gyazo.com/86726f2081da516fb0fc42002706e8fa
さらに日付別頻出単語リストを作ってみると次のようになります。
https://gyazo.com/ae54574744aaf3645e4837762d6a47f8
このようなグラフを機械学習を通して作成するために、今回は、 (1) Rtweetパッケージでツイートを取得する。
(2) RMeCabパッケージで形態素解析を行う。
(4) caretパッケージで、教師あり機械学習を行う。 (5) モデルを用いて新たに取得したツイートを分類して日付別頻出単語リストとワードクラウドを作成する。 (6) 問題点や改善すべき点
について書きます。よりよい方法や問題点などあれば教えていただければ幸いです。
(1) Rtweetパッケージでツイートを取得する
Rtweetパッケージでツイートを取得するためには、ツイッターのアカウントが必要です。初めてRtweetを使用する際は、アプリ連携が求められます。かつてtweeteRというパッケージを使う際にはTwitterAPI登録などをしなければいけなかったのですが、Rtweetパッケージであれば普通のツイッターアカウントで使用可能です。 まず、今回必要なパッケージのインストールと読み込みを行います。その他必要なパッケージもまとめて読み込みます。 形態素解析用のRMeCabパッケージを使用するためには、まずMeCab本体をインストールする必要があるので、インストールされていない場合は、RMeCabのウエブサイト(*2)のinstallのページからインストールしてください。 code:パッケージのインストールと読み込み
# まだインストールしていない場合はまずインストールします。
install.packages("tm") #転置用 install.packages("caret") #機械学習用 devtools::install_github("thomasp85/patchwork") #プロットを並べる用 webshot::install_phantomjs(force=TRUE)
# インストールしてあればパッケージの読み込みをします。
library(rtweet)
library(RMeCab)
library(tidyverse)
library(doParallel)
registerDoParallel(makePSOCKcluster(detectCores()))
library(wordcloud2)
library(tm)
library(caret)
library(xlsx)
library(patchwork)
library(htmlwidgets)
library(webshot)
それでは早速ツイートを取得してみます。
search_tweetsの最初の引数は検索ワードです。Twitterで普通に検索するとき検索窓に入れる内容を引用符に入れます。 “-filter:replies”の部分ではリプライを対象から除いています。”@tokoroten-daio”の部分は、存在しないアカウント名を一緒に検索すると、ユーザ名に検索対象のキーワードが入っていても対象外になるようなので入れています。ところてん大王がTwitterを始めてしまったら別の存在しないアカウント名にしてください。
code:ツイートの取得
tweet_raw <- search_tweets(
as.data.frame() %>%
select(created_at,text,is_quote,is_retweet,favorite_count,retweet_count,quote_count,reply_count)
write.csv(tweet_raw,"tweet_raw.csv", fileEncoding = "CP932")
tweet_simple <- read.csv("tweet_raw.csv ") %>% select(-X, created_at,text)
# 1行に1ツイート入っているのですが、各ツイートに名前を付けておきます。
tweet_name <- data.frame(count = c(1: nrow(tweet_simple))) %>% mutate("fname" = paste("tweet_",as.character(formatC(count,width=4,flag="0")),".txt",sep="")) %>% select(-count)
## 名前とtweet_simpleをつなぎます。
tweet_simple <- data.frame(tweet_name, tweet_simple)
tweet_ICU <- tweet_simple %>% filter(grepl("ICU|国際基督教大",text) )
tweet_freq <- ggplot(tweet_ICU,aes(x=as.Date(created_at))) +
geom_bar(stat="count")
tweet_freq
https://gyazo.com/7399f2e9afbc9ea1c84a81668e9af88a
2020年3月10日のお昼に取得したので上のようなグラフに、3月1日から3月10日のツイートを取得しています。3月1日分が少ないのかはそこで3,000件に達してしまったからかもしれません。
(2) RMeCabパッケージで形態素解析を行う。
RMeCabを使って単語の出現頻度を出してみます。簡単のために英語や記号は削除してしまいます(ASCII文字を抜いてしまいます)。ただし、そうすると”ICU”も削除されて文脈がわからなくなってしまうので、ICUの削除は回避します。RMeCabの形態素解析については、小林(2018) を参考にしました(*3)。 code:余分な文字の消去
tweet_analysis <- tweet_ICU %>%
mutate(text=str_replace_all(text,"ICU","ところてん大王"),
text=str_remove_all(text,"\\p{ASCII}"),
text=str_replace_all(text,"ところてん大王","ICU"))
もしも、”ところてん大王”が大学名と一緒にツイートされることが観測されてしまったら、“ところてん大王”は別の観測されないであろう単語に変える必要があります。
code:形態素解析
tweet_list = iconv(tweet_analysis$text,from = "UTF-8", to = "CP932") %>% na.omit()
temp <- tempfile()
tweet_list %>% write(file=temp)
meishi <- c("一般","固有名詞")
# RmeCabFreqで頻度表を作成
tweet_list %>% write(file=temp)
term_freq <- RMeCabFreq(temp) %>% filter(Term != "ICU") %>% #”ICU”は除きます。 filter(Info1=="名詞" & Info2 %in% meishi) %>%
arrange(desc(Freq))
freq_20 <- term_freq %>% head(20) %>%
ggplot(aes(x=reorder(Term,Freq),y=Freq)) +
geom_bar(stat="identity",fill ="steelblue", alpha=0.3)+
coord_flip() +
geom_text(aes(label=Freq),size=3,colour="black") +
labs(title="",x="頻度", y= "単語") +
theme(plot.title = element_text(hjust=0.5) ,
panel.background = element_rect(
fill = "transparent",color = NA),
panel.grid.minor = element_line(color = NA),
panel.grid.major = element_line(color = NA),
plot.background = element_rect(fill = "transparent",color = NA),
legend.position = 'none')
freq_20
https://gyazo.com/2a9e4c0c5aa34667b6e721be05494981
この頻度表を見ていると、”集中治療室”としての”ICU”を拾ってしまっているだろうことが想像できます。
あとで機械学習により”国際基督教大学”の”ICU”のツイートの判定をするのですが、その時のために頻出300語のリストを作っておきます。
code:頻出300語の作成
xinstead <- data.frame(count = c(1:300)) %>% mutate("xterm" = paste("XX",as.character(count),sep=""))
%>% select(xterm)
freq_term <- data.frame(xinstead, head(term_freq,300)) %>% select(xterm,Term)
write.csv(freq_term,"freq_term.csv", fileEncoding = "CP932") #結果をcsvに残しておく freq_term <- read.csv("freq_term.csv") %>% select(-X)
(3) wordcloud2パッケージでワードクラウドを作成する。
頻度表を作った段階で、”集中治療室”に関するつぶやきが多くなってしまっていることはわかっているのですが、まずこのままワードクラウドを作ってみます。
code:頻出300語の作成
term_for_cloud <- term_freq %>% select(Term,Freq)
wordcloud2(head(term_for_cloud,40),shape="circle" ,#形を丸
size=1,#サイズは0.5
color = "random-dark") #色指定 https://gyazo.com/837d76dff2dc5fd3d6d1b9a4dcffd4b8
ICU=集中治療室の意味でつぶやかれているツイートを多く取得していて、新型コロナウイルスに関連する単語が多くなっていることがわかります。そこで、次に機械学習でICU=国際基督教大学に関するつぶやきを判定して、そのつぶやきに関するワードクラウドを作っていく作業を行います。 先に結果を見ると、次のようなワードクラウドが作れました。
https://gyazo.com/94b19152c6b61ec1df1de3140e5003a1
(4) caretパッケージで教師あり機械学習を行う。
ここから教師あり機械学習をしていきます。しかし最初は手作業で、国際基督教大学に関するつぶやきなのか、それ以外の話題なのか、ラベルをつけていく必要があります。 最初に、各ツイートの出てくる単語の回数を数えます。国際基督教大学のつぶやきなのかどうかを、各単語の頻度を変数にして、判定していきます。
code:各ツイートの単語の頻度
Freq_mieshi <- freq_term$Term
Freq_mieshi
doc.DF.result <- docDF(tweet_simple,column = "text", type=1)
doc.DF.result.2 <- filter(doc.DF.result, POS1 == "名詞",POS2 %in% meishi) %>% filter(TERM %in% Freq_mieshi)
doc.DF.result.3 <- doc.DF.result.2 %>% gather(key=rowname, value = Freq_i,Row1:colnames(doc.DF.result.2)ncol(doc.DF.result.2)) doc.DF.result.4 <- doc.DF.result.3 %>% group_by(rowname,TERM) %>% summarize("頻度" =sum(Freq_i))
doc.DF.result.4_2 <- left_join(doc.DF.result.4,freq_term, by = c("TERM"="Term")) %>% select(-TERM)
doc.DF.result.5 <- doc.DF.result.4_2 %>% spread(xterm,頻度) %>% ungroup() %>%
mutate(rowname = as.numeric(str_replace_all(rowname,pattern ="Row",replacement=""))) %>%
mutate(fname = paste("tweet_",as.character(formatC(rowname ,width=4,flag="0")),".txt",sep="")) %>% select(-rowname)
tweet_join <- tweet_simple %>% select(fname,text)
ICUtweet <- left_join(tweet_join,doc.DF.result.5, by = "fname") %>% mutate(ICU = "0")
write.csv(ICUtweet,"rwteet_hindo.csv", fileEncoding = "CP932")
ICUtweet <- read.csv("rwteet_hindo.csv") %>% select(-X) %>% mutate(ICU =as.factor(ICU))
ICUtweetは次のような形になっています。
https://gyazo.com/9db330067a5ae856bb730f8c03541315
次に教師あり学習をするために、先程すべて0を入れた変数“ICU”に、手作業で国際基督教大学の話題なら1、そうでないなら0と入力していきます。しかし、取得したツイートすべてに対してこの作業をするのは面倒なので、半分だけ手作業でラベル付けをします。
code:手作業で国際基督教大学に関するツイートかどうか判定
for_Teacher <- createDataPartition(y = ICUtweet$ICU, p = 0.5, list =F) #p=0.5で半分だけ抽出します。 write.csv(df_Teacher,"df_Teacher.csv", fileEncoding = "CP932")
次のようなcsvが出力されますので、text列のツイートを見て手作業でICU列に国際基督教大学の話題なら1そうでないなら0を入力する作業をします。
https://gyazo.com/123d09dddb96515a2b7482cbee266b66
code:手作業で入力したcsvの読み込み
df_Trainteacher <- read_csv("df_TeacherT.csv",locale = locale(encoding = "cp932"))
df_Trainteacher <- df_Trainteacher %>% as.data.frame() %>% mutate(ICU = as.factor(ICU))
code:caretパッケージで機械学習モデルを作る
write.csv(non_used_xterm,"non_used_xterm.csv", fileEncoding = "CP932")
freq_term_used <- read.csv("freq_term.csv") %>% select(-X) %>% filter(!xterm %in% non_used_xterm)
write.csv(freq_term_used,"freq_term_used.csv", fileEncoding = "CP932")
## 何度やっても同じになるように乱数の種を設定しておきます。
set.seed(321)
inTrain <- createDataPartition(y = df_Trainteacher$ICU, p = 0.75, list =F)
dt_model<- train(ICU~., data = select(df_Train,-text,-fname), method = "xgbTree",
preProcess = c('center', 'scale'),
trControl = trainControl(method = "cv"),
tuneLength = 4)
saveRDS(dt_model, file = "dt_model.rds")
pred1 <- predict(dt_model,df_Test)
confusionMatrix(pred1,df_Test$ICU)
結果の一部は次のとおりです。手作業でICU=0と判定したもののうち、モデルでICU=0で予測されたものは303件、ICU=1と判定されたものは1件でした。また、手作業でICU=1と判定したもののうち、モデルでICU=0で予測されたものは31件、ICU=1と判定されたものは36件でした。
ICUの話題でないものを0と判定する精度は高いですが、ICUの話題のうち半分近くICUの話題でないと判定しまっておりミスが多い結果になっています。
https://gyazo.com/8e2bc1bad8050370f55bcca36f9e0c34
ただ、Reference=1かつPredicition=0のツイートを見てみると、ツイート自体が非常に短いものであるなど、確かにこれはICU=国際基督教大学の話題と判定されなくても仕方ないかなと思うものもありました。モデルに問題はありますが、一旦おいておいて、このモデルを使って取得したツイート全体に対して各ツイートがICUの話題なのかどうか予測してみます。
code:予測
ICUtweet2 <- ICUtweet %>% select(-text,-fname,-non_used_xterm) %>% mutate(ICU = as.factor(ICU))
ICUpredict <- predict(dt_model,ICUtweet)
ICUpredict
ICUpredict_check <-data.frame(ICUpredict,ICUtweet)
ICUpredict_checkは次のような形になっています。
https://gyazo.com/7ad7541992dbfd9816005a4b294eb960
この結果を使って、ICUpredict=1の場合のワードクラウドを作ってみます。
code:予測後のワードクラウドの作成
ICUpredict_ICU <-ICUpredict_check %>% filter(ICUpredict =="1") %>% mutate(text = as.character(text))
ICUpredict_ICUc <- ICUpredict_ICU %>%
mutate(text=str_replace_all(text,"ICU","ところてん大王"),#一度”ICU”を”ところてん大王”に変えておきます。
text=str_remove_all(text,"\\p{ASCII}"),
text=str_replace_all(text,"ところてん大王","ICU"))
res_freq_f2 <- res_freq2 %>% filter(Info1=="名詞" & Info2 %in% meishi) %>% select(Term,Freq)
res_freq_f2 <- res_freq_f2 %>% arrange(desc(Freq)) %>% select(Term,Freq)
wordcloud2(head(res_freq_f2,50),shape="circle" ,#形を丸
size=1,#サイズは0.5
color = "random-dark") #色指定 大分国際基督教大学の話題らしくなりました。
https://gyazo.com/cb2d839774c16b01639fc0360c7f8c3d
(5) モデルを用いて新たに取得したツイートを分類して日付別頻出単語リストとワードクラウドを作成する。
せっかくモデルを作ったので、今後は1週間分のツイートを取得して自動的に分類をして、ぱぱっと日付別頻出単語リストとワードクラウドを作ってみたいと思います。
code:1週間分の日付別頻出単語リストとワードクラウドを作成する
######################################################
######################################################
meishi <- c("一般","固有名詞")
freq_term <- read.csv("freq_term.csv") %>% select(-X)
freq_term
Freq_mieshi <- as.character(freq_term$Term)
freq_term_used <- read.csv("freq_term_used.csv") %>% select(-X)
non_used_xterm <- as.character(read.csv("non_used_xterm.csv", fileEncoding = "CP932")$x)
dt_model <- readRDS("dt_model.rds")
huyou_term <- c("ー","国際基督教大学","人","ICU","ICUICU","ICU","大学")
search <- paste0("ICU -filter:replies OR 国際基督教大 OR @tokoroten-daio since:",Sys.Date()-7,"until:",Sys.Date()-1)
tweet_rawN <- search_tweets(
as.data.frame() %>%
select(created_at,text,is_quote,is_retweet,favorite_count,retweet_count,quote_count,reply_count)
filename_tweet <- paste0("tweet_raw_",Sys.Date()-7,"_",Sys.Date()-1,".csv")
filename_tweet
write.csv(tweet_rawN,filename_tweet, fileEncoding = "CP932")
# tweet_raw.csvを読み込んで今回使う変数だけ選択します。
tweet_simpleN <- read.csv(filename_tweet) %>% select(-X, created_at,text)
tweet_simpleN <-tweet_simpleN %>% filter(grepl("ICU|icu|国際基督教大",text) )
tweet_freqN <- ggplot(tweet_simpleN,aes(x=as.Date(created_at))) +
geom_bar(stat="count", fill ="steelblue", alpha=0.3)+
labs(title="",x="日付", y= "Tweet数") +
stat_count(aes(label = ..count..),geom ="text",size=3,colour="black") +
scale_x_date(date_breaks = "1 days")+
theme(plot.title = element_text(hjust=0.5) ,
panel.background = element_rect(
fill = "transparent",color = NA),
panel.grid.minor = element_line(color = NA),
panel.grid.major = element_line(color = NA),
plot.background = element_rect(fill = "transparent",color = NA),
legend.position = 'none')
tweet_freqN
# 1行に1ツイート入っているのですが、各ツイートに名前を付けておきます。
tweet_nameN <- data.frame(count = c(1: nrow(tweet_simpleN))) %>% mutate("fname" = paste("tweet_",as.character(formatC(count,width=4,flag="0")),".txt",sep="")) %>% select(-count)
## 名前とtweet_simpleをつなぎます。
tweet_simpleN <- data.frame(tweet_nameN, tweet_simpleN)
## 余計な文字を除く
tweet_analysisN <- tweet_simpleN %>%
mutate(text=str_replace_all(text,"ICU","ところてん大王"),
text=str_remove_all(text,"\\p{ASCII}"),
text=str_replace_all(text,"ところてん大王","ICU")) %>%
mutate(text = iconv(text,from = "UTF-8", to = "CP932"))
doc.DF.resultN <- docDF(tweet_analysisN,column = "text", type=1)
doc.DF.resultN.2 <- filter(doc.DF.resultN, POS1 == "名詞",POS2 %in% meishi)
doc.DF.resultN.3 <- doc.DF.resultN.2 %>% gather(key=rowname, value = Freq_i,Row1:colnames(doc.DF.resultN.2)ncol(doc.DF.resultN.2)) doc.DF.resultN.4 <- doc.DF.resultN.3 %>% group_by(rowname,TERM) %>% summarize("頻度" =sum(Freq_i)) %>% ungroup() %>%
mutate(rowname = as.numeric(str_replace_all(rowname,pattern ="Row",replacement=""))) %>%
mutate(fname = paste("tweet_",as.character(formatC(rowname ,width=4,flag="0")),".txt",sep="")) %>% select(-rowname)
doc.DF.resultN.4_2 <- left_join(filter(doc.DF.resultN.4,TERM %in% Freq_mieshi) ,freq_term, by = c("TERM"="Term")) %>% select(-TERM)
doc.DF.resultN.5 <- doc.DF.resultN.4_2 %>% spread(xterm,頻度) %>% ungroup()
tweet_joinN <- tweet_analysisN %>% select(fname,text)
ICUtweetN <- left_join(tweet_joinN,doc.DF.resultN.5, by = "fname") %>% mutate(ICU = "0")
filename_doc_result<- paste0("ICUtweet",Sys.Date()-7,"_",Sys.Date()-1,".csv")
write.csv(ICUtweetN,filename_doc_result, fileEncoding = "CP932")
ICUtweetN <- read.csv(filename_doc_result) %>% select(-X) %>% mutate(ICU =as.factor(ICU))
## freq_termに入っているxtermで、今回検索した結果に入っていないものを0ベクトルで追加
terms_appear <- as.data.frame(colnames(ICUtweetN)) %>% rename(hensu = "colnames(ICUtweetN)")
terms_not_appear <- freq_term %>% filter(!xterm %in% terms_appear$hensu)
terms_not_appear <- terms_not_appear$xterm %>% as.vector()
for(n in 1 : length(terms_not_appear)){eval(parse(text = paste0("ICUtweetN2$",terms_not_appearn,"<- 0")))} ICUtweetN2 <- ICUtweetN %>% select(-text,-fname,-non_used_xterm) %>% mutate(ICU = as.factor(ICU))
ICUpredictN <- predict(dt_model,ICUtweetN2)
ICUpredictN
ICUpredict_checkN <-data.frame(ICUpredictN,ICUtweetN)
filename_predict<- paste0("ICUpredict",Sys.Date()-7,"_",Sys.Date()-1,".csv")
write.csv(ICUpredict_checkN,filename_predict, fileEncoding = "CP932")
text_dateN <- tweet_analysisN %>% select(fname,created_at)
freqWord_dateN0 <- as.data.frame(ICUpredict_checkN) %>% filter(ICUpredictN == 1) %>% select(fname)
freqWord_dateN0_1 <- left_join(freqWord_dateN0,text_dateN,by = "fname")
freqWord_dateN0_2 <- inner_join(freqWord_dateN0_1,doc.DF.resultN.4,by = "fname")
freqWord_date_Ng2 <- freqWord_dateN0_2 %>% mutate(created_at = as.Date(created_at)) %>% filter(!TERM %in% huyou_term) %>% rename(Term = TERM,freq = 頻度)
k <- as.numeric(max(freqWord_date_Ng2$created_at) - min(freqWord_date_Ng2$created_at))
for(i in 0 : k){
plot0 <- freqWord_date_Ng2 %>% filter(created_at == min(freqWord_date_Ng2$created_at) +i) %>% group_by(Term) %>%
summarize(Freq = sum(freq)) %>%
arrange(desc(Freq)) %>%
head(30) %>% ggplot() +
geom_bar(aes(x=reorder(Term,Freq),y=Freq),stat="identity") +
ylim(0,30) +
coord_flip() +
theme(axis.title = element_text(size=1)) +
labs(title=str_replace_all(substr(paste0(min(freqWord_date_Ng2$created_at) +i),3,10),"-",""),x="", y= "")
j <-as.character(formatC(i+1,width=2,flag="0"))
assign(paste("plotN",j,sep="_"),plot0)
}
plotsname <- "("
for(m in 1:(k-1)){plotsname <- paste0(plotsname,"plotN_0",m,"|")}
plotsname <- paste0(plotsname,"plotN_0",k,")")
plot_patch <- eval(parse(text = plotsname))
plot_patch
filename_plots <- paste0("日別頻出単語30_",Sys.Date()-7,"_",Sys.Date()-1,".pdf")
pdf(filename_plots,width=11.69,height=8.27,family="Japan1") # 描画デバイスを開く
ICUpredict_checkN_f <- ICUpredict_checkN %>% filter(ICUpredictN == 1) %>% mutate(text = as.character(text))
ICUpredict_checkN_f$text
##tweet_listN <- iconv(ICUpredict_checkN_f$text,from = "#UTF-8", to = "CP932") %>% na.omit() tweet_listN <- ICUpredict_checkN_f$text
tempN <- tempfile()
tweet_listN %>% write(file=tempN)
# RmeCabFreqで頻度表を作成
tweet_listN %>% write(file=tempN)
term_freqN <- RMeCabFreq(tempN) %>%
filter(Info1=="名詞" & Info2 %in% meishi) %>%
arrange(desc(Freq))
# ワードクラウド用に整形し、興味のない単語を除きます。
term_freqN_could <- term_freqN %>% arrange(desc(Freq)) %>% mutate(term = Term) %>% select(term,Freq) %>%
filter(!term %in% huyou_term)
# ワードクラウドを作成します。
word_cloud <- wordcloud2(head(term_freqN_could,50),shape="circle" ,#形を丸
size=1,#サイズは0.5
color = "random-dark") #色指定 word_cloud
filename_cloud_html <- paste0("wordcloud_",Sys.Date()-7,"_",Sys.Date()-1,".html")
filename_cloud_png <- paste0("wordcloud_",Sys.Date()-7,"_",Sys.Date()-1,".png")
saveWidget(word_cloud,filename_cloud_html,selfcontained = F)
webshot(filename_cloud_html, file = filename_cloud_png, delay=5)
長いですが、一度作ってしまえば、あとはただ実行するだけで、最初にも見た次のようなグラフが作成できます。
https://gyazo.com/823d56c798ab2cf7758f48caecbb4503
https://gyazo.com/86726f2081da516fb0fc42002706e8fa
https://gyazo.com/2750e6e07914a7aba170d8039e7bba85
(6) 問題点や改善すべき点
今回の方法ではいくつかの問題点があります。
今回は単純に2020年3月10日に取得したツイートの頻出単語300語から使用できるもの(分散が0に近くないもの)などを使いました。また、英数字は除外してしまっています。
しかし、本来は「この単語が出てきたらほぼ国際基督教大学の話題だろう」という単語も容易に羅列することができるので、そうした単語も含めるべきです(例;国際基督教大学の研究所の英字での略称など)。 そうした単語はまずmecabに辞書登録して、頻度を計測できるようにし、機械学習の変数としても使用するべきです。 実用的には、日別頻出単語リストを定期的に作って、新しく出てくる単語や頻度の変化に注目して「なぜ今この単語がICU(国際基督教大学)と一緒に出てきているのだろうか」と探っていくのが面白いと思います。
しかし、予測モデルはあくまで2020年3月10日に取得したツイートから作成したモデルです。本来、新しく出てくる単語や頻度の変化にもっとも興味があるのに、過去に作成したモデルからでは最新のツイートの予測の精度が落ちるかもしれません。例えばいまは「#春からICU」というハッシュタグを用いて部活・サークルが新歓のためのツイートをしているケースが多く見られますが、春という単語がICUの予測に役立つのは今の時期だけかもしれません。 モデルは定期的に過去の教師ありデータに新しいデータを追加して(また手作業をして)更新をしていく必要があるかもしれません。
③Twitterの利用者
現役の学生の年代ですと、もしかしたらTwitterよりInstagramを利用している方の方が主流なのかもしれません。そうするとそもそもTwitterのツイートを分析しても、あまり現役の学生のつぶやきについては見られていないかもしれません。他にもTwitterの利用者の属性には色々な特徴があると思いますので、あくまでTwitter上のつぶやきだけが対象で偏った分析であることを意識する必要があると思います。 しかし、問題点は多いものの、なんとなく面白いなとか、何かの分析の入り口に使う程度には便利かもしれません。ぜひ、他の大学名などでも試して遊んでみてください。また、いい改善方法があれば教えていただければ幸いです。
それでは、ところてん大王のアカウントを作ってきます!
hr.icon
注
(*1) この内容は私個人の見解であり、所属組織の見解ではありません。
(*2) “RMeCab”
(*3) 小林雄一郎, 「Rによるやさしいテキストマイニング[活用事例編]」,2018年。
(*4)“XGBoostによる機械学習(R : caretパッケージを使ってみた)”
※当コラムの文責及び著作権は、すべて投稿者に帰属します。