0Pricing
R Academy · Ders

LDA ile Konu Modelleme

topicmodels paketini kullanarak belge derlemlerindeki gizli konuları keşfedin.

LDA ile Konu Modelleme, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

Konu Modelleme Nedir?

Konu modelleme, bir derlemedeki örtük tematik yapıyı keşfeden, gözetimsiz bir makine öğrenmesi tekniğidir. Latent Dirichlet Allocation (LDA), her belgenin K konunun bir karışımı olduğunu ve her konunun sözcükler üzerinde bir olasılık dağılımı olduğunu varsayar.

# 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')

tm ile DocumentTermMatrix

LDA bir Document-Term Matrix (DTM) gerektirir: satırlar belgeleri, sütunlar sözcükleri, hücreler ise sözcük sayılarını temsil eder. tm paketinin DocumentTermMatrix() işlevi veya tidytext'in cast_dtm() işlevi bu biçimi üretir.

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')

tidytext'ten cast_dtm

cast_dtm(document, term, value), düzenli bir sözcük-sayı tibble'ını doğrudan topicmodels paketiyle uyumlu bir DocumentTermMatrix'e dönüştürür. Bu sayede işlem hattınız tidyverse tarzında kalır.

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): Modeli Uydurma

LDA(dtm, k = K, control = list(seed = 42)), Gibbs örneklemesi veya VEM kullanarak K konulu bir LDA modeli uydurur. Yeniden üretilebilirlik için her zaman bir seed belirleyin; LDA rastlantısaldır ve sabit bir seed olmadan sonuçlar çalıştırmalar arasında değişir.

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'): Sözcük Başına Konu Olasılıkları

tidy(lda_model, matrix = 'beta'), sözcük başına konu olasılıklarını (beta matrisini) çıkarır. Her satır, belirli bir sözcüğün belirli bir konu tarafından üretilmiş olma olasılığını verir. Olasılığı yüksek sözcükler, her konunun ne hakkında olduğunu tanımlar.

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)

Konu Sözcüklerini Görselleştirme

Konu başına en yüksek N sözcüğü, bölümlere ayrılmış bir çubuk grafik olarak çizin. Her bölüm içinde doğru ve bağımsız sıralama yapmak için tidytext'teki reorder_within() ve scale_x_reordered() işlevlerini kullanarak sözcükleri beta değerine göre sıralayın.

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'): Belge Başına Konu Olasılıkları

tidy(lda_model, matrix = 'gamma'), belge başına konu olasılıklarını (gamma matrisini) çıkarır. Her satır, bir belgenin belirli bir konudan geldiği tahmin edilen oranı verir. Konu 2 için gamma değeri yüksek olan belgeler konu 2 hakkındadır.

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))

K Seçimi: Konu Sayısı

LDA, K değerini önceden belirlemenizi gerektirir. Yaygın yaklaşımlar şunlardır: (1) perplexity — küçük değer daha iyidir, ancak K arttıkça tekdüze biçimde azalır; (2) tutarlılık puanı (ldatuning paketi); (3) alan bilgisi; (4) K = 5, 10, 20 değerlerini deneyip sözcük listelerini elle incelemek.

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')

Konuları Etiketleme

LDA, anonim konular üretir (1, 2, 3…). İnsan analistin, en sık geçen sözcükleri inceleyerek her konuya etiket vermesi gerekir. Konu numaralarını açıklayıcı adlarla eşleyen bir arama tablosu oluşturun ve sonuçlarınıza ekleyin.

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)

Özel Derlem Üzerinde LDA

Burada özel bir derlem üzerinde baştan sona eksiksiz bir LDA işlem hattı yer alıyor: token'lara ayırma, DTM oluşturma, LDA'yı uydurma, beta matrisini çıkarma ve konu başına en sık geçen sözcükleri görüntüleme.

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()

LDA'nın Sınırlamaları

LDA, sözcük torbası modelini (sözcük sırasının önemli olmadığı), konuların derlem boyunca sabit olduğunu ve K değerinin önceden seçilmesi gerektiğini varsayar. Dinamik veya hiyerarşik konular için stm paketinde bulunan STM (Structural Topic Model) veya CTM (Correlated Topic Model) yöntemlerini değerlendirin.

# 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)

Hızlı Kontrol

LDA'de beta matrisi neyi temsil eder?

Özet: LDA ile Konu Modelleme

Temel çıkarımlar:

  • LDA, belge-terim matrisindeki sözcük dağılımlarından K örtük konu keşfeder
  • DTM'yi cast_dtm(document, word, n) (tidytext) veya DocumentTermMatrix() (tm) ile oluşturun
  • LDA(dtm, k = K, control = list(seed = 42)) modeli uydurur
  • tidy(lda, 'beta') = sözcük başına konu olasılıkları (her konuyu tanımlayan şey)
  • tidy(lda, 'gamma') = belge başına konu oranları (her belgenin ne hakkında olduğu)
  • K seçimine yön vermek için perplexity veya tutarlılık puanlarını kullanın
  • Konuları etiketlemek için en sık geçen sözcükleri her zaman elle inceleyin
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()

Sıkça Sorulan Sorular

“LDA ile Konu Modelleme” dersi ücretsiz mi?

Evet — “LDA ile Konu Modelleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“LDA ile Konu Modelleme” dersinde ne öğreneceğim?

topicmodels paketini kullanarak belge derlemlerindeki gizli konuları keşfedin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“LDA ile Konu Modelleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Belirteçleştirme ve Yaygın Sözcükleri Kaldırma
  2. TF-IDF ve Terim Sıklığı Analizi
  3. R'de Duygu Analizi
  4. LDA ile Konu Modelleme
← R Academy Sayfasına Dön