Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Le TF-IDF expliqué simplement

Après cette leçon: Je peux classer des documents selon la rareté des mots de la requête avec le TF-IDF.

Leçon de 60 min1 commandeLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Pourquoi « a » compte moins que « midi »

Le TF-IDF (term frequency, inverse document frequency) est un score qui mesure l’importance d’un mot dans un document. Il est fort pour un mot fréquent dans ce document et rare dans les autres.

Une recherche « restaurant midi » trouve vite les fiches qui contiennent « a », mais ce petit mot ne dit rien. Il faut un score qui mette « midi » en avant.

À la fin de cette leçon

Remarque

Je peux classer des documents selon la rareté des mots de la requête avec le TF-IDF.

Mots clés

MotCe que ça veut direExemple
Fréquence du termela part d’un document que le mot occupe1 sur 6
Fréquence de documentle nombre de documents qui contiennent le mot
Fréquence inversele logarithme du nombre de documents divisé par la fréquence de document
TF-IDFla fréquence du terme multipliée par la fréquence inverse
Scorele nombre qui sert à classer les documents

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La fréquence du terme mesure son poids

La fréquence du terme est le nombre de fois où le mot apparaît, divisé par le nombre de mots du document. On compare ainsi des textes courts et longs.

Dans « le restaurant universitaire ouvre a midi », qui a 6 mots, « midi » apparaît 1 fois : 1 sur 6, soit environ 0,167.

La fréquence inverse récompense les mots rares

Un mot présent dans presque tous les documents n’aide pas à choisir. On calcule donc le logarithme décimal de N divisé par df. N est le nombre de documents, df le nombre qui contiennent le mot.

Un mot présent partout donne log10(1) = 0 : il ne compte pas. Un mot présent dans un seul document sur quatre donne log10(4), environ 0,602.

Exemple travaillé : la fréquence inverse sur quatre documents

MotDocuments qui le contiennentCalculFréquence inverse
midi1 sur 4log10(4 / 1)0,602
restaurant2 sur 4log10(4 / 2)0,301
a3 sur 4log10(4 / 3)0,125
un mot dans les 44 sur 4log10(4 / 4)0

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Calculer deux fréquences inverses

Commande
docker exec jupyter python3 -c 'print(round(__import__("math").log10(4 / 1), 3), round(__import__("math").log10(4 / 2), 3), round(__import__("math").log10(4 / 4), 3))'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le score additionne les TF-IDF demandés

Le TF-IDF d’un mot dans un document est sa fréquence du terme multipliée par sa fréquence inverse. Pour une requête de plusieurs mots, on additionne.

Le document au plus grand score arrive en premier. Un mot qui manque dans un document y ajoute 0.

Exemple travaillé : la requête « restaurant midi »

DocumentrestaurantmidiScore
0 : le restaurant universitaire ouvre a midi1/6 × 0,301 = 0,051/6 × 0,602 = 0,100,15
1 : la bibliotheque universitaire ouvre a huit heures000
2 : le restaurant propose un menu a trois euros1/8 × 0,301 = 0,0400,04
3 : la bibliotheque prete un livre pour trois semaines000

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

Beaucoup pensent que le mot le plus fréquent d’un document est le plus important. Les mots comme « a » ou « le » sont partout et n’apprennent rien. Le TF-IDF garde les mots fréquents ici et rares ailleurs.

Calculer le TF-IDF d’un mot

Code: python
import math

documents = [
    "le restaurant universitaire ouvre a midi".split(),
    "la bibliotheque universitaire ouvre a huit heures".split(),
    "le restaurant propose un menu a trois euros".split(),
    "la bibliotheque prete un livre pour trois semaines".split(),
]
mot = "midi"
jetons = documents[0]
tf = jetons.count(mot) / len(jetons)
presents = 0
for texte in documents:
    if mot in texte:
        presents = presents + 1
idf = math.log10(len(documents) / presents)
print(round(tf, 3), round(idf, 3), round(tf * idf, 3))
# Remplacez "midi" par "a", puis relancez. Que devient le score ?

Pour aller plus loin

Dans un carnet de JupyterLab, prenez vos six phrases de la leçon précédente. Calculez le score de deux requêtes, l’une avec un mot rare, l’autre avec un mot courant.

Quel document arrive en tête ? Ajoutez dix documents qui contiennent un mot : que devient sa fréquence inverse ?

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.