Comment transformer un texte en nombres ?
Compter les mots d’un texte est la façon la plus simple de le transformer en nombres. On parle d’un sac de mots, en anglais « bag of words ». Cette méthode sert à comparer des textes, à les trier et à repérer ce dont ils parlent.
Mais compter ne suffit pas : le mot « le » arrive partout. Le TF-IDF donne plus de poids aux mots qui distinguent un texte des autres.
À la fin de cette leçon
Remarque
Je peux compter les mots d’un texte et donner plus de poids aux mots rares.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Sac de mots | les comptes de chaque mot, sans l’ordre | |
| Fréquence d’un mot | sa part parmi les mots du texte | 2 sur 6 |
| Fréquence de document | le nombre de textes qui contiennent ce mot | |
| Rareté | le nombre de textes divisé par la fréquence de document | |
| Poids TF-IDF | la fréquence multipliée par la rareté |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un sac de mots oublie l’ordre des mots
Pour faire un sac de mots, on compte combien de fois chaque mot apparaît. Ces comptes sont des nombres : un programme peut les additionner et les comparer.
On perd l’ordre des mots. Deux phrases de sens opposé peuvent donc avoir exactement le même sac.
Exemple travaillé : deux phrases, un seul sac
| Phrase | le | chien | mord | facteur |
|---|---|---|---|---|
| Le chien mord le facteur | 2 | 1 | 1 | 1 |
| Le facteur mord le chien | 2 | 1 | 1 | 1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Compter les mots avec un dictionnaire
texte = "le chat voit le chien et le chien voit le chat"
comptes = {}
for mot in texte.split():
if mot in comptes:
comptes[mot] = comptes[mot] + 1
else:
comptes[mot] = 1
print(comptes)
# Quel mot arrive en tête ? Ajoutez une phrase au texte, puis relancez.
La fréquence dépend de la longueur du texte
Un texte de 100 mots contient plus de « le » qu’un texte de 10 mots. Pour comparer, on divise le compte par le nombre de mots du texte.
C’est la fréquence d’un mot, en anglais « term frequency » ou TF. Si « le » apparaît 2 fois dans un texte de 6 mots, sa fréquence est 2 sur 6.
Compter avec l’outil de la bibliothèque standard
docker exec jupyter python3 -c 'print(__import__("collections").Counter("le chat voit le chat noir".split()))'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.
Un mot présent partout ne distingue rien
Prenons trois messages : « le café est ouvert le matin », « le café est fermé le soir » et « le stage est ouvert aux étudiants ». Le mot « le » figure dans les trois et ne distingue rien. Le mot « matin » figure dans un seul message.
La fréquence de document est le nombre de textes qui contiennent le mot. La rareté divise le nombre de textes par ce nombre. Les outils réels ajoutent souvent un logarithme. Ici, on garde la division.
Exemple travaillé : les poids du premier message
| Mot | Compte | Fréquence | Textes qui l’ont | Rareté | Poids |
|---|---|---|---|---|---|
| le | 2 | 2 sur 6 | 3 sur 3 | 3 / 3 = 1 | 0,33 |
| café | 1 | 1 sur 6 | 2 sur 3 | 3 / 2 = 1,5 | 0,25 |
| est | 1 | 1 sur 6 | 3 sur 3 | 3 / 3 = 1 | 0,17 |
| matin | 1 | 1 sur 6 | 1 sur 3 | 3 / 1 = 3 | 0,50 |
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 est le plus important. Ici, « le » arrive en tête des comptes, mais « matin » pèse davantage. Un mot fréquent partout ne distingue pas un texte : regardez son poids, pas son seul compte.
Calculer deux poids à la main
docker exec jupyter python3 -c 'print(round(1 / 6 * 3 / 1, 2), round(2 / 6 * 3 / 3, 2))'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.
Pour aller plus loin
Dans un carnet de JupyterLab, prenez dix messages de votre choix et calculez le mot clé de chacun avec vos fonctions du devoir.
Les mots clés décrivent-ils bien chaque message ? Retirez les mots vides et comparez les résultats.