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

Classification de texte : repérer un spam

Après cette leçon: Je peux classer un texte à partir de comptes de mots appris sur des exemples.

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

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

MotCe que ça veut direExemple
Classeune catégorie où l’on range un texteindésirable
Données d’entraînementdes textes dont la classe est déjà connue
Classifieurun programme qui choisit la classe d’un texte
Probabilité d’un motla chance de voir ce mot dans une classe
Lissageajouter 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

MotDans les 3 messages indésirablesDans les 3 messages normaux
cliquez30
ici20
gagnez20
le03
cours02
Total des mots de la classe1420

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

Commande
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 »

ClasseMot « cliquez »Mot « ici »Score (le produit)
Indésirable(3 + 1) / 38(2 + 1) / 3812 / 1 444 = 0,0083
Normale(0 + 1) / 44(0 + 1) / 441 / 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

Code: python
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 ?

À 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.