Topic Modeling mit LDA
Entdecken Sie latente Themen in Dokumentkorpora mit dem Paket topicmodels
Topic Modeling mit LDA ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist Topic-Modelling?
Topic-Modelling ist eine unüberwachte Machine-Learning-Technik, die latente thematische Strukturen in einem Korpus erkennt. Latent Dirichlet Allocation (LDA) geht davon aus, dass jedes Dokument eine Mischung aus K Themen ist und jedes Thema eine Wahrscheinlichkeitsverteilung über Wörter darstellt.
# 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 aus tm
LDA benötigt eine Document-Term-Matrix (DTM): Die Zeilen sind Dokumente, die Spalten Wörter und die Zellen enthalten Worthäufigkeiten. Sowohl DocumentTermMatrix() aus dem Paket tm als auch cast_dtm() aus tidytext erzeugen dieses Format.
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 aus tidytext
cast_dtm(document, term, value) wandelt ein Tidy-Tibble mit Worthäufigkeiten direkt in eine DocumentTermMatrix um, die mit dem Paket topicmodels kompatibel ist. Dadurch bleibt Ihre Pipeline im Stil des 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): Das Modell anpassen
LDA(dtm, k = K, control = list(seed = 42)) passt ein LDA-Modell mit K Themen mithilfe von Gibbs-Sampling oder VEM an. Setzen Sie für reproduzierbare Ergebnisse immer einen seed – LDA ist stochastisch, und ohne festen Seed unterscheiden sich die Ergebnisse zwischen den Durchläufen.
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'): Themenwahrscheinlichkeiten pro Wort
tidy(lda_model, matrix = 'beta') extrahiert die Themenwahrscheinlichkeiten pro Wort (die Betamatrix). Jede Zeile gibt die Wahrscheinlichkeit an, dass ein bestimmtes Wort von einem bestimmten Thema erzeugt wurde. Wörter mit hoher Wahrscheinlichkeit definieren, worum es in einem Thema geht.
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)Themenwörter visualisieren
Stellen Sie die N wichtigsten Wörter pro Thema als facettiertes Balkendiagramm dar. Sortieren Sie innerhalb jedes Themas nach dem Beta-Wert mit reorder_within() und scale_x_reordered() aus tidytext, damit die Reihenfolge für jedes Facet unabhängig korrekt ist.
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'): Themenwahrscheinlichkeiten pro Dokument
tidy(lda_model, matrix = 'gamma') extrahiert die Themenwahrscheinlichkeiten pro Dokument (die Gammamatrix). Jede Zeile gibt den geschätzten Anteil eines Dokuments an, der auf ein bestimmtes Thema entfällt. Dokumente mit einem hohen Gammawert für Thema 2 handeln von Thema 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))K auswählen: Anzahl der Themen
Bei LDA müssen Sie K im Voraus festlegen. Übliche Ansätze sind: (1) Perplexität – niedriger ist besser, sie nimmt jedoch monoton mit K ab; (2) Kohärenzwert (Paket ldatuning); (3) Domänenwissen; (4) K = 5, 10, 20 ausprobieren und die Wortlisten manuell prüfen.
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')Themen benennen
LDA erzeugt anonyme Themen (1, 2, 3 …). Die menschliche Analyse muss jedes Thema benennen, indem sie dessen wichtigste Wörter untersucht. Erstellen Sie eine Lookup-Tabelle, die Themennummern beschreibenden Namen zuordnet, und verknüpfen Sie sie mit Ihren Ergebnissen.
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 auf einen eigenen Korpus anwenden
Hier sehen Sie eine vollständige LDA-Pipeline für einen eigenen Korpus: Tokenisierung, Aufbau der DTM, Anpassung von LDA, Extraktion der Betamatrix und Anzeige der wichtigsten Wörter pro Thema.
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()Einschränkungen von LDA
LDA basiert auf einem Bag-of-Words-Modell (die Wortreihenfolge spielt keine Rolle), geht von über den gesamten Korpus statischen Themen aus, und K muss im Voraus festgelegt werden. Für dynamische oder hierarchische Themen können Sie STM (Structural Topic Model) oder CTM (Correlated Topic Model) aus dem Paket stm verwenden.
# 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)Kurzer Check
Was stellt die Beta-Matrix bei LDA dar?
Zusammenfassung: Topic-Modelling mit LDA
Wichtigste Erkenntnisse:
- LDA erkennt K latente Themen als Wortverteilungen aus einer Dokument-Term-Matrix
- Erstellen Sie eine DTM mit
cast_dtm(document, word, n)(tidytext) oderDocumentTermMatrix()(tm) LDA(dtm, k = K, control = list(seed = 42))passt das Modell antidy(lda, 'beta')= Themenwahrscheinlichkeiten pro Wort (was ein Thema definiert)tidy(lda, 'gamma')= Themenanteile pro Dokument (worum es in einem Dokument geht)- Verwenden Sie Perplexitäts- oder Kohärenzwerte, um die Wahl von K zu unterstützen
- Prüfen Sie die wichtigsten Wörter immer manuell, um die Themen zu benennen
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()Lerne R mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 43
- Lektionen
- 159
Häufig gestellte Fragen
Ist die Lektion „Topic Modeling mit LDA“ kostenlos?
Ja — der vollständige Text von „Topic Modeling mit LDA“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Topic Modeling mit LDA“?
Entdecken Sie latente Themen in Dokumentkorpora mit dem Paket topicmodels Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Topic Modeling mit LDA“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Tokenisierung und Entfernen von Stoppwörtern
- TF-IDF- und Termfrequenzanalyse
- Sentimentanalyse in R
- Topic Modeling mit LDA