Pemodelan Topik dengan LDA
Temukan topik laten dalam korpus dokumen menggunakan paket topicmodels.
Pemodelan Topik dengan LDA adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Apa Itu Pemodelan Topik?
Pemodelan topik adalah teknik pembelajaran mesin tanpa pengawasan yang menemukan struktur tematik laten dalam sebuah korpus. Latent Dirichlet Allocation (LDA) mengasumsikan bahwa setiap dokumen merupakan campuran dari K topik, dan setiap topik merupakan distribusi probabilitas atas kata-kata.
# LDA key assumptions:
# 1. Each document is a mixture of K topics
# 2. Each topic is a distribution over all vocabulary words
# 3. Words are generated by first picking a topic, then a word from that topic
# Example: K=2 topics in a corpus about tech and cooking
# Topic 1 (Tech): neural(0.15) python(0.12) algorithm(0.10) ...
# Topic 2 (Cooking): recipe(0.14) flour(0.11) bake(0.10) ...
# A document about 'AI-generated recipes' might be:
# 70% Topic 1 (Tech) + 30% Topic 2 (Cooking)
cat('LDA parameters:\n')
cat('K = number of topics (you choose)\n')
cat('alpha = document-topic sparsity prior\n')
cat('beta = topic-word sparsity prior\n')DocumentTermMatrix dari tm
LDA memerlukan Document-Term Matrix (DTM): baris adalah dokumen, kolom adalah kata, dan sel berisi jumlah kemunculan kata. Fungsi DocumentTermMatrix() dari paket tm maupun cast_dtm() dari tidytext sama-sama menghasilkan format ini.
library(tm)
# Build a corpus from raw text
docs <- c(
'machine learning neural networks training algorithms',
'deep learning gradient backpropagation optimizer',
'python scikit numpy pandas machine learning',
'database sql tables indexes queries joins',
'relational schema normalization foreign primary',
'nosql mongodb document store redis queries'
)
corpus <- Corpus(VectorSource(docs))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeWords, stopwords('english'))
corpus <- tm_map(corpus, stripWhitespace)
dtm <- DocumentTermMatrix(corpus)
cat('DTM shape:', nrow(dtm), 'docs x', ncol(dtm), 'terms\n')
cat('Sparsity: ', round(tm::sparsity(dtm) * 100, 1), '%\n')cast_dtm dari tidytext
cast_dtm(document, term, value) mengonversi tibble jumlah kata yang rapi secara langsung menjadi DocumentTermMatrix yang kompatibel dengan paket topicmodels. Dengan demikian, pipeline Anda tetap mengikuti gaya tidyverse.
library(tidytext)
library(dplyr)
# Tidy corpus
corpus <- tibble::tibble(
doc_id = c(rep(1, 3), rep(2, 3), rep(3, 3), rep(4, 3)),
text = c(
'neural networks deep learning training',
'gradient descent backpropagation optimizer',
'machine learning algorithms classification',
'database sql tables queries indexes',
'relational schema normalization joins',
'foreign primary key constraints transactions',
'recipe bake flour butter oven',
'cooking temperature simmer saute ingredients',
'kitchen knife herbs spices garnish'
)
)
dtm <- corpus |>
unnest_tokens(word, text) |>
anti_join(tidytext::stop_words, by = 'word') |>
count(doc_id, word) |>
cast_dtm(doc_id, word, n)
cat('DTM:', nrow(dtm), 'docs x', ncol(dtm), 'terms\n')LDA(dtm, k = 5): Menyesuaikan Model
LDA(dtm, k = K, control = list(seed = 42)) menyesuaikan model LDA dengan K topik menggunakan pengambilan sampel Gibbs atau VEM. Selalu tetapkan seed agar hasil dapat direproduksi — LDA bersifat stokastik, sehingga hasilnya dapat berbeda antarpelaksanaan jika tidak menggunakan seed tetap.
library(tidytext)
library(dplyr)
library(topicmodels)
# Build DTM
corpus <- tibble::tibble(
doc_id = c(rep(1,3), rep(2,3), rep(3,3), rep(4,3), rep(5,3), rep(6,3)),
text = c(
'neural networks deep gradient','backpropagation training optimizer','learning model layers',
'database sql queries indexes','relational tables joins foreign','schema normalization constraints',
'recipe flour bake butter','cooking temperature oven simmer','kitchen knife herbs spices'
)[rep(c(1,2,3,4,5,6), each=1)]
)
dtm <- corpus |>
unnest_tokens(word, text) |>
count(doc_id, word) |>
cast_dtm(doc_id, word, n)
# Fit LDA with k=3 topics
lda_model <- LDA(dtm, k = 3, control = list(seed = 42))
cat('LDA model fitted: k=3 topics\n')
cat('Class:', class(lda_model), '\n')tidy(lda, matrix = 'beta'): Probabilitas Topik per Kata
tidy(lda_model, matrix = 'beta') mengekstrak probabilitas topik untuk setiap kata (matriks beta). Setiap baris memberikan probabilitas bahwa sebuah kata tertentu dihasilkan oleh topik tertentu. Kata-kata dengan probabilitas tinggi menentukan "tentang apa" setiap topik.
library(topicmodels)
library(tidytext)
library(dplyr)
# Using the built-in AssociatedPress dataset
data('AssociatedPress', package = 'topicmodels')
lda <- LDA(AssociatedPress[1:50, ], k = 4, control = list(seed = 1234))
# Per-word topic probabilities (beta)
beta_tbl <- tidy(lda, matrix = 'beta')
cat('Beta matrix rows:', nrow(beta_tbl), '\n')
cat('Columns:', names(beta_tbl), '\n')
# Top words per topic
top_terms <- beta_tbl |>
group_by(topic) |>
slice_max(beta, n = 5) |>
ungroup()
cat('\nTop 5 words per topic:\n')
print(top_terms)Memvisualisasikan Kata-Kata Topik
Gambarkan N kata teratas untuk setiap topik sebagai diagram batang berfaset. Urutkan kata dalam setiap topik berdasarkan nilai beta menggunakan reorder_within() dan scale_x_reordered() dari tidytext agar pengurutan independen pada setiap faset dilakukan dengan benar.
library(topicmodels)
library(tidytext)
library(dplyr)
library(ggplot2)
data('AssociatedPress', package = 'topicmodels')
lda <- LDA(AssociatedPress[1:100, ], k = 4, control = list(seed = 42))
tidy(lda, matrix = 'beta') |>
group_by(topic) |>
slice_max(beta, n = 8) |>
ungroup() |>
mutate(term = reorder_within(term, beta, topic)) |>
ggplot(aes(term, beta, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~topic, scales = 'free') +
scale_x_reordered() +
coord_flip() +
labs(x = NULL, y = 'Beta', title = 'Top Words per LDA Topic') +
theme_minimal(base_size = 10)tidy(lda, matrix = 'gamma'): Probabilitas Topik per Dokumen
tidy(lda_model, matrix = 'gamma') mengekstrak probabilitas topik untuk setiap dokumen (matriks gamma). Setiap baris memberikan proporsi dokumen yang diperkirakan berasal dari topik tertentu. Dokumen dengan gamma tinggi untuk topik 2 berarti dokumen tersebut "membahas" topik 2.
library(topicmodels)
library(tidytext)
library(dplyr)
data('AssociatedPress', package = 'topicmodels')
lda <- LDA(AssociatedPress[1:30, ], k = 3, control = list(seed = 99))
# Per-document topic proportions (gamma)
gamma_tbl <- tidy(lda, matrix = 'gamma')
cat('Gamma matrix rows:', nrow(gamma_tbl), '\n')
# Dominant topic per document
dominant_topic <- gamma_tbl |>
group_by(document) |>
slice_max(gamma, n = 1) |>
ungroup()
cat('\nDominant topic per document (first 8):\n')
print(head(dominant_topic, 8))Memilih K: Jumlah Topik
LDA mengharuskan Anda menentukan K terlebih dahulu. Pendekatan yang umum: (1) perplexity — semakin rendah semakin baik, tetapi menurun secara monoton seiring bertambahnya K; (2) skor koherensi (paket ldatuning); (3) pengetahuan domain; (4) coba K = 5, 10, 20 lalu periksa daftar kata secara manual.
library(topicmodels)
library(tidytext)
data('AssociatedPress', package = 'topicmodels')
# Evaluate perplexity for K = 2, 3, 4, 5
k_values <- 2:5
perplexities <- vapply(k_values, function(k) {
model <- LDA(AssociatedPress[1:50, ], k = k,
control = list(seed = 42))
perplexity(model)
}, numeric(1))
results <- data.frame(k = k_values, perplexity = round(perplexities, 1))
cat('Perplexity by K:\n')
print(results)
cat('\nNote: lower perplexity = better fit to training data\n')Pemberian Label Topik
LDA menghasilkan topik anonim (1, 2, 3…). Analis manusia harus memberi label pada setiap topik dengan memeriksa kata-kata teratasnya. Buat tabel pencarian yang memetakan nomor topik ke nama deskriptif, lalu gabungkan tabel tersebut dengan hasil Anda.
library(topicmodels)
library(tidytext)
library(dplyr)
data('AssociatedPress', package = 'topicmodels')
lda <- LDA(AssociatedPress[1:100, ], k = 4, control = list(seed = 7))
# Top 5 words per topic for manual labelling
tidy(lda, matrix = 'beta') |>
group_by(topic) |>
slice_max(beta, n = 5) |>
summarise(top_words = paste(term, collapse = ', ')) |>
print()
# After inspecting top words, assign human-readable labels
topic_labels <- tibble::tibble(
topic = 1:4,
label = c('Politics', 'Economy', 'Sports', 'Science') # your interpretation
)
cat('\nTopic labels assigned (example):\n')
print(topic_labels)LDA pada Korpus Kustom
Berikut pipeline LDA lengkap dari awal hingga akhir pada korpus kustom: lakukan tokenisasi, bangun DTM, sesuaikan LDA, ekstrak matriks beta, lalu tampilkan kata-kata teratas untuk setiap topik.
library(tidytext)
library(dplyr)
library(topicmodels)
# 9 documents across 3 latent topics
docs <- tibble::tibble(
id = 1:9,
text = c(
'machine learning neural deep training',
'algorithm gradient backpropagation network',
'python tensorflow keras model layers',
'database sql relational tables queries',
'joins indexes schema foreign primary',
'transactions normalization constraints',
'recipe ingredients bake flour butter',
'cooking temperature simmer oven saute',
'kitchen knife herbs spices garnish'
)
)
dtm <- docs |>
unnest_tokens(word, text) |>
count(id, word) |>
cast_dtm(id, word, n)
lda <- LDA(dtm, k = 3, control = list(seed = 123))
tidy(lda, 'beta') |>
group_by(topic) |>
slice_max(beta, n = 4) |>
summarise(words = paste(term, collapse = ', ')) |>
print()Keterbatasan LDA
LDA mengasumsikan model bag-of-words (urutan kata tidak penting), topik bersifat tetap di seluruh korpus, dan K harus dipilih terlebih dahulu. Untuk topik yang dinamis atau hierarkis, pertimbangkan STM (Structural Topic Model) atau CTM (Correlated Topic Model) yang tersedia dalam paket stm.
# LDA assumptions and limitations
limitations <- data.frame(
Assumption = c(
'Bag of words', 'Fixed K', 'Topic independence',
'Static topics', 'No metadata'
),
Alternative = c(
'word2vec / BERT',
'ldatuning for K selection',
'CTM (Correlated Topic Model)',
'DTM (Dynamic Topic Model)',
'STM (Structural Topic Model)'
)
)
print(limitations, row.names = FALSE)Pemeriksaan Singkat
Dalam LDA, apa yang direpresentasikan oleh matriks beta?
Ringkasan: Pemodelan Topik dengan LDA
Hal-hal penting:
- LDA menemukan K topik laten sebagai distribusi kata dari matriks istilah-dokumen
- Bangun DTM dengan
cast_dtm(document, word, n)(tidytext) atauDocumentTermMatrix()(tm) LDA(dtm, k = K, control = list(seed = 42))menyesuaikan modeltidy(lda, 'beta')= probabilitas topik per kata (hal yang menentukan setiap topik)tidy(lda, 'gamma')= proporsi topik per dokumen (hal yang dibahas setiap dokumen)- Gunakan skor perplexity atau koherensi untuk membantu menentukan K
- Selalu periksa kata-kata teratas secara manual untuk memberi label pada topik
library(topicmodels)
library(tidytext)
library(dplyr)
data('AssociatedPress', package = 'topicmodels')
lda <- LDA(AssociatedPress[1:20, ], k = 2, control = list(seed = 1))
tidy(lda, 'beta') |>
group_by(topic) |>
slice_max(beta, n = 3) |>
summarise(top_words = paste(term, collapse = ', ')) |>
print()Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pemodelan Topik dengan LDA” gratis?
Ya — teks lengkap “Pemodelan Topik dengan LDA” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pemodelan Topik dengan LDA”?
Temukan topik laten dalam korpus dokumen menggunakan paket topicmodels. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pemodelan Topik dengan LDA” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Tokenisasi dan Penghapusan Kata Henti
- TF-IDF dan Analisis Frekuensi Istilah
- Analisis Sentimen di R
- Pemodelan Topik dengan LDA