TF-IDF dan Analisis Frekuensi Istilah
Nilai kepentingan istilah di berbagai dokumen dengan bind_tf_idf().
TF-IDF dan Analisis Frekuensi Istilah adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 TF-IDF?
TF-IDF (Frekuensi Istilah–Frekuensi Dokumen Terbalik) mengukur seberapa khas suatu kata bagi dokumen tertentu dalam sebuah korpus. Skor TF-IDF yang tinggi berarti kata tersebut sering muncul dalam dokumen itu, tetapi jarang muncul di seluruh dokumen—indikator yang baik untuk topik utama dokumen.
# 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')Menyiapkan Jumlah Token
Sebelum menghitung TF-IDF, Anda memerlukan kerangka data dengan kolom: document (pengenal dokumen), word (token), dan n (jumlah). Gunakan unnest_tokens(), lalu 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: Menghitung TF-IDF
bind_tf_idf(word, document, n) menerima kerangka data jumlah yang rapi dan menambahkan tiga kolom: tf (frekuensi istilah), idf (frekuensi dokumen terbalik), dan tf_idf (hasil kali keduanya). Fungsi ini menghitung IDF dari dokumen yang ada dalam kerangka data.
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))Urutkan(desc(tf_idf)): Istilah Teratas
Urutkan berdasarkan tf_idf secara menurun untuk melihat kata yang paling baik menggambarkan setiap dokumen. Kata dengan IDF nol (muncul di setiap dokumen) akan memiliki TF-IDF nol berapa pun frekuensinya—kata tersebut tidak dapat membedakan dokumen.
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))Istilah TF-IDF Teratas per Dokumen
Gunakan group_by(document) |> slice_max(tf_idf, n = 5) untuk mengambil N istilah paling khas pada setiap dokumen. Ini merupakan ringkasan korpus yang kuat—kosakata khas setiap dokumen terlihat dengan jelas.
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')])Memvisualisasikan TF-IDF per Dokumen
Diagram batang skor TF-IDF yang dikelompokkan berdasarkan dokumen memperlihatkan kosakata khas setiap dokumen secara sekilas. Gunakan facet_wrap(~document, scales = 'free_y') agar setiap panel menampilkan istilah teratasnya sendiri secara terpisah.
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: Kata yang Muncul di Semua Dokumen
Kata yang muncul di setiap dokumen memiliki IDF = log(N/N) = 0, sehingga TF-IDF = 0. Dengan demikian, kata umum di seluruh korpus otomatis diberi bobot lebih rendah tanpa memerlukan daftar kata umum—meskipun penghapusan kata umum tetap berguna untuk korpus yang sangat kecil.
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')])Membandingkan Dua Dokumen
TF-IDF memudahkan perbandingan dokumen: temukan istilah dengan TF-IDF tinggi dalam satu dokumen tetapi rendah atau nol dalam dokumen lain untuk memahami keunikan setiap dokumen. Gabungkan tabel TF-IDF secara inner join berdasarkan word, lalu bandingkan skornya.
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 dengan Novel Jane Austen
Paket janeaustenr menyediakan teks lengkap enam novel Austen. Ini merupakan tolok ukur TF-IDF klasik: penggemar Austen dapat mengenali kosakata khas setiap novel—kata "wentworth" hampir hanya muncul dalam Persuasion.
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 untuk Rekayasa Fitur
Skor TF-IDF dapat digunakan sebagai fitur dalam pengklasifikasi pembelajaran mesin. Ubah keluaran TF-IDF yang rapi menjadi matriks dokumen-istilah menggunakan cast_dtm() atau cast_sparse(), lalu masukkan ke glmnet, xgboost, atau pengklasifikasi lainnya.
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')Keterbatasan dan Alternatif
TF-IDF memiliki beberapa keterbatasan: metode ini memperlakukan kata sebagai sesuatu yang independen, mengabaikan urutan dan konteks kata, serta dapat didominasi oleh salah eja yang jarang muncul. Alternatif modern mencakup embedding kata (word2vec, GloVe) dan embedding kontekstual (BERT), tetapi TF-IDF tetap sangat baik untuk pengambilan dokumen dan tolok ukur klasifikasi.
# 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)Pemeriksaan Singkat
Sebuah kata muncul dalam semua dokumen di korpus Anda. Berapakah skor TF-IDF-nya?
Ringkasan: Analisis TF-IDF
Hal-hal penting:
- TF-IDF = frekuensi istilah × frekuensi dokumen terbalik; skor tinggi = kata yang khas
- Alur kerja:
unnest_tokens()→count(document, word)→bind_tf_idf(word, document, n) bind_tf_idf()menambahkan kolomtf,idf, dantf_idfarrange(desc(tf_idf))/slice_max(tf_idf, n = 5)menampilkan istilah teratas per dokumen- Kata yang terdapat di semua dokumen otomatis memiliki IDF = 0 dan TF-IDF = 0
cast_dtm(document, word, tf_idf)mengubah data menjadi matriks dokumen-istilah untuk pembelajaran mesin- Diagram batang dengan panel berdasarkan dokumen merupakan visualisasi standar untuk hasil TF-IDF
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()Pertanyaan yang Sering Diajukan
Apakah pelajaran “TF-IDF dan Analisis Frekuensi Istilah” gratis?
Ya — teks lengkap “TF-IDF dan Analisis Frekuensi Istilah” 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 “TF-IDF dan Analisis Frekuensi Istilah”?
Nilai kepentingan istilah di berbagai dokumen dengan bind_tf_idf(). 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 2 dari 4.
Berapa lama pelajaran “TF-IDF dan Analisis Frekuensi Istilah” 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