前面介紹不同類型的技術,例如從文本中找關鍵字、查看文本中詞彙之間的關係,還有判斷文字的情感,今天我們換個情境。
如果我們有一堆新聞文章,或者是臉書和推特上的留言,又或是其他形式的文字數據,該如何快速了解它們大概都在聊些什麼呢?這就是主題模型(topic
model)派上用場的好時機。
想像一下,你有一個超大的書架,上面有各種各樣的書。你想要了解書架上的書都是什麼類型,除了「我全都讀」之外,有沒有其他作法?全部讀完真的太累了,但如果書架上的書都貼上了標籤,比如「科技」、「歷史」、「愛情」,你就能一眼看出哪些書是你感興趣的主題。主題模型就像是這樣的一個「自動貼標籤機」,適用用於文章、網頁或其他任何你想瞭解的文本。
主題模型運作的原理是這樣的:它會掃過所有文本,然後試圖找出哪些詞經常一起出現。比如,如果「蘋果」和「蘋果手機」經常一起出現,那麼這些詞可能就會被歸類到一個有關「科技」的主題裡面。有不同種類的主題模型,最知名的大概是LDA(Latent Dirichlet Allocation)。別被名字嚇到,它其實就是一種從一堆文本中找出主題來的演算法而已。
常見方法有除了 Latent Dirichlet Allocation(LDA)外,還有 Structured Topic Model(STM),它們都是用於主題模型的方法。簡單來說,如果你僅對文本內容的主題感興趣,LDA 是一個好的選擇。但是,如果你有額外的「結構化」數據,並希望這些數據能幫助你更深入地了解文本,則 STM 會是一個更好的選項。
總之,如果你想要從大量的文本中迅速抓出重點,主題模型是個不錯的工具。
一開始先載入套件。
library(tidyverse)
library(tidytext)
library(topicmodels)
df_article <- read_csv("data/df_article.csv")
df_article_top <- df_article %>% filter(n > 20)
### 轉換成前面教過的 DTM
dtm <- df_outlet_clean_seg_clean %>%
inner_join(df_outlet_clean_seg_top) %>%
count(id, text_segment) %>%
cast_dtm(id, text_segment, n)
### 利用 tidy 函數
dtm_clean <- dtm %>% tidy() %>% filter(str_length(term) > 1) %>%
cast_dtm(document, term, count)
dtm_clean
dtm_remove <- dtm_clean %>% tm::removeSparseTerms(0.999)
### 確認要有幾個主題
ks <- c(2, 4, 8, 14, 16, 18, 32, 64)
perplex <- sapply(ks, function(k){
lda.temp <- LDA(dtm, k =k, control = list(seed = 1109))
perplexity(lda.temp)
})
plot <- data_frame(k=ks, perplex=perplex) %>%
ggplot(aes(k, perplex)) +
geom_point() +
geom_line()
plot %>%
ggsave(filename = "img/plot_LDA.png", dpi = 300, height = 12, width = 12)
dtm_lda <- LDA(dtm_clean, k = 10, control = list(seed = 1234))
dtm_topics <- tidy(dtm_lda, matrix = "beta")
top_terms <- dtm_topics %>%
group_by(topic) %>%
top_n(10, beta) %>%
ungroup() %>%
arrange(topic, -beta)
plot2 <- top_terms %>%
mutate(term = reorder(term, beta)) %>%
ggplot(aes(term, beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free") +
coord_flip() +
theme(axis.text.y=element_text(colour="black", family="Heiti TC Light"))
plot2 %>%
ggsave(filename = "img/plot_LDA02.png", dpi = 300, height = 12, width = 12)
這就是完整的一個主題分類結果囉!