詞頻,也就是詞彙出現頻率,是一個非常直觀且易懂的指標。
我們先來看中央社的蔡總統關心什麼文字會說話分析。在這篇文章中,我們擷取幾個句子:「2020年就職演說,總統(鐵人賽的CMS不能提名字)多次提及『疫情、防疫』相關詞彙。」、「綜觀總統第二任就職演說使用詞彙,出現次數前5名的詞依序是『台灣、產業、國家、發展、社會』,與第一任的『台灣、政府、國家、經濟、社會』相比,這次『產業』一詞出現的比例提升最多」、「2016年就職演說,總統大量使用『國家』『政府』,營造致力團結全民的敘事氛圍。」
你可以從中看到,光是計算文章中出現的詞彙頻率,就足以當做讓人讀懂文章中的指標。
不只是中央社,就連國防安全研究院的「我國總統歷年(2000-2019)國慶演說的文字探勘」報告,甚至連更進階的做法都沒有,通篇使用詞頻分析,就搞定了,沒了!
對比之下,中央社這兩段話可以參考:「在文字處理部分,本專題使用中研院『CkipTagger開源中文處理工具』進行斷詞,並且依詞性標注篩選出名詞(剔除後置詞、量詞)、動詞、形容詞,以進行後續之詞頻統計與視覺化。」、「在國政關鍵字的內容,使用Google開源的機器學習模組word2vec進行計算,word2vec會將字詞投射至向量空間並且計算其距離,距離越相近的字詞代表越有相關性;並搭配詞頻數據,最後以人工決定最終版本關鍵字,呈現出關鍵字與其他相關詞的出現頻率與相似距離。」
可以注意到,裡面提到了 PO,也提到了 word2vec 詞向量,可以拿去詞嵌入使用。由上面兩個例子不難看出,詞頻分析有多麽重要!
library(tidytext)
library(tidyverse)
library(jiebaR)
library(lubridate)
df_speech_clean <- read_csv("data/df_speech_clean.csv")
df_speech_pre <-
df_speech_clean %>%
mutate(text = str_to_lower(text)) %>%
mutate(text = str_remove_all(text, " |\\n|\\r|\\t")) %>%
mutate(text = str_replace_all(text, "台灣", "臺灣")) #%>%
df_stop <- read_table("data/停用詞-繁體中文.txt", col_names = F) %>% rename(stopword = 1)
### segment
cutter <- worker("tag", stop_word = "data/停用詞-繁體中文.txt")
vector_word <- c("中華民國", "總統", "李登輝", "蔣中正", "蔣經國", "李登輝", "陳水扁", "馬英九")
new_user_word(cutter, words = vector_word)
## [1] TRUE
# reg_space <- "%E3%80%80" %>% curl::curl_escape()
### text part
df_speech_seg <-
df_speech_pre %>%
mutate(text = str_replace_all(text, "台灣|臺灣", "臺灣")) %>%
mutate(text = str_remove_all(text, "\\n|\\r|\\t|:| | ")) %>%
# mutate(text = str_remove_all(text, reg_space)) %>%
mutate(text = str_remove_all(text, "[a-zA-Z0-9]+")) %>%
mutate(text_segment = purrr::map(text, function(x)segment(x, cutter))) %>%
mutate(text_POS = purrr::map(text_segment, function(x)names(x))) %>%
unnest(c(text_segment, text_POS)) %>%
select(-text, everything(), text) %>%
anti_join(df_stop, by = c("text_segment" = "stopword"))
df_speech_seg_agg <- df_speech_seg %>% count(date, text_segment) %>%
mutate(year = year(date)) %>% select(-date)
df_speech_seg_agg %>% group_by(year) %>%
filter(year >= 2001) %>%
arrange(year, desc(n)) %>%
filter(row_number() <= 10) %>%
mutate(rank = row_number()) %>%
ungroup() %>%
select(-n) %>%
pivot_wider(names_from = rank, values_from = text_segment) %>%
tail(10)
## # A tibble: 10 × 11
## year `1` `2` `3` `4` `5` `6` `7` `8` `9` `10`
## <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 2011 臺灣 中華民國 國家 今天 先進 全球 大陸 世界 總統 同胞
## 2 2012 臺灣 投資 中 中華民國 經濟 兩岸 政府 國家 未來 民主
## 3 2013 臺灣 經濟 社會 鄉親 公民 合作 國際 中 兩岸 國家
## 4 2014 民主 臺灣 中華民國 經濟 大陸 國家 發展 社會 世界 今年
## 5 2015 臺灣 七年 兩岸 年 共識 和平 國際 兩岸關係 我國 中華民國
## 6 2016 國家 臺灣 兩岸 改革 推動 年輕人 新政府 民主 發展 我要
## 7 2017 臺灣 新 國家 一起 共同 發展 國際 已經 改革 政府
## 8 2018 臺灣 國家 經濟 安全 國際 強化 新 發展 社會 透過
## 9 2019 臺灣 挑戰 中華民國 經濟 一次 世界 國際 捍衛 未來 自由民主
## 10 2020 臺灣 經濟 區域 國家 國際 國軍 疫情 中 國人 挑戰