系統參數設定
Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") # 避免中文亂碼
OS reports request to set locale to "zh_TW.UTF-8" cannot be honored
[1] ""
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
安裝需要的packages
packages = c("dplyr", "tidytext", "stringr", "wordcloud2", "ggplot2",'readr','data.table','reshape2','wordcloud','tidyr','scales')
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)
library(dplyr)
library(stringr)
require(tidytext)
library(wordcloud2)
require(data.table)
require(ggplot2)
require(reshape2)
require(wordcloud)
require(tidyr)
require(readr)
require(scales)
資料來源:文字平台收集ptt八卦版,關鍵字搜尋:美心、還願
準備LIWC字典
p <- read_file("../dict/liwc/positive.txt")
n <- read_file("../dict/liwc/negative.txt")
positive <- strsplit(p, "[,]")[[1]]
negative <- strsplit(n, "[,]")[[1]]
positive <- data.frame(word = positive, sentiments = "positive")
negative <- data.frame(word = negative, sentiemtns = "negative")
colnames(negative) = c("word","sentiment")
colnames(positive) = c("word","sentiment")
LIWC_ch <- rbind(positive, negative)
LIWC_ch
字典1:LIWC_ch
以LIWC字典判斷文集中的word屬於正面字還是負面字
首先計算所有字在文集中出現的總數
word_count <- data %>%
select(word,count) %>%
group_by(word) %>%
summarise(count = sum(count)) %>%
filter(count>3)
word_count
與LIWC情緒字典join
文集中的字出現在LIWC字典中是屬於positive還是negative
word_count %>% inner_join(LIWC_ch)
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector
data %>%
select(word) %>%
inner_join(LIWC_ch)
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector
以LIWC情緒字典分析
統計每天的文章正面字的次數與負面字的次數
# 找出所有在時間區段中的日期
all_dates <-
expand.grid(seq(as.Date(min(data$artDate)), as.Date(max(data$artDate)), by="day"), c("positive", "negative"))
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
plot_table<-data %>%
select(artDate,word,count) %>%
inner_join(LIWC_ch) %>%
group_by(artDate,sentiment) %>%
summarise(count=sum(count))
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vectorWarning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
#沒有資料的日期將count設為0
plot_table <- all_dates %>%
merge(plot_table,by.x=c('artDate', "sentiment"),by.y=c('artDate', "sentiment"),
all.x=T,all.y=T) %>%
mutate(count = replace_na(count, 0))
plot_table %>%
ggplot()+
geom_line(aes(x=artDate,y=count,colour=sentiment))+
scale_x_date(labels = date_format("%m/%d"))

以LIWC字典統計的情緒字數關察兩條線的差異,結果不明顯
同樣的方法以自訂情緒字典來分析並觀察有無差異
準備字典:遊戲商字典
以遊戲商的角度判斷情緒字屬於positive還是negative
將LIWC的情緒字以遊戲商角度重新label
Ex:
驚悚:positive 不恐怖:negative
Column `word` joining character vector and factor, coercing into character vectorWarning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
p <- read_file("../dict/game_company/positive.txt")
n <- read_file("../dict/game_company/negative.txt")
positive <- strsplit(p, "[,]")[[1]]
negative <- strsplit(n, "[,]")[[1]]
positive <- data.frame(word = positive, sentiments = "positive")
negative <- data.frame(word = negative, sentiemtns = "negative")
colnames(negative) = c("word","sentiment")
colnames(positive) = c("word","sentiment")
game_company_ch <- rbind(positive, negative)
plot_table<-data %>%
select(artDate,word,count) %>%
inner_join(game_company_ch) %>%
group_by(artDate,sentiment) %>%
summarise(count=sum(count))
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vectorWarning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
#沒有資料的日期將count設為0
plot_table <- all_dates %>%
merge(plot_table,by.x=c('artDate', "sentiment"),by.y=c('artDate', "sentiment"),
all.x=T,all.y=T) %>%
mutate(count = replace_na(count, 0))
plot_table %>%
ggplot()+
geom_line(aes(x=artDate,y=count,colour=sentiment))+
scale_x_date(labels = date_format("%m/%d"))

接下來準備自訂字典xi_ch
以習近平的觀點來分析情緒字
準備字典:xi_ch
p <- read_file("../dict/xi/positive.txt")
n <- read_file("../dict/xi/negative.txt")
positive <- strsplit(p, "[,]")[[1]]
negative <- strsplit(n, "[,]")[[1]]
positive <- data.frame(word = positive, sentiments = "positive")
negative <- data.frame(word = negative, sentiemtns = "negative")
colnames(negative) = c("word","sentiment")
colnames(positive) = c("word","sentiment")
xi_ch <- rbind(positive, negative)
xi_ch
plot_table<-data %>%
select(artDate,word,count) %>%
inner_join(xi_ch) %>%
group_by(artDate,sentiment) %>%
summarise(count=sum(count))
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vectorWarning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
#沒有資料的日期將count設為0
plot_table <- all_dates %>%
merge(plot_table,by.x=c('artDate', "sentiment"),by.y=c('artDate', "sentiment"),
all.x=T,all.y=T) %>%
mutate(count = replace_na(count, 0))
plot_table %>%
ggplot()+
geom_line(aes(x=artDate,y=count,colour=sentiment))+
scale_x_date(labels = date_format("%m/%d"))

在02/15後負面情緒非常高
由於符咒風波引發中國玩家強烈的抵制
上面幾張圖發現02/15後有一段高峰
接下來都以02/15後的資料進行分析
比較兩個字典分析差異
senti_by_date_game_company<-data %>%
inner_join(game_company_ch) %>%
group_by(artDate, sentiment) %>%
summarise(n=sum(count)) %>%
spread(sentiment, n, fill = 0) %>%
mutate(sentiment = positive - negative) %>%
mutate(method='game_company')
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector
senti_by_date_game_company
LIWC字典
計算每天的文章正面及負面字數
sentiment為正面字數減去負面字數
senti_by_date_LIWC<-data %>%
inner_join(LIWC_ch) %>%
group_by(artDate, sentiment) %>%
summarise(n=sum(count)) %>%
spread(sentiment, n, fill = 0) %>%
mutate(sentiment = positive - negative) %>%
mutate(method='LIWC')
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector
senti_by_date_LIWC
比較兩個字典分析差異
bind_rows(senti_by_date_game_company,
senti_by_date_LIWC) %>%
filter(artDate>='2019-02-15') %>%
ggplot(aes(x= artDate,y=sentiment,fill=method)) +
geom_col(show.legend = FALSE) +
scale_x_date(labels = date_format("%m/%d")) +
facet_wrap(~method, ncol = 1, scales = "fixed")+
geom_text(aes(label=sentiment))

NA
XI字典
計算每天的文章正面及負面字數
sentiment為正面字數減去負面字數
senti_by_date_XI<-data %>%
inner_join(xi_ch) %>%
group_by(artDate, sentiment) %>%
summarise(n=sum(count)) %>%
spread(sentiment, n, fill = 0) %>%
mutate(sentiment = positive - negative) %>%
mutate(method='XI')
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector
比較遊戲廠商與習近平的分析角度差異
bind_rows(senti_by_date_game_company,
senti_by_date_XI) %>%
filter(artDate>='2019-02-15') %>%
ggplot(aes(x= artDate,y=sentiment,fill=method)) +
geom_col(show.legend = FALSE) +
scale_x_date(labels = date_format("%m/%d")) +
facet_wrap(~method, ncol = 1, scales = "fixed")+
geom_text(aes(label=sentiment))

從上面幾張圖看出在02/15後情緒起伏較明顯
以不同字典分析最常見的情緒字
LIWC 字典分析最常見正面及負面情緒字
word_count %>%
inner_join(LIWC_ch) %>%
group_by(sentiment) %>%
top_n(10,wt = count) %>%
ungroup() %>%
mutate(word = reorder(word, count)) %>%
ggplot(aes(word, count, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
theme(text=element_text(size=14))+
coord_flip()
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

清除’遊戲’辭彙
word_count<-word_count %>% filter(word!='遊戲')
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
word_count %>%
inner_join(LIWC_ch) %>%
group_by(sentiment) %>%
top_n(10,wt = count) %>%
ungroup() %>%
mutate(word = reorder(word, count)) %>%
ggplot(aes(word, count, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
theme(text=element_text(size=14))+
coord_flip()
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

接下來以遊戲商及習近平的角度分析情緒
以自訂字典:遊戲廠商 分析最常見正面及負面情緒字
word_count %>%
inner_join(game_company_ch) %>%
group_by(sentiment) %>%
top_n(10,wt = count) %>%
ungroup() %>%
mutate(word = reorder(word, count)) %>%
ggplot(aes(word, count, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
theme(text=element_text(size=14))+
coord_flip()
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

以自訂字典:習近平 分析最常見正面及負面情緒字
word_count %>%
inner_join(xi_ch) %>%
group_by(sentiment) %>%
top_n(10,wt = count) %>%
ungroup() %>%
mutate(word = reorder(word, count)) %>%
ggplot(aes(word, count, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(y = "Contribution to sentiment",
x = NULL) +
theme(text=element_text(size=14))+
coord_flip()
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

02/15後情緒數量大增
用文字雲分析02/15後討論的情緒字
LIWC字典
data %>%
filter(artDate>='2019-02-15') %>%
inner_join(LIWC_ch) %>%
group_by(word,sentiment) %>%
summarise(count=sum(count)) %>%
acast(word ~ sentiment, value.var = "count", fill = 0) %>%
comparison.cloud(colors = c("gray80", "gray20"),
max.words = 100)
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

NA
自訂字典:遊戲廠商
data %>%
filter(artDate>='2019-02-15') %>%
inner_join(game_company_ch) %>%
group_by(word,sentiment) %>%
summarise(count=sum(count)) %>%
acast(word ~ sentiment, value.var = "count", fill = 0) %>%
comparison.cloud(colors = c("gray80", "gray20"),
max.words = 100)
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

NA
自訂字典:習近平
data %>%
filter(artDate>='2019-02-15') %>%
inner_join(xi_ch) %>%
group_by(word,sentiment) %>%
summarise(count=sum(count)) %>%
acast(word ~ sentiment, value.var = "count", fill = 0) %>%
comparison.cloud(colors = c("gray80", "gray20"),
max.words = 100)
Joining, by = "word"
Column `word` joining character vector and factor, coercing into character vector

課堂練習
文字雲分析杜豐于及慈姑觀音兩腳色的評價
搜尋word中有杜豐于或慈姑觀音的文章
LS0tDQp0aXRsZTogIuS4reaWh+izh+aWmeS9v+eUqOS4jeWQjOaDhee3kuWtl+WFuOeahOaDhee3kuWIhuaekCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KYXV0aG9yOiAn5YqJ6IKy6YqYJw0KLS0tDQoNCg0KDQoNCiPmg4Xnt5LlrZflhbg6DQoNCisgTElXQw0KKyDpgYrmiLLllYYNCisg57+S6L+R5bmzDQoNCg0KIyDns7vntbHlj4PmlbjoqK3lrpoNCmBgYHtyfQ0KU3lzLnNldGxvY2FsZShjYXRlZ29yeSA9ICJMQ19BTEwiLCBsb2NhbGUgPSAiemhfVFcuVVRGLTgiKSAjIOmBv+WFjeS4reaWh+S6gueivA0KYGBgDQoNCiMjIOWuieijnemcgOimgeeahHBhY2thZ2VzDQpgYGB7cn0NCnBhY2thZ2VzID0gYygiZHBseXIiLCAidGlkeXRleHQiLCAic3RyaW5nciIsICJ3b3JkY2xvdWQyIiwgImdncGxvdDIiLCdyZWFkcicsJ2RhdGEudGFibGUnLCdyZXNoYXBlMicsJ3dvcmRjbG91ZCcsJ3RpZHlyJywnc2NhbGVzJykNCmV4aXN0aW5nID0gYXMuY2hhcmFjdGVyKGluc3RhbGxlZC5wYWNrYWdlcygpWywxXSkNCmZvcihwa2cgaW4gcGFja2FnZXNbIShwYWNrYWdlcyAlaW4lIGV4aXN0aW5nKV0pIGluc3RhbGwucGFja2FnZXMocGtnKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCnJlcXVpcmUodGlkeXRleHQpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpDQpyZXF1aXJlKGRhdGEudGFibGUpDQpyZXF1aXJlKGdncGxvdDIpDQpyZXF1aXJlKHJlc2hhcGUyKQ0KcmVxdWlyZSh3b3JkY2xvdWQpDQpyZXF1aXJlKHRpZHlyKQ0KcmVxdWlyZShyZWFkcikNCnJlcXVpcmUoc2NhbGVzKQ0KYGBgDQoNCg0KDQoNCiPos4fmlpnkvobmupA65paH5a2X5bmz5Y+w5pS26ZuGcHR05YWr5Y2m54mILOmXnOmNteWtl+aQnOWwizrnvo7lv4PjgIHpgoTpoZgNCiPos4fmlpnpm4Y6c29jaWFsX21lZGlhXzAzMDVfYXJ0V29yZEZyZXEuY3N2DQoNCmBgYHtyfQ0KZGF0YT1mcmVhZCgnLi4vZGF0YS9zb2NpYWxfbWVkaWFfMDMwNV9hcnRXb3JkRnJlcS5jc3YnLGVuY29kaW5nID0gJ1VURi04JykNCmBgYA0KDQpgYGB7cn0NCmRhdGEkYXJ0RGF0ZT0gZGF0YSRhcnREYXRlICU+JSBhcy5EYXRlKCIlWS8lbS8lZCIpDQoNCmRhdGE8LWRhdGEgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCdfJyx3b3JkKSkgDQogIA0KZGF0YQ0KYGBgDQoNCg0KDQoNCg0KDQoj5rqW5YKZTElXQ+Wtl+WFuA0KDQoNCg0KYGBge3J9DQpwIDwtIHJlYWRfZmlsZSgiLi4vZGljdC9saXdjL3Bvc2l0aXZlLnR4dCIpDQpuIDwtIHJlYWRfZmlsZSgiLi4vZGljdC9saXdjL25lZ2F0aXZlLnR4dCIpDQoNCnBvc2l0aXZlIDwtIHN0cnNwbGl0KHAsICJbLF0iKVtbMV1dDQpuZWdhdGl2ZSA8LSBzdHJzcGxpdChuLCAiWyxdIilbWzFdXQ0KcG9zaXRpdmUgPC0gZGF0YS5mcmFtZSh3b3JkID0gcG9zaXRpdmUsIHNlbnRpbWVudHMgPSAicG9zaXRpdmUiKQ0KbmVnYXRpdmUgPC0gZGF0YS5mcmFtZSh3b3JkID0gbmVnYXRpdmUsIHNlbnRpZW10bnMgPSAibmVnYXRpdmUiKQ0KY29sbmFtZXMobmVnYXRpdmUpID0gYygid29yZCIsInNlbnRpbWVudCIpDQpjb2xuYW1lcyhwb3NpdGl2ZSkgPSBjKCJ3b3JkIiwic2VudGltZW50IikNCkxJV0NfY2ggPC0gcmJpbmQocG9zaXRpdmUsIG5lZ2F0aXZlKQ0KTElXQ19jaA0KYGBgDQoNCg0KDQojIyMj5a2X5YW4MTpMSVdDX2NoDQoNCg0KDQoj5LulTElXQ+Wtl+WFuOWIpOaWt+aWh+mbhuS4reeahHdvcmTlsazmlrzmraPpnaLlrZfpgoTmmK/osqDpnaLlrZcNCg0KIyMjI0VYOg0KKyDorprnvo46cG9zaXRpdmUNCisg5Y2R5YqjOm5lZ2F0aXZlDQoNCiMjIyPpppblhYjoqIjnrpfmiYDmnInlrZflnKjmlofpm4bkuK3lh7rnj77nmoTnuL3mlbgNCg0KDQoNCg0KDQpgYGB7cn0NCg0Kd29yZF9jb3VudCA8LSBkYXRhICU+JQ0KICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIA0KICBncm91cF9ieSh3b3JkKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICAlPiUNCiAgZmlsdGVyKGNvdW50PjMpDQogDQp3b3JkX2NvdW50DQoNCmBgYA0KDQojIyMj6IiHTElXQ+aDhee3kuWtl+WFuGpvaW4NCiMjIyPmlofpm4bkuK3nmoTlrZflh7rnj77lnKhMSVdD5a2X5YW45Lit5piv5bGs5pa8cG9zaXRpdmXpgoTmmK9uZWdhdGl2ZQ0KDQoNCmBgYHtyfQ0Kd29yZF9jb3VudCAlPiUgaW5uZXJfam9pbihMSVdDX2NoKQ0KZGF0YSAlPiUgDQogIHNlbGVjdCh3b3JkKSAlPiUNCiAgaW5uZXJfam9pbihMSVdDX2NoKSANCg0KYGBgDQoNCg0KDQoNCg0KI+S7pUxJV0Pmg4Xnt5LlrZflhbjliIbmnpANCiMjIyPntbHoqIjmr4/lpKnnmoTmlofnq6DmraPpnaLlrZfnmoTmrKHmlbjoiIfosqDpnaLlrZfnmoTmrKHmlbgNCg0KDQpgYGB7cn0NCiMg5om+5Ye65omA5pyJ5Zyo5pmC6ZaT5Y2A5q615Lit55qE5pel5pyfDQphbGxfZGF0ZXMgPC0gDQogIGV4cGFuZC5ncmlkKHNlcShhcy5EYXRlKG1pbihkYXRhJGFydERhdGUpKSwgYXMuRGF0ZShtYXgoZGF0YSRhcnREYXRlKSksIGJ5PSJkYXkiKSwgYygicG9zaXRpdmUiLCAibmVnYXRpdmUiKSkNCg0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoYWxsX2RhdGVzKSA8LSBjKCJhcnREYXRlIiwgInNlbnRpbWVudCIpDQpgYGANCg0KDQpgYGB7cn0NCg0KDQpwbG90X3RhYmxlPC1kYXRhICU+JQ0KICBzZWxlY3QoYXJ0RGF0ZSx3b3JkLGNvdW50KSAlPiUNCiAgaW5uZXJfam9pbihMSVdDX2NoKSAlPiUgDQogIGdyb3VwX2J5KGFydERhdGUsc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50PXN1bShjb3VudCkpICANCg0KI+aykuacieizh+aWmeeahOaXpeacn+Wwh2NvdW506Kit54K6MA0KcGxvdF90YWJsZSA8LSBhbGxfZGF0ZXMgJT4lIA0KICBtZXJnZShwbG90X3RhYmxlLGJ5Lng9YygnYXJ0RGF0ZScsICJzZW50aW1lbnQiKSxieS55PWMoJ2FydERhdGUnLCAic2VudGltZW50IiksDQogICAgICAgIGFsbC54PVQsYWxsLnk9VCkgJT4lIA0KICBtdXRhdGUoY291bnQgPSByZXBsYWNlX25hKGNvdW50LCAwKSkNCg0KcGxvdF90YWJsZSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fbGluZShhZXMoeD1hcnREYXRlLHk9Y291bnQsY29sb3VyPXNlbnRpbWVudCkpKw0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVtLyVkIikpIA0KDQpgYGANCg0KDQoNCg0KIyMjI+S7pUxJV0PlrZflhbjntbHoqIjnmoTmg4Xnt5LlrZfmlbjpl5zlr5/lhanmop3nt5rnmoTlt67nlbDvvIzntZDmnpzkuI3mmI7poa8NCiMjIyPlkIzmqKPnmoTmlrnms5Xku6Xoh6roqILmg4Xnt5LlrZflhbjkvobliIbmnpDkuKbop4Dlr5/mnInnhKHlt67nlbANCg0KDQoj5rqW5YKZ5a2X5YW4OumBiuaIsuWVhuWtl+WFuA0KIyMjI+S7pemBiuaIsuWVhueahOinkuW6puWIpOaWt+aDhee3kuWtl+WxrOaWvHBvc2l0aXZl6YKE5pivbmVnYXRpdmUNCiMjIyPlsIdMSVdD55qE5oOF57eS5a2X5Lul6YGK5oiy5ZWG6KeS5bqm6YeN5pawbGFiZWwNCkV4Og0KDQrpqZrmgpo6cG9zaXRpdmUNCuS4jeaBkOaAljpuZWdhdGl2ZQ0KDQoNCmBgYHtyfQ0KI+Wvq+WHumNzduS4puingOWvnw0Kd29yZF9jb3VudCAlPiUgIGlubmVyX2pvaW4oTElXQ19jaCkgJT4lIHdyaXRlX2NzdigidG9rZW5zX3NlbnRpbWVudC5jc3YiICkNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KcCA8LSByZWFkX2ZpbGUoIi4uL2RpY3QvZ2FtZV9jb21wYW55L3Bvc2l0aXZlLnR4dCIpDQpuIDwtIHJlYWRfZmlsZSgiLi4vZGljdC9nYW1lX2NvbXBhbnkvbmVnYXRpdmUudHh0IikNCg0KcG9zaXRpdmUgPC0gc3Ryc3BsaXQocCwgIlssXSIpW1sxXV0NCm5lZ2F0aXZlIDwtIHN0cnNwbGl0KG4sICJbLF0iKVtbMV1dDQpwb3NpdGl2ZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBwb3NpdGl2ZSwgc2VudGltZW50cyA9ICJwb3NpdGl2ZSIpDQpuZWdhdGl2ZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuZWdhdGl2ZSwgc2VudGllbXRucyA9ICJuZWdhdGl2ZSIpDQpjb2xuYW1lcyhuZWdhdGl2ZSkgPSBjKCJ3b3JkIiwic2VudGltZW50IikNCmNvbG5hbWVzKHBvc2l0aXZlKSA9IGMoIndvcmQiLCJzZW50aW1lbnQiKQ0KZ2FtZV9jb21wYW55X2NoIDwtIHJiaW5kKHBvc2l0aXZlLCBuZWdhdGl2ZSkNCmBgYA0KDQoNCmBgYHtyfQ0KDQoNCnBsb3RfdGFibGU8LWRhdGEgJT4lDQogIHNlbGVjdChhcnREYXRlLHdvcmQsY291bnQpICU+JQ0KICBpbm5lcl9qb2luKGdhbWVfY29tcGFueV9jaCkgJT4lIA0KICBncm91cF9ieShhcnREYXRlLHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShjb3VudD1zdW0oY291bnQpKSAgDQoNCiPmspLmnInos4fmlpnnmoTml6XmnJ/lsIdjb3VudOioreeCujANCnBsb3RfdGFibGUgPC0gYWxsX2RhdGVzICU+JSANCiAgbWVyZ2UocGxvdF90YWJsZSxieS54PWMoJ2FydERhdGUnLCAic2VudGltZW50IiksYnkueT1jKCdhcnREYXRlJywgInNlbnRpbWVudCIpLA0KICAgICAgICBhbGwueD1ULGFsbC55PVQpICU+JSANCiAgbXV0YXRlKGNvdW50ID0gcmVwbGFjZV9uYShjb3VudCwgMCkpDQoNCnBsb3RfdGFibGUgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHg9YXJ0RGF0ZSx5PWNvdW50LGNvbG91cj1zZW50aW1lbnQpKSsNCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlbS8lZCIpKSANCmBgYA0KDQoNCg0KDQojIyMj5o6l5LiL5L6G5rqW5YKZ6Ieq6KiC5a2X5YW4eGlfY2gNCiMjIyPku6Xnv5Lov5HlubPnmoTop4Dpu57kvobliIbmnpDmg4Xnt5LlrZcNCg0KIyMjI+a6luWCmeWtl+WFuDp4aV9jaA0KDQpgYGB7cn0NCnAgPC0gcmVhZF9maWxlKCIuLi9kaWN0L3hpL3Bvc2l0aXZlLnR4dCIpDQpuIDwtIHJlYWRfZmlsZSgiLi4vZGljdC94aS9uZWdhdGl2ZS50eHQiKQ0KDQpwb3NpdGl2ZSA8LSBzdHJzcGxpdChwLCAiWyxdIilbWzFdXQ0KbmVnYXRpdmUgPC0gc3Ryc3BsaXQobiwgIlssXSIpW1sxXV0NCnBvc2l0aXZlIDwtIGRhdGEuZnJhbWUod29yZCA9IHBvc2l0aXZlLCBzZW50aW1lbnRzID0gInBvc2l0aXZlIikNCm5lZ2F0aXZlIDwtIGRhdGEuZnJhbWUod29yZCA9IG5lZ2F0aXZlLCBzZW50aWVtdG5zID0gIm5lZ2F0aXZlIikNCmNvbG5hbWVzKG5lZ2F0aXZlKSA9IGMoIndvcmQiLCJzZW50aW1lbnQiKQ0KY29sbmFtZXMocG9zaXRpdmUpID0gYygid29yZCIsInNlbnRpbWVudCIpDQp4aV9jaCA8LSByYmluZChwb3NpdGl2ZSwgbmVnYXRpdmUpDQp4aV9jaA0KYGBgDQoNCg0KYGBge3J9DQoNCg0KcGxvdF90YWJsZTwtZGF0YSAlPiUNCiAgc2VsZWN0KGFydERhdGUsd29yZCxjb3VudCkgJT4lDQogIGlubmVyX2pvaW4oeGlfY2gpICU+JSANCiAgZ3JvdXBfYnkoYXJ0RGF0ZSxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSkgIA0KDQoj5rKS5pyJ6LOH5paZ55qE5pel5pyf5bCHY291bnToqK3ngrowDQpwbG90X3RhYmxlIDwtIGFsbF9kYXRlcyAlPiUgDQogIG1lcmdlKHBsb3RfdGFibGUsYnkueD1jKCdhcnREYXRlJywgInNlbnRpbWVudCIpLGJ5Lnk9YygnYXJ0RGF0ZScsICJzZW50aW1lbnQiKSwNCiAgICAgICAgYWxsLng9VCxhbGwueT1UKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IHJlcGxhY2VfbmEoY291bnQsIDApKQ0KDQpwbG90X3RhYmxlICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9saW5lKGFlcyh4PWFydERhdGUseT1jb3VudCxjb2xvdXI9c2VudGltZW50KSkrDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgDQpgYGANCg0KIyMjI+WcqDAyLzE15b6M6LKg6Z2i5oOF57eS6Z2e5bi46auYDQojIyMj55Sx5pa856ym5ZKS6aKo5rOi5byV55m85Lit5ZyL546p5a625by354OI55qE5oq15Yi2DQoNCg0KDQoNCiMjIyPkuIrpnaLlub7lvLXlnJbnmbznj74wMi8xNeW+jOacieS4gOautemrmOWzsA0KIyMjI+aOpeS4i+S+humDveS7pTAyLzE15b6M55qE6LOH5paZ6YCy6KGM5YiG5p6QDQoNCg0KDQoNCg0KI+avlOi8g+WFqeWAi+Wtl+WFuOWIhuaekOW3rueVsA0KDQpgYGB7cn0NCnNlbnRpX2J5X2RhdGVfZ2FtZV9jb21wYW55PC1kYXRhICU+JSANCiAgaW5uZXJfam9pbihnYW1lX2NvbXBhbnlfY2gpICU+JQ0KICANCiAgZ3JvdXBfYnkoYXJ0RGF0ZSwgc2VudGltZW50KSAlPiUNCiAgc3VtbWFyaXNlKG49c3VtKGNvdW50KSkgJT4lDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUNCiAgbXV0YXRlKHNlbnRpbWVudCA9IHBvc2l0aXZlIC0gbmVnYXRpdmUpICU+JQ0KICBtdXRhdGUobWV0aG9kPSdnYW1lX2NvbXBhbnknKSANCg0KDQpzZW50aV9ieV9kYXRlX2dhbWVfY29tcGFueQ0KYGBgDQoNCg0KDQojIyMjTElXQ+Wtl+WFuA0KIyMjI+ioiOeul+avj+WkqeeahOaWh+eroOato+mdouWPiuiyoOmdouWtl+aVuA0KIyMjI3NlbnRpbWVudOeCuuato+mdouWtl+aVuOa4m+WOu+iyoOmdouWtl+aVuA0KDQpgYGB7cn0NCnNlbnRpX2J5X2RhdGVfTElXQzwtZGF0YSAlPiUgDQogIGlubmVyX2pvaW4oTElXQ19jaCkgJT4lDQogIGdyb3VwX2J5KGFydERhdGUsIHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShuPXN1bShjb3VudCkpICU+JQ0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSAlPiUNCiAgbXV0YXRlKG1ldGhvZD0nTElXQycpIA0Kc2VudGlfYnlfZGF0ZV9MSVdDDQoNCmBgYA0KDQoNCg0KI+avlOi8g+WFqeWAi+Wtl+WFuOWIhuaekOW3rueVsA0KDQoNCg0KYGBge3J9DQpiaW5kX3Jvd3Moc2VudGlfYnlfZGF0ZV9nYW1lX2NvbXBhbnksDQogICAgICAgICAgc2VudGlfYnlfZGF0ZV9MSVdDKSAlPiUNCiAgDQogIGZpbHRlcihhcnREYXRlPj0nMjAxOS0wMi0xNScpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGFydERhdGUseT1zZW50aW1lbnQsZmlsbD1tZXRob2QpKSArDQogIA0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgKw0KICBmYWNldF93cmFwKH5tZXRob2QsIG5jb2wgPSAxLCBzY2FsZXMgPSAiZml4ZWQiKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zZW50aW1lbnQpKQ0KICANCmBgYA0KDQoNCiMjIyNYSeWtl+WFuA0KIyMjI+ioiOeul+avj+WkqeeahOaWh+eroOato+mdouWPiuiyoOmdouWtl+aVuA0KIyMjI3NlbnRpbWVudOeCuuato+mdouWtl+aVuOa4m+WOu+iyoOmdouWtl+aVuA0KDQoNCmBgYHtyfQ0Kc2VudGlfYnlfZGF0ZV9YSTwtZGF0YSAlPiUgDQogIGlubmVyX2pvaW4oeGlfY2gpICU+JQ0KICBncm91cF9ieShhcnREYXRlLCBzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2Uobj1zdW0oY291bnQpKSAgJT4lDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUNCiAgbXV0YXRlKHNlbnRpbWVudCA9IHBvc2l0aXZlIC0gbmVnYXRpdmUpICU+JQ0KICBtdXRhdGUobWV0aG9kPSdYSScpIA0KDQpgYGANCg0KDQoNCiPmr5TovIPpgYrmiLLlu6DllYboiIfnv5Lov5HlubPnmoTliIbmnpDop5Lluqblt67nlbANCg0KYGBge3J9DQpiaW5kX3Jvd3Moc2VudGlfYnlfZGF0ZV9nYW1lX2NvbXBhbnksDQogICAgICAgICAgc2VudGlfYnlfZGF0ZV9YSSkgJT4lDQogIGZpbHRlcihhcnREYXRlPj0nMjAxOS0wMi0xNScpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGFydERhdGUseT1zZW50aW1lbnQsZmlsbD1tZXRob2QpKSArDQogIA0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJW0vJWQiKSkgKw0KICBmYWNldF93cmFwKH5tZXRob2QsIG5jb2wgPSAxLCBzY2FsZXMgPSAiZml4ZWQiKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zZW50aW1lbnQpKQ0KYGBgDQoNCg0K5b6e5LiK6Z2i5bm+5by15ZyW55yL5Ye65ZyoMDIvMTXlvozmg4Xnt5LotbfkvI/ovIPmmI7poa8NCg0KDQoNCiPku6XkuI3lkIzlrZflhbjliIbmnpDmnIDluLjopovnmoTmg4Xnt5LlrZcNCg0KDQojIExJV0Mg5a2X5YW45YiG5p6Q5pyA5bi46KaL5q2j6Z2i5Y+K6LKg6Z2i5oOF57eS5a2XDQoNCmBgYHtyfQ0Kd29yZF9jb3VudCAlPiUgDQogIGlubmVyX2pvaW4oTElXQ19jaCkgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwLHd0ID0gY291bnQpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgY291bnQpKSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkLCBjb3VudCwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCkgKw0KICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0KSkrDQogIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCiMjIyPmuIXpmaQn6YGK5oiyJ+i+reW9mQ0KDQpgYGB7cn0NCndvcmRfY291bnQ8LXdvcmRfY291bnQgJT4lIGZpbHRlcih3b3JkIT0n6YGK5oiyJykNCmBgYA0KDQoNCg0KYGBge3J9DQp3b3JkX2NvdW50ICU+JSANCiAgaW5uZXJfam9pbihMSVdDX2NoKSAlPiUNCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUNCiAgdG9wX24oMTAsd3QgPSBjb3VudCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBjb3VudCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIGNvdW50LCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicyh5ID0gIkNvbnRyaWJ1dGlvbiB0byBzZW50aW1lbnQiLA0KICAgICAgIHggPSBOVUxMKSArDQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTQpKSsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KDQoNCg0K5o6l5LiL5L6G5Lul6YGK5oiy5ZWG5Y+K57+S6L+R5bmz55qE6KeS5bqm5YiG5p6Q5oOF57eSDQoNCg0KIyMjIyDku6Xoh6roqILlrZflhbg66YGK5oiy5bug5ZWGIOWIhuaekOacgOW4uOimi+ato+mdouWPiuiyoOmdouaDhee3kuWtlyANCg0KYGBge3J9DQp3b3JkX2NvdW50ICU+JQ0KICBpbm5lcl9qb2luKGdhbWVfY29tcGFueV9jaCkgJT4lDQogIGdyb3VwX2J5KHNlbnRpbWVudCkgJT4lDQogIHRvcF9uKDEwLHd0ID0gY291bnQpICU+JSANCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgY291bnQpKSAlPiUNCiAgZ2dwbG90KGFlcyh3b3JkLCBjb3VudCwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IiwNCiAgICAgICB4ID0gTlVMTCkgKw0KICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0KSkrDQogIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCiMjIyMg5Lul6Ieq6KiC5a2X5YW4Oue/kui/keW5syDliIbmnpDmnIDluLjopovmraPpnaLlj4rosqDpnaLmg4Xnt5LlrZcNCg0KYGBge3J9DQp3b3JkX2NvdW50ICU+JQ0KICBpbm5lcl9qb2luKHhpX2NoKSAlPiUNCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUNCiAgdG9wX24oMTAsd3QgPSBjb3VudCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBjb3VudCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHdvcmQsIGNvdW50LCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGZhY2V0X3dyYXAofnNlbnRpbWVudCwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicyh5ID0gIkNvbnRyaWJ1dGlvbiB0byBzZW50aW1lbnQiLA0KICAgICAgIHggPSBOVUxMKSArDQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTQpKSsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQojMDIvMTXlvozmg4Xnt5Lmlbjph4/lpKflop4NCg0KI+eUqOaWh+Wtl+mbsuWIhuaekDAyLzE15b6M6KiO6KuW55qE5oOF57eS5a2XDQoNCg0KDQojIyMjTElXQ+Wtl+WFuA0KDQpgYGB7cn0NCmRhdGEgJT4lIA0KICBmaWx0ZXIoYXJ0RGF0ZT49JzIwMTktMDItMTUnKSAlPiUNCiAgaW5uZXJfam9pbihMSVdDX2NoKSAlPiUNCiAgZ3JvdXBfYnkod29yZCxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSkgJT4lDQoNCiAgYWNhc3Qod29yZCB+IHNlbnRpbWVudCwgdmFsdWUudmFyID0gImNvdW50IiwgZmlsbCA9IDApICU+JQ0KICBjb21wYXJpc29uLmNsb3VkKGNvbG9ycyA9IGMoImdyYXk4MCIsICJncmF5MjAiKSwNCiAgICAgICAgICAgICAgICAgICBtYXgud29yZHMgPSAxMDApDQogIA0KYGBgDQoNCg0KIyMjI+iHquioguWtl+WFuDrpgYrmiLLlu6DllYYNCg0KYGBge3J9DQpkYXRhICU+JSANCiAgZmlsdGVyKGFydERhdGU+PScyMDE5LTAyLTE1JykgJT4lDQogIGlubmVyX2pvaW4oZ2FtZV9jb21wYW55X2NoKSAlPiUNCiAgZ3JvdXBfYnkod29yZCxzZW50aW1lbnQpICU+JQ0KICBzdW1tYXJpc2UoY291bnQ9c3VtKGNvdW50KSkgJT4lDQoNCiAgYWNhc3Qod29yZCB+IHNlbnRpbWVudCwgdmFsdWUudmFyID0gImNvdW50IiwgZmlsbCA9IDApICU+JQ0KICBjb21wYXJpc29uLmNsb3VkKGNvbG9ycyA9IGMoImdyYXk4MCIsICJncmF5MjAiKSwNCiAgICAgICAgICAgICAgICAgICBtYXgud29yZHMgPSAxMDApDQogIA0KYGBgDQoNCg0KIyMjI+iHquioguWtl+WFuDrnv5Lov5HlubMNCg0KYGBge3J9DQpkYXRhICU+JSANCiAgZmlsdGVyKGFydERhdGU+PScyMDE5LTAyLTE1JykgJT4lDQogIGlubmVyX2pvaW4oeGlfY2gpICU+JQ0KICBncm91cF9ieSh3b3JkLHNlbnRpbWVudCkgJT4lDQogIHN1bW1hcmlzZShjb3VudD1zdW0oY291bnQpKSAlPiUNCg0KICBhY2FzdCh3b3JkIH4gc2VudGltZW50LCB2YWx1ZS52YXIgPSAiY291bnQiLCBmaWxsID0gMCkgJT4lDQogIGNvbXBhcmlzb24uY2xvdWQoY29sb3JzID0gYygiZ3JheTgwIiwgImdyYXkyMCIpLA0KICAgICAgICAgICAgICAgICAgIG1heC53b3JkcyA9IDEwMCkNCmBgYA0KDQoNCg0KDQoNCiMjIyPoqrLloILnt7Tnv5INCg0KDQojIyMj5paH5a2X6Zuy5YiG5p6Q5p2c6LGQ5LqO5Y+K5oWI5aeR6KeA6Z+z5YWp6IWz6Imy55qE6KmV5YO5DQoNCg0KIyMjI+aQnOWwi3dvcmTkuK3mnInmnZzosZDkuo7miJbmhYjlp5Hop4Dpn7PnmoTmlofnq6ANCg0KDQoNCg==
資料集:social_media_0305_artWordFreq.csv