Comment un filtre repère-t-il un spam ?
La classification de texte range un message dans une catégorie, par exemple « indésirable » ou « normal ». Un filtre antispam fait cela en comptant les mots vus dans des messages déjà classés, puis en regardant quels mots reviennent dans le nouveau.
La messagerie de l’université reçoit des milliers de courriels par jour. Aucun humain ne peut tous les lire : un programme doit les classer.
À la fin de cette leçon
Remarque
Je peux classer un texte à partir de comptes de mots appris sur des exemples.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Classe | une catégorie où l’on range un texte | indésirable |
| Données d’entraînement | des textes dont la classe est déjà connue | |
| Classifieur | un programme qui choisit la classe d’un texte | |
| Probabilité d’un mot | la chance de voir ce mot dans une classe | |
| Lissage | ajouter 1 à chaque compte pour éviter un zéro |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un classifieur apprend à partir d’exemples classés
Un classifieur choisit la classe d’un texte. Il ne suit pas des règles écrites à la main : il apprend sur des données d’entraînement, des messages dont la classe est connue.
Ici, on compte les mots de chaque classe. Un message neuf reçoit la classe dont les mots ressemblent le plus aux siens.
Six messages d’entraînement
Voici six messages déjà classés. Indésirables : « gagnez 500 euros cliquez ici », « cliquez ici gagnez un cadeau » et « offre gratuite cliquez maintenant ».
Normaux : « le cours de maths est à 10 h », « rendez le projet avant 18 h » et « le cours est reporté à demain ». Les trois premiers comptent 14 mots, les trois autres 20.
Exemple travaillé : les comptes de six messages
| Mot | Dans les 3 messages indésirables | Dans les 3 messages normaux |
|---|---|---|
| cliquez | 3 | 0 |
| ici | 2 | 0 |
| gagnez | 2 | 0 |
| le | 0 | 3 |
| cours | 0 | 2 |
| Total des mots de la classe | 14 | 20 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une probabilité est un compte sur un total
Dans la classe indésirable, « cliquez » apparaît 3 fois sur 14 mots. Mais un mot jamais vu dans une classe aurait un compte nul, et un zéro annulerait tout le calcul.
Le lissage ajoute 1 à chaque compte. La probabilité devient (compte + 1) divisé par (total de la classe + nombre de mots différents du vocabulaire). Ici, le vocabulaire compte 24 mots.
Calculer deux probabilités de mot
docker exec jupyter python3 -c 'print(round(4 / 38, 3), round(1 / 44, 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.
Exemple travaillé : le message « cliquez ici »
| Classe | Mot « cliquez » | Mot « ici » | Score (le produit) |
|---|---|---|---|
| Indésirable | (3 + 1) / 38 | (2 + 1) / 38 | 12 / 1 444 = 0,0083 |
| Normale | (0 + 1) / 44 | (0 + 1) / 44 | 1 / 1 936 = 0,0005 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu’un mot jamais vu dans une classe rend cette classe impossible. Sans lissage, un seul compte nul met tout le produit à zéro. Avec le lissage, un mot inconnu pèse un peu et ne décide pas seul.
Calculer le score de chaque classe
indesirable = {"cliquez": 3, "ici": 2, "gagnez": 2}
normal = {"le": 3, "cours": 2}
total_indesirable = 14
total_normal = 20
taille = 24
message = ["cliquez", "ici"]
score_indesirable = 1
score_normal = 1
for mot in message:
compte_i = 0
if mot in indesirable:
compte_i = indesirable[mot]
compte_n = 0
if mot in normal:
compte_n = normal[mot]
score_indesirable = score_indesirable * (compte_i + 1) / (total_indesirable + taille)
score_normal = score_normal * (compte_n + 1) / (total_normal + taille)
print(round(score_indesirable, 5), round(score_normal, 5))
# Changez le message en ["le", "cours"], puis relancez.
Pour aller plus loin
Dans un carnet de JupyterLab, entraînez votre classifieur sur dix messages de chaque classe que vous écrivez vous-même. Testez-le sur cinq messages neufs.
Où se trompe-t-il ? Ajoutez dix messages normaux de plus : les erreurs changent-elles ? Que se passe-t-il si une classe a beaucoup plus d’exemples que l’autre ?