iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
AI & Data

用R語言玩轉文字探勘系列 第 16

[Day 16] 利用R語言計算詞頻

  • 分享至 

  • xImage
  •  

詞頻

詞頻簡介與案例

詞頻,也就是詞彙出現頻率,是一個非常直觀且易懂的指標。

我們先來看中央社的蔡總統關心什麼文字會說話分析。在這篇文章中,我們擷取幾個句子:「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 臺灣  經濟     區域     國家     國際  國軍   疫情   中       國人  挑戰

上一篇
[Day 15] 掌握關鍵技術與概念 - 後篇
下一篇
[Day 17] 利用R語言找關鍵字
系列文
用R語言玩轉文字探勘30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言