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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Fréquence du terme | la part d’un document que le mot occupe | 1 sur 6 |
| Fréquence de document | le nombre de documents qui contiennent le mot | |
| Fréquence inverse | le logarithme du nombre de documents divisé par la fréquence de document | |
| TF-IDF | la fréquence du terme multipliée par la fréquence inverse | |
| Score | le 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
| Mot | Documents qui le contiennent | Calcul | Fréquence inverse |
|---|---|---|---|
| midi | 1 sur 4 | log10(4 / 1) | 0,602 |
| restaurant | 2 sur 4 | log10(4 / 2) | 0,301 |
| a | 3 sur 4 | log10(4 / 3) | 0,125 |
| un mot dans les 4 | 4 sur 4 | log10(4 / 4) | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer deux fréquences inverses
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 »
| Document | restaurant | midi | Score |
|---|---|---|---|
| 0 : le restaurant universitaire ouvre a midi | 1/6 × 0,301 = 0,05 | 1/6 × 0,602 = 0,10 | 0,15 |
| 1 : la bibliotheque universitaire ouvre a huit heures | 0 | 0 | 0 |
| 2 : le restaurant propose un menu a trois euros | 1/8 × 0,301 = 0,04 | 0 | 0,04 |
| 3 : la bibliotheque prete un livre pour trois semaines | 0 | 0 | 0 |
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
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 ?