iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
AI & Data

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

[Day 22] 利用R語言做出主題模型 - LDA

  • 分享至 

  • xImage
  •  

主題模型

主題模型簡介

前面介紹不同類型的技術,例如從文本中找關鍵字、查看文本中詞彙之間的關係,還有判斷文字的情感,今天我們換個情境。

如果我們有一堆新聞文章,或者是臉書和推特上的留言,又或是其他形式的文字數據,該如何快速了解它們大概都在聊些什麼呢?這就是主題模型(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)

這就是完整的一個主題分類結果囉!


上一篇
[Day 21] 利用R語言分類文本
下一篇
[Day 23] 利用R語言做出主題模型 - STM
系列文
用R語言玩轉文字探勘30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言