0Pricing
R Academy · Leçon

TF-IDF et analyse de la fréquence des termes

Évaluez l’importance des termes dans plusieurs documents avec bind_tf_idf().

TF-IDF et analyse de la fréquence des termes est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.

Qu’est-ce que le TF-IDF ?

Le TF-IDF (fréquence des termes–fréquence inverse des documents) mesure le caractère distinctif d’un mot pour un document donné au sein d’un corpus. Un score TF-IDF élevé signifie que le mot est fréquent dans ce document, mais rare dans l’ensemble des documents : c’est un bon indicateur des thèmes principaux du document.

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

Préparer le comptage des tokens

Avant de calculer le TF-IDF, vous devez disposer d’un tableau de données contenant les colonnes suivantes : document (identifiant du document), word (token) et n (comptage). Utilisez unnest_tokens(), puis 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 : calculer le TF-IDF

bind_tf_idf(word, document, n) prend un tableau de comptages au format tidy et lui ajoute trois colonnes : tf (fréquence du terme), idf (fréquence inverse des documents) et tf_idf (leur produit). La valeur IDF est calculée à partir des documents présents dans le tableau.

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)) : termes principaux

Triez par tf_idf décroissant pour voir quels mots caractérisent le mieux chaque document. Les mots dont l’IDF vaut zéro (présents dans tous les documents) auront un TF-IDF nul quelle que soit leur fréquence : ils ne permettent pas de distinguer les documents.

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

Principaux termes TF-IDF par document

Utilisez group_by(document) |> slice_max(tf_idf, n = 5) pour extraire les N termes les plus distinctifs de chaque document. Il s’agit d’un résumé puissant du corpus : le vocabulaire propre à chaque document apparaît clairement.

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

Visualiser le TF-IDF par document

Les histogrammes des scores TF-IDF, répartis par document, révèlent d’un coup d’œil le vocabulaire distinctif de chacun. Utilisez facet_wrap(~document, scales = 'free_y') afin que chaque panneau affiche indépendamment ses propres termes principaux.

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 : mots présents dans tous les documents

Les mots présents dans chaque document obtiennent IDF = log(N/N) = 0, et donc TF-IDF = 0. Cela réduit automatiquement le poids des mots courants dans tout le corpus sans nécessiter de liste de mots vides, même si la suppression de ces mots reste utile pour les très petits corpus.

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

Comparer deux documents

Le TF-IDF facilite la comparaison de documents : recherchez les termes dont le TF-IDF est élevé dans un document, mais faible ou nul dans un autre, afin de comprendre ce qui rend chaque document unique. Effectuez une jointure interne des tableaux TF-IDF sur word et comparez les scores.

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 avec les romans de Jane Austen

Le package janeaustenr fournit le texte intégral de six romans d’Austen. Il s’agit d’un exemple classique pour le TF-IDF : les lecteurs d’Austen peuvent identifier le vocabulaire propre à chaque roman ; le mot wentworth est presque propre à 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 pour l’ingénierie des caractéristiques

Les scores TF-IDF peuvent servir de caractéristiques dans des classificateurs d’apprentissage automatique. Convertissez le résultat tidy du TF-IDF en matrice document-termes à l’aide de cast_dtm() ou cast_sparse(), puis transmettez-la à glmnet, xgboost ou à tout autre classificateur.

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

Limites et solutions de remplacement

Le TF-IDF présente certaines limites : il traite les mots comme indépendants, ignore leur ordre et leur contexte, et peut être dominé par de rares fautes d’orthographe. Les solutions modernes comprennent les plongements de mots (word2vec, GloVe) et les plongements contextuels (BERT), mais le TF-IDF reste excellent pour la recherche de documents et comme référence pour la classification.

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

Vérification rapide

Un mot apparaît dans tous les documents de votre corpus. Quelle sera sa valeur TF-IDF ?

Récapitulatif : analyse TF-IDF

Points essentiels :

  • TF-IDF = fréquence du terme × fréquence inverse des documents ; un score élevé indique un mot distinctif
  • Flux de travail : unnest_tokens() → count(document, word) → bind_tf_idf(word, document, n)
  • bind_tf_idf() ajoute les colonnes tf, idf et tf_idf
  • arrange(desc(tf_idf)) / slice_max(tf_idf, n = 5) fait ressortir les principaux termes de chaque document
  • Les mots présents dans tous les documents obtiennent automatiquement IDF = 0 et TF-IDF = 0
  • cast_dtm(document, word, tf_idf) convertit les données en matrice document-termes pour l’apprentissage automatique
  • Les histogrammes répartis par facettes constituent la visualisation standard des résultats 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()

Questions Fréquemment Posées

La leçon « TF-IDF et analyse de la fréquence des termes » est-elle gratuite ?

Oui — le texte complet de « TF-IDF et analyse de la fréquence des termes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « TF-IDF et analyse de la fréquence des termes » ?

Évaluez l’importance des termes dans plusieurs documents avec bind_tf_idf(). Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer R Academy ?

Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « TF-IDF et analyse de la fréquence des termes » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon R Academy ?

Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Tokenisation et suppression des mots vides
  2. TF-IDF et analyse de la fréquence des termes
  3. Analyse des sentiments dans R
  4. Modélisation des thèmes avec LDA
← Retour à R Academy