TF-IDF ve Terim Sıklığı Analizi
bind_tf_idf() ile terimlerin belgeler arasındaki önemini puanlayın.
TF-IDF ve Terim Sıklığı Analizi, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 2. 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.
TF-IDF Nedir?
TF-IDF (Terim Sıklığı–Ters Belge Sıklığı), bir kelimenin bir derlem içindeki belirli bir belgeye ne ölçüde özgü olduğunu ölçer. Yüksek TF-IDF puanı, kelimenin ilgili belgede sık geçtiği ancak tüm belgelerde nadir olduğu anlamına gelir; bu da belgenin temel konularını göstermek için iyi bir ölçüttür.
# 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')Belirteç Sayılarını Hazırlama
TF-IDF hesaplamadan önce şu sütunları içeren bir veri çerçevesine ihtiyacınız vardır: document (belge tanımlayıcısı), word (belirteç) ve n (sayı). unnest_tokens() işlevinin ardından count(document, word) kullanın.
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 Hesaplama
bind_tf_idf(word, document, n), düzenli bir sayı veri çerçevesini alır ve üç sütun ekler: tf (terim sıklığı), idf (ters belge sıklığı) ve tf_idf (bu ikisinin çarpımı). IDF'yi veri çerçevesinde bulunan belgelerden hesaplar.
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)): Öne Çıkan Terimler
Her belgeyi en iyi karakterize eden kelimeleri görmek için tf_idf değerine göre azalan sırada sıralayın. IDF değeri sıfır olan (her belgede bulunan) kelimelerin sıklığı ne olursa olsun TF-IDF değeri sıfırdır; bu kelimeler belgeleri birbirinden ayıramaz.
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))Belge Başına En Yüksek TF-IDF Terimleri
Belge başına en ayırt edici ilk N terimi çıkarmak için group_by(document) |> slice_max(tf_idf, n = 5) kullanın. Bu, bir derlemi özetlemenin güçlü bir yoludur; her belgenin ayırt edici kelime dağarcığı açıkça görünür.
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')])Belge Başına TF-IDF'yi Görselleştirme
Belgelere göre panellere ayrılmış TF-IDF puanı çubuk grafikleri, her belgenin ayırt edici kelime dağarcığını tek bakışta ortaya çıkarır. Her panelin kendi öne çıkan terimlerini bağımsız olarak göstermesi için facet_wrap(~document, scales = 'free_y') kullanın.
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: Tüm Belgelerde Bulunan Kelimeler
Her belgede bulunan kelimeler için IDF = log(N/N) = 0 olur ve dolayısıyla TF-IDF = 0'dır. Bu, derlinin tamamında yaygın olan kelimelerin ağırlığını bir durak kelimesi listesine gerek kalmadan otomatik olarak azaltır; yine de çok küçük derlemlerde durak kelimelerini kaldırmak yararlıdır.
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')])İki Belgeyi Karşılaştırma
TF-IDF, belge karşılaştırmayı kolaylaştırır: her belgeyi benzersiz kılan özellikleri anlamak için bir belgede TF-IDF değeri yüksek, diğerinde düşük veya sıfır olan terimleri bulun. TF-IDF tablolarını word sütununda iç birleştirmeyle birleştirin ve puanları karşılaştırın.
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()Jane Austen Romanlarıyla TF-IDF
janeaustenr paketi, Austen'ın altı romanının tam metnini sağlar. Bu, klasik bir TF-IDF karşılaştırma örneğidir: Austen hayranları her romanın ayırt edici kelime dağarcığını belirleyebilir; "wentworth" kelimesi neredeyse yalnızca Persuasion romanında bulunur.
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)Özellik Mühendisliği için TF-IDF
TF-IDF puanları, makine öğrenmesi sınıflandırıcılarında özellik olarak kullanılabilir. Düzenli TF-IDF çıktısını cast_dtm() veya cast_sparse() kullanarak belge-terim matrisine dönüştürün ve bunu glmnet, xgboost ya da başka bir sınıflandırıcıya aktarın.
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')Sınırlamalar ve Alternatifler
TF-IDF'nin bazı sınırlamaları vardır: kelimeleri bağımsız kabul eder, kelime sırasını ve bağlamı göz ardı eder ve nadir yazım hatlarının etkisi altında kalabilir. Modern alternatifler arasında kelime gömme yöntemleri (word2vec, GloVe) ve bağlamsal gömme yöntemleri (BERT) bulunur; ancak TF-IDF, belge getirme ve sınıflandırma için temel yöntem olarak hâlâ mükemmeldir.
# 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)Kısa Kontrol
Bir kelime derleminizdeki tüm belgelerde bulunuyor. TF-IDF puanı ne olur?
Özet: TF-IDF Analizi
Temel çıkarımlar:
- TF-IDF = terim sıklığı × ters belge sıklığı; yüksek puan = ayırt edici kelime
- İş akışı:
unnest_tokens()→count(document, word)→bind_tf_idf(word, document, n) bind_tf_idf(),tf,idfvetf_idfsütunlarını eklerarrange(desc(tf_idf))/slice_max(tf_idf, n = 5), belge başına öne çıkan terimleri ortaya çıkarır- Tüm belgelerde bulunan kelimelerin IDF ve TF-IDF değerleri otomatik olarak 0 olur
cast_dtm(document, word, tf_idf), makine öğrenmesi için belge-terim matrisine dönüştürür- Panellere ayrılmış çubuk grafikleri, TF-IDF sonuçlarının standart görselleştirmesidir
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()Sıkça Sorulan Sorular
“TF-IDF ve Terim Sıklığı Analizi” dersi ücretsiz mi?
Evet — “TF-IDF ve Terim Sıklığı Analizi” 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.
“TF-IDF ve Terim Sıklığı Analizi” dersinde ne öğreneceğim?
bind_tf_idf() ile terimlerin belgeler arasındaki önemini puanlayın. 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 2. dersidir.
“TF-IDF ve Terim Sıklığı Analizi” 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
- Belirteçleştirme ve Yaygın Sözcükleri Kaldırma
- TF-IDF ve Terim Sıklığı Analizi
- R'de Duygu Analizi
- LDA ile Konu Modelleme