TF-IDF- und Termfrequenzanalyse
Bewerten Sie die Bedeutung von Begriffen über mehrere Dokumente hinweg mit bind_tf_idf()
TF-IDF- und Termfrequenzanalyse ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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 TF-IDF?
TF-IDF (Term Frequency–Inverse Document Frequency) misst, wie charakteristisch ein Wort für ein bestimmtes Dokument innerhalb eines Korpus ist. Ein hoher TF-IDF-Wert bedeutet, dass das Wort in diesem Dokument häufig, in allen Dokumenten zusammen jedoch selten vorkommt – ein guter Hinweis auf die wichtigsten Themen des Dokuments.
# TF-IDF formula
# TF(w, d) = count of w in document d / total words in d
# IDF(w) = log(N / number of docs containing w)
# TF-IDF(w, d) = TF(w, d) * IDF(w)
# Manual example
N <- 4 # total documents
docs_with_word <- 1 # 'neural' appears in only 1 doc
tf <- 5 / 100 # word appears 5 times in 100-word doc
idf <- log(N / docs_with_word)
tfidf <- tf * idf
cat('TF: ', round(tf, 4), '\n')
cat('IDF: ', round(idf, 4), '\n')
cat('TF-IDF: ', round(tfidf, 4), '\n')Die Tokenanzahl vorbereiten
Vor der Berechnung von TF-IDF benötigen Sie einen Dataframe mit den Spalten document (Dokumentkennung), word (Token) und n (Anzahl). Verwenden Sie unnest_tokens() und anschließend count(document, word).
library(tidytext)
library(dplyr)
# Simulate a 4-document corpus on tech topics
docs <- tibble::tibble(
document = c(rep('ML', 3), rep('Stats', 3), rep('DB', 3), rep('Web', 3)),
text = c(
'machine learning neural networks training',
'deep learning models gradient descent',
'reinforcement learning reward policy agent',
'probability distributions hypothesis testing',
'bayesian inference regression analysis variance',
'statistics sampling confidence intervals normal',
'database sql joins indexes queries transactions',
'relational tables primary keys foreign constraints',
'nosql document store mongodb redis cassandra',
'html css javascript frontend react components',
'dom events browser api fetch requests',
'responsive design flexbox grid layout'
)
)
word_counts <- docs |>
unnest_tokens(word, text) |>
count(document, word, sort = TRUE)
cat('Document-word pairs:', nrow(word_counts), '\n')
print(head(word_counts, 8))bind_tf_idf: TF-IDF berechnen
bind_tf_idf(word, document, n) übernimmt einen Tidy-Dataframe mit Häufigkeiten und fügt drei Spalten hinzu: tf (Termhäufigkeit), idf (inverse Dokumenthäufigkeit) und tf_idf (deren Produkt). Die IDF wird anhand der im Dataframe enthaltenen Dokumente berechnet.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c(rep('ML', 2), rep('Stats', 2), rep('DB', 2)),
text = c(
'machine learning neural gradient',
'deep networks training epochs',
'probability distributions variance covariance',
'bayesian inference prior posterior',
'sql database tables joins indexes',
'queries transactions foreign primary'
)
)
tfidf <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n)
cat('Columns added:', names(tfidf), '\n')
print(head(arrange(tfidf, desc(tf_idf)), 8))arrange(desc(tf_idf)): Wichtigste Terme
Sortieren Sie nach absteigendem tf_idf, um zu sehen, welche Wörter die einzelnen Dokumente am besten charakterisieren. Wörter mit einer IDF von null (die in jedem Dokument vorkommen) haben unabhängig von ihrer Häufigkeit eine TF-IDF von null – sie können Dokumente nicht voneinander unterscheiden.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c(rep('Python', 3), rep('R', 3), rep('Julia', 3)),
text = c(
'python pandas numpy scipy programming',
'machine learning scikit tensorflow keras',
'jupyter notebooks scripts debugging modules',
'ggplot2 dplyr tidyverse statistics vectors',
'shiny rmarkdown knitr cran bioconductor',
'linear models factors dataframes packages',
'julia multiple dispatch type system macros',
'package ecosystem flux diffeq parallel',
'scientific computing performance benchmarks'
)
)
top_terms <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n) |>
arrange(desc(tf_idf))
cat('Top distinctive terms per language:\n')
print(head(top_terms[, c('document', 'word', 'tf_idf')], 9))Wichtigste TF-IDF-Terme pro Dokument
Verwenden Sie group_by(document) |> slice_max(tf_idf, n = 5), um die N charakteristischsten Terme pro Dokument zu extrahieren. Dies ist eine aussagekräftige Zusammenfassung eines Korpus – das charakteristische Vokabular jedes Dokuments wird klar sichtbar.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c(rep('Cooking', 3), rep('Finance', 3), rep('Sports', 3)),
text = c(
'recipe ingredients oven bake flour butter',
'cooking temperature boil simmer saute',
'kitchen knife chopping herbs spices garnish',
'investment portfolio returns dividends stocks bonds',
'market equity risk hedge fund derivatives',
'inflation interest rate treasury balance sheet',
'goal tackle pass dribble goalkeeper penalty',
'tournament league championship trophy season',
'athlete training stamina sprint endurance'
)
)
top5 <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n) |>
group_by(document) |>
slice_max(tf_idf, n = 3) |>
ungroup()
print(top5[, c('document', 'word', 'tf_idf')])TF-IDF pro Dokument visualisieren
Balkendiagramme der TF-IDF-Werte, nach Dokumenten in Facetten aufgeteilt, zeigen auf einen Blick das charakteristische Vokabular jedes Dokuments. Verwenden Sie facet_wrap(~document, scales = 'free_y'), damit jedes Panel seine eigenen wichtigsten Terme unabhängig darstellt.
library(tidytext)
library(dplyr)
library(ggplot2)
docs <- tibble::tibble(
document = c(rep('AI', 3), rep('DB', 3), rep('Web', 3)),
text = c(
'neural networks gradient backpropagation',
'deep learning transformer attention bert',
'reinforcement policy reward exploration',
'sql database indexes joins transactions',
'relational schema normalization queries',
'nosql mongodb redis cassandra document',
'html css javascript react dom',
'frontend api fetch async components',
'responsive flexbox grid webpack bundle'
)
)
plot_data <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n) |>
group_by(document) |>
slice_max(tf_idf, n = 4) |>
ungroup()
ggplot(plot_data, aes(reorder(word, tf_idf), tf_idf, fill = document)) +
geom_col(show.legend = FALSE) +
facet_wrap(~document, scales = 'free_y') +
coord_flip() +
labs(x = NULL, y = 'TF-IDF', title = 'Top TF-IDF Terms per Topic') +
theme_minimal()IDF: Wörter in allen Dokumenten
Wörter, die in jedem Dokument vorkommen, erhalten IDF = log(N/N) = 0 und somit TF-IDF = 0. Dadurch werden im gesamten Korpus häufige Wörter automatisch geringer gewichtet, ohne dass eine Stoppwortliste erforderlich ist – bei sehr kleinen Korpora ist das Entfernen von Stoppwörtern dennoch sinnvoll.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c('A', 'B', 'C'),
text = c(
'data analysis statistics regression probability',
'data engineering pipelines etl transformation',
'data visualisation ggplot2 charts dashboards'
)
)
tfidf <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n)
# 'data' appears in all 3 docs: tf_idf should be 0
data_rows <- filter(tfidf, word == 'data')
cat('TF-IDF for "data" across documents:\n')
print(data_rows[, c('document', 'word', 'idf', 'tf_idf')])Zwei Dokumente vergleichen
TF-IDF erleichtert den Dokumentvergleich: Suchen Sie nach Termen mit hoher TF-IDF in einem Dokument, aber niedriger oder null TF-IDF in einem anderen, um zu verstehen, wodurch sich die Dokumente unterscheiden. Führen Sie die TF-IDF-Tabellen über word per Inner Join zusammen und vergleichen Sie die Werte.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c(rep('Doc1', 3), rep('Doc2', 3)),
text = c(
'bayesian statistics prior posterior mcmc',
'markov chain monte carlo sampling',
'probability distributions conjugate inference',
'convolutional neural network image classification',
'pooling activation relu softmax batch',
'convolution filter feature map stride padding'
)
)
tfidf <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n)
# Top 3 unique terms per document
tfidf |>
group_by(document) |>
slice_max(tf_idf, n = 3) |>
select(document, word, tf_idf) |>
print()TF-IDF mit Jane-Austen-Romanen
Das Paket janeaustenr stellt den vollständigen Text von sechs Austen-Romanen bereit. Dies ist ein klassischer TF-IDF-Benchmark: Austen-Fans können das charakteristische Vokabular jedes Romans erkennen – das Wort „wentworth“ kommt fast ausschließlich in Persuasion vor.
library(tidytext)
library(dplyr)
# Requires janeaustenr package
# library(janeaustenr)
# austen_books() returns: book, text
# Simulated mini-Austen corpus
mini_austen <- tibble::tibble(
book = c(rep('Sense', 3), rep('Pride', 3), rep('Emma', 3)),
text = c(
'elinor marianne dashwood willoughby colonel',
'edward ferrars barton cottage sister sense',
'brandon feelings attachment sensibility heart',
'darcy bennet bingley netherfield wickham',
'jane lizzy lydia longbourn pemberley',
'pride prejudice proposal marriage happiness',
'emma woodhouse knightley harriet weston',
'highbury match social governess niece',
'frank jane fairfax box hill picnic'
)
)
top <- mini_austen |>
unnest_tokens(word, text) |>
count(book, word) |>
bind_tf_idf(word, book, n) |>
group_by(book) |>
slice_max(tf_idf, n = 3) |>
select(book, word, tf_idf)
print(top)TF-IDF für Feature Engineering
TF-IDF-Werte können als Features in Klassifikatoren des maschinellen Lernens verwendet werden. Wandeln Sie die Tidy-TF-IDF-Ausgabe mit cast_dtm() oder cast_sparse() in eine Dokument-Term-Matrix um und übergeben Sie sie an glmnet, xgboost oder einen anderen Klassifikator.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
document = c(rep('Positive', 4), rep('Negative', 4)),
text = c(
'excellent product love recommend quality',
'amazing fast delivery five star perfect',
'great value money satisfied happy return',
'wonderful experience purchase outstanding best',
'terrible waste money broken arrived damaged',
'horrible quality slow delivery disappointed awful',
'poor value cheap plastic flimsy broken',
'worst experience refund needed useless junk'
)
)
# TF-IDF as features
tfidf_wide <- docs |>
unnest_tokens(word, text) |>
count(document, word) |>
bind_tf_idf(word, document, n) |>
cast_dtm(document, word, tf_idf)
cat('DTM dimensions:', dim(tfidf_wide), '\n')
cat('(rows=documents, cols=unique words)\n')Einschränkungen und Alternativen
TF-IDF hat Einschränkungen: Wörter werden als unabhängig voneinander behandelt, Wortreihenfolge und Kontext werden ignoriert, und seltene Tippfehler können die Ergebnisse dominieren. Zu den modernen Alternativen gehören Word Embeddings (word2vec, GloVe) und kontextbezogene Embeddings (BERT). TF-IDF bleibt jedoch hervorragend für Dokumentenabruf und Klassifikations-Baselines geeignet.
# TF-IDF strengths and weaknesses summary
criteria <- data.frame(
Criterion = c('Speed', 'Interpretability', 'Context', 'Word order',
'Rare words', 'Scalability'),
TF_IDF = c('Fast', 'High', 'None', 'Ignored',
'High IDF (inflated)', 'Excellent'),
BERT = c('Slow', 'Low', 'Rich', 'Captured',
'Handled', 'Moderate')
)
print(criteria, row.names = FALSE)Kurze Wissensprüfung
Ein Wort kommt in allen Dokumenten Ihres Korpus vor. Wie hoch wird sein TF-IDF-Wert sein?
Zusammenfassung: TF-IDF-Analyse
Wichtigste Erkenntnisse:
- TF-IDF = Termhäufigkeit × inverse Dokumenthäufigkeit; ein hoher Wert weist auf ein charakteristisches Wort hin
- Arbeitsablauf:
unnest_tokens()→count(document, word)→bind_tf_idf(word, document, n) bind_tf_idf()fügt die Spaltentf,idfundtf_idfhinzuarrange(desc(tf_idf))/slice_max(tf_idf, n = 5)zeigt die wichtigsten Terme pro Dokument- Wörter in allen Dokumenten erhalten automatisch IDF = 0 und TF-IDF = 0
cast_dtm(document, word, tf_idf)wandelt die Daten für ML in eine Dokument-Term-Matrix um- Facettierte Balkendiagramme sind die Standardvisualisierung für TF-IDF-Ergebnisse
library(tidytext)
library(dplyr)
# Minimal TF-IDF pipeline
tibble::tibble(
doc = c('A', 'A', 'B', 'B'),
text = c('neural networks deep', 'learning training', 'sql database query', 'joins indexes')
) |>
unnest_tokens(word, text) |>
count(doc, word) |>
bind_tf_idf(word, doc, n) |>
arrange(desc(tf_idf)) |>
print()Häufig gestellte Fragen
Ist die Lektion „TF-IDF- und Termfrequenzanalyse“ kostenlos?
Ja — der vollständige Text von „TF-IDF- und Termfrequenzanalyse“ 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 „TF-IDF- und Termfrequenzanalyse“?
Bewerten Sie die Bedeutung von Begriffen über mehrere Dokumente hinweg mit bind_tf_idf() 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 2 von 4.
Wie lange dauert die Lektion „TF-IDF- und Termfrequenzanalyse“?
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