<p class="spip">Bogofilter est un logiciel libre (sous GNU GPL) de détection de pourriel. Il reconnait un pourriel grâce à un modèle statistique reposant sur les mots utilisés. Il fonctionne par un mode d’apprentissage.</p>

<p class="spip">L’objet de ce texte n’est pas de mettre en place bogofilter, mais plutôt de tenter de comprendre comment il fonctionne.</p>

<p class="spip">Je considére que les bases de l’utilisation d’interprétateur de commande sont connus, "$" étant le prompt.</p>

<h3>Premier pas avec bogofilter</h3>
<p class="spip">Créons un fichier nommé "fauxmail" avec un texte quelconque :</p>

<pre>$ echo "test" > fauxmail</pre>
<p class="spip">Ensuite, nous allons demander à bogofilter de considérer le contenu de ce fichier (ici le mot "test") comme n’étant pas un pourriel (option -n) :</p>

<pre>$ bogofilter -n -v < fauxmail
Created directory /home/gnunux/.bogofilter .
# 1 word, 1 message</pre>
<p class="spip">Comme écrit, le répertoire caché ".bogofilter" est créé dans son répertoire personnel. A l’intérieur, il se trouve le fichier "wordlist.db". Ce fichier contient la liste des mots connus dans un pourriel (spam en anglais), un courriel (ham en anglais) et la date de la dernière apparition.</p>

<p class="spip">Ce fichier n’est pas lisible avec un éditeur de texte. Pour en connaître le contenu, il suffit de faire :</p>

<pre>$ bogoutil -d .bogofilter/wordlist.db
.ENCODING 2 0 20060815
.MSG_COUNT 1 0 20060815
.WORDLIST_VERSION 20040500 0 20060815
head:test 0 1 20060815</pre>
<p class="spip">Déclarons maintenant un pourriel (option -s) :</p>

<pre>$ echo "ceci n’est qu’un test" > fauxmail
$ bogofilter -s -v < fauxmail
# 4 word, 1 message</pre>
<pre>$ bogoutil -d .bogofilter/wordlist.db
.ENCODING 2 0 20060815
.MSG_COUNT 1 1 20060815
.WORDLIST_VERSION 20040500 0 20060815
head:ceci 1 0 20060815
head:n’est 1 0 20060815
head:qu’un 1 0 20060815
head:test 1 1 20060815</pre>
<p class="spip">Nous voyons ici que "ceci" a été trouvé une fois dans un pourriel et "test" a été trouvé dans un pourriel et dans un courriel.</p>

<h3>Détection de pourriel</h3>
<p class="spip">Testons la capacité de bogofilter de détecter un pourriel :</p>

<pre>$ bogofilter -v < fauxmail
X-Bogosity : Spam, tests=bogofilter, spamicity=0.999964, version=1.0.3</pre>
<p class="spip">Pour avoir plus de détail :</p>

<pre>$ bogofilter -vvv < fauxmail
X-Bogosity : Spam, tests=bogofilter, spamicity=0.999964, version=1.0.3
                                        n    pgood     pbad      fw     U
  "head:test"                           2  1.000000  1.000000  0.500176 -
  "head:ceci"                           1  0.000000  1.000000  0.991605 +
  "head:n’est"                          1  0.000000  1.000000  0.991605 +
  "head:qu’un"                          1  0.000000  1.000000  0.991605 +
  N_P_Q_S_s_x_md                        3  0.000070  0.999997  0.999964
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Seules les lignes finissant par "+" sont pris en compte.</p>

<p class="spip">Testons maintenant sur des mots inconnus :</p>

<pre>$ echo "et voila le résultat" > fauxmail
$ bogofilter -vvv < fauxmail
X-Bogosity : Unsure, tests=bogofilter, spamicity=0.520000, version=1.0.3
                                        n    pgood     pbad      fw     U
  "head:rÃ©sultat"                    0  0.000000  0.000000  0.520000 -
  "head:voila"                          0  0.000000  0.000000  0.520000 -
  N_P_Q_S_s_x_md                        0  0.000000  0.000000  0.520000
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Ajoutons ces mots en tant que courriel :</p>

<pre>$ bogofilter -n -v < fauxmail
# 2 words, 1 message</pre>
<p class="spip">Testons maintenant un phrase avec des mots de "pourriels" et des mots de "courriels" :</p>

<pre>$ echo "voila ce n’est qu’un résultat" > fauxmail
$ bogofilter -vvv < fauxmail
X-Bogosity : Unsure, tests=bogofilter, spamicity=0.500865, version=1.0.3
                                        n    pgood     pbad      fw     U
  "head:rÃ©sultat"                    1  0.500000  0.000000  0.009094 +
  "head:voila"                          1  0.500000  0.000000  0.009094 +
  "head:n’est"                          1  0.000000  1.000000  0.991605 +
  "head:qu’un"                          1  0.000000  1.000000  0.991605 +
  N_P_Q_S_s_x_md                        4  0.014041  0.015772  0.500865
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Nous voyons que bogofilter n’est pas capable de déterminer si le fichier est un pourriel (Unsure).</p>

<p class="spip">Ajoutons encore des mots en tant que pourriel :</p>

<pre>$ echo "il me faut plus de mot" > fauxmail
$ bogofilter -s -v < fauxmail
# 4 words, 1 message</pre>
<p class="spip">Ajoutons "pour le test" à la phrase précédente :</p>

<pre>$ echo "il me faut plus de mot pour le test" > fauxmail
$ bogofilter -vvv < fauxmail
X-Bogosity : Spam, tests=bogofilter, spamicity=0.999964, version=1.0.3
                                        n    pgood     pbad      fw     U
  "head:test"                           2  0.500000  0.500000  0.500176 -
  "head:pour"                           0  0.000000  0.000000  0.520000 -
  "head:faut"                           1  0.000000  0.500000  0.991605 +
  "head:mot"                            1  0.000000  0.500000  0.991605 +
  "head:plus"                           1  0.000000  0.500000  0.991605 +
  N_P_Q_S_s_x_md                        3  0.000070  0.999997  0.999964
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Le texte est bien vu comme pourriel ("spam").</p>

<h3>Test avec un courriel</h3>
<p class="spip">Voici un courriel minimaliste que nous allons enregistré dans le fichier "mail" :</p>

<pre>Date : Tue, 15 Aug 2006 15:14:52 +0200 (CEST)
Subject : test
From : gnunux@gnunux.net
To : pourriel@gnunux.net
Content-Type : text/plain ;charset=iso-8859-1
Content-Transfer-Encoding : 8bit
<p class="spip">il me faut plus de mot pour le test</p>
</pre>
<p class="spip">Demandons à bogofilter si le courriel est un pourriel ou non :</p>

<pre>$ bogofilter -vvv < mail
X-Bogosity : Unsure, tests=bogofilter, spamicity=0.520000, version=1.0.3
                                        n    pgood     pbad      fw     U
  "faut"                                0  0.000000  0.000000  0.520000 -
  "from:gnunux"                         0  0.000000  0.000000  0.520000 -
  "from:gnunux.net"                     0  0.000000  0.000000  0.520000 -
  "head:Content-Transfer-Encoding"       0  0.000000  0.000000  0.520000 -
  "head:Content-Type"                   0  0.000000  0.000000  0.520000 -
  "head:Date"                           0  0.000000  0.000000  0.520000 -
  "head:bit"                            0  0.000000  0.000000  0.520000 -
  "head:charset"                        0  0.000000  0.000000  0.520000 -
  "head:iso-8859-1"                     0  0.000000  0.000000  0.520000 -
  "head:plain"                          0  0.000000  0.000000  0.520000 -
  "head:text"                           0  0.000000  0.000000  0.520000 -
  "mot"                                 0  0.000000  0.000000  0.520000 -
  "plus"                                0  0.000000  0.000000  0.520000 -
  "pour"                                0  0.000000  0.000000  0.520000 -
  "subj:test"                           0  0.000000  0.000000  0.520000 -
  "test"                                0  0.000000  0.000000  0.520000 -
  "to:gnunux.net"                       0  0.000000  0.000000  0.520000 -
  "to:pourriel"                         0  0.000000  0.000000  0.520000 -
  N_P_Q_S_s_x_md                        0  0.000000  0.000000  0.520000
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Alors que la phrase seul est bien détecté comme pourriel, ici bogofilter n’a pas su le détecter comme tel. En effet il cherche "head:test" et non "test". Puisque nous n’avions pas de fichier ayant la forme d’un courriel, il a considéré que la liste de mot faisait parti de l’entete</p>

<p class="spip">Pour corriger ce problème, nous allons extraire la liste des mots dans le fichier "listedemot" :</p>

<pre>$ bogoutil -d .bogofilter/wordlist.db > listedemot</pre>
<p class="spip">Nous allons ensuite l’éditer pour supprimer tout les "head :" et reinitialisons la liste :</p>

<pre>$ rm .bogofilter/wordlist.db
$ bogoutil -l .bogofilter/wordlist.db < listedemot</pre>
<p class="spip">Ainsi, le courriel sera considéré comme pourriel :</p>

<pre>$ bogofilter -vvv < mail
X-Bogosity : Spam, tests=bogofilter, spamicity=0.999964, version=1.0.3
                                        n    pgood     pbad      fw     U
  "test"                                2  0.500000  0.500000  0.500176 -
  "from:gnunux"                         0  0.000000  0.000000  0.520000 -
  "from:gnunux.net"                     0  0.000000  0.000000  0.520000 -
  "head:Content-Transfer-Encoding"       0  0.000000  0.000000  0.520000 -
  "head:Content-Type"                   0  0.000000  0.000000  0.520000 -
  "head:Date"                           0  0.000000  0.000000  0.520000 -
  "head:bit"                            0  0.000000  0.000000  0.520000 -
  "head:charset"                        0  0.000000  0.000000  0.520000 -
  "head:iso-8859-1"                     0  0.000000  0.000000  0.520000 -
  "head:plain"                          0  0.000000  0.000000  0.520000 -
  "head:text"                           0  0.000000  0.000000  0.520000 -
  "pour"                                0  0.000000  0.000000  0.520000 -
  "subj:test"                           0  0.000000  0.000000  0.520000 -
  "to:gnunux.net"                       0  0.000000  0.000000  0.520000 -
  "to:pourriel"                         0  0.000000  0.000000  0.520000 -
  "faut"                                1  0.000000  0.500000  0.991605 +
  "mot"                                 1  0.000000  0.500000  0.991605 +
  "plus"                                1  0.000000  0.500000  0.991605 +
  N_P_Q_S_s_x_md                        3  0.000070  0.999997  0.999964
                                           0.017800  0.520000  0.375000</pre>
<p class="spip">Nous voyons ici que bogofilter fait la différence entre l’entête, le sujet, le destinataire, l’emeteur, le corps, ... dans le calcul de la probabilité.</p>