Utiliser Bayes pour développer un filtre anti-spam La formule de Bayes

En révisant mes cours de probabilités, je me suis dit qu'un bon petit exercice pour une application concrète à l'informatique pourrait être de réaliser un filtre anti-spam utilisant une méthode désormais courante : le filtre de Bayes (dans une version naïve). Je vais essayer d'expliquer la théorie.


La formule de Bayes

La formule de Bayes (de Thomas Bayes, qui l'a trouvée) se base sur la notion de probabilité conditionnelle, c'est-à-dire, la probabilité qu'un évènement se produise sachant qu'un autre s'est produit. Nous allons nous intéresser à un cas particulier de cette formule, vous pouvez vous intéresser aux détails sur l'article Théorème de Bayes de Wikipedia.

Considérons l'ensemble des messages que l'on peut les répartir en deux catégories : les spams et les hams (non-spams). L'un est le complément de l'autre, c'est-à-dire que tout message est dans l'une et une seule des deux catégories.

Considérons ensuite l'évènement "le message contient le mot foo".

Nous cherchons à déterminer la probabilité que le message soit un spam, sachant qu'il contient le mot foo (on notera cette probabilité Ps). Pour pouvoir écrire la formule facilement on notera ainsi :

 p(foo/spam), la probabilité que dans un message on trouve le mot "foo" sachant que c'est un spam,
 p(spam), la probabilité qu'un message soit un spam,
 p(foo/ham), la probabilité que l'on trouve le mot "foo" dans un ham,
 p(ham), la probabilité qu'un message ne soit pas un spam.

On a alors :

formule
Formule © Martius / Creative Commons

Nous obtenons donc une sorte de "valeur potentielle d'un mot comme spam", mais notre filtre ne peut pas se baser sur l'analyse d'un seul mot. Il faut donc effectuer ce calcul sur chaque mot d'un message et évaluer le "potentiel de spam" de ce message.

En réalité, on va exclure les mots "neutres" dont la probabilité calculée avoisine les 0.5, c'est-à-dire qu'il y a presque autant de chance que ce mot soit contenu dans un spam que dans un ham. On s'intéressera en fait à une liste restreinte de mots, ceux dont la probabilité est proche de 0 (n'est presque jamais dans un spam) ou de 1 (presque toujours dans un spam).

Pour calculer le potentiel de spam, nous allons considérer (naïvement) que les mots sont indépendants dans un message, ce qui est naturellement faux, puisque les mots constituent des phrases et sont liés les uns aux autres. On utilisera la formule suivante :

formule 2.
Formule 2. © Martius Creative Commons

On a au numérateur le produit des probabilités qu'un mot du message soit dans un spam (d'après les calculs précédents).

Au dénominateur, on a ce même produit additionné au produit des probabilités contraires (la probabilité que le mot ne soit pas dans un spam).

Si un mot est présent plusieurs fois dans le message analysé, on peut inclure sa valeur plusieurs fois dans la formule, pour la rendre plus juste.

Contenu réalisé par Martin Richard (Martius Web) sous licence Creative Commons.