XHTML.net

Technology talks by Loïc d’Anterroches

News, articles, PHP, scripts, XHTML/CSS, …

  1. Home
  2. Scripts

PHP Naive Bayesian Filter

The 2008-05-26 at 18:39 by Loïc d'Anterroches filed under PHP: Hypertext Preprocessor and Scripts.

Le sujet à la mode est le filtrage des commentaires, pingbacks ou autres trackbacks de votre site. Je ne joue pas trop avec cela, mais le principe d’un filtre reposant sur le théorème de Bayes m’intrigait trop pour résister à une implémentation en PHP.

Simple et efficace

Le théorème de Bayes est une simple relation entre des probabilités. Par exemple si vous avez un document et deux catégories spam et nonspam, il est difficile de connaître la probabilité que le document soit dans une catégorie ou une autre directement. Par contre, il est plus facile de le savoir en analysant chaque mot du document.

Pour la théorie, une petite recherche sur Google avec naive bayes theorem vous donnera de nombreuses références. Et si l’Anglais ne vous rebute pas, vous pouve lire Machine Learning in Automated Text Categorization par Fabrizio Sebastiani. Si vous préférez Perl à PHP, regardez les modules CPAN de Ken Williams comme Algorithm::NaiveBayes.

L’intérêt de l’algorithme naïf de Bayes est qu’il est rapide et globalement efficace. Vous pourrez par exemple l’utiliser dans la classification des commentaires sur votre site. Par exemple le filtre pour MT qui m’a motivé pour mettre tout ça en PHP.

Utilisation en pratique

Dans l’archive vous disposez d’un script qui vous permet d’entraîner votre base et de faire des essais. L’intérêt est plus d’une implémentation dans un système plus grand comme votre système de blog.

Tout d’abord utilise le fichier mysql.sql pour initialiser la base. Vous pouvez ensuite utiliser le script pour créer au moins deux catégories, par exemple spam et nonspam. Ensuite il vous faut entraîner un peu le filtre puis tester.

Les méthodes importantes

  1. train() : pour entraîner le filtre.
  2. untrain() : pour désentraîner le filtre.
  3. categorize() : pour classifier un document.
  4. updateProbabilities() : pour mettre à jour les probabilités dans la base, après une série de train() ou untrain().

L’utilisation de categorize() n’enregistre rien dans la base de données. Cela retourne uniquement le calcul des probabilités.

Téléchargement

Zip Archive PHP Naive Bayesian


Comments from readers

ludo said:

Idéal pour comprendre le concept de baesien

nmweb said:

My French is good enough to read and speak but not to write so I'll do this in English. I love your class, it works like a charm. The only problem is I have problems adapting it to my own database class, I'll fix it but it'll take time. Also, I think it's necessary to change the indexes of the tables to integers instead of words. This to make it faster, what do you think about this?

Loïc said:

I will need to rework this class and also provide it under the LGPL instead of the GPL, so I will take a look your ideas. Thanks!

Yannick said:

Salut !

juste pour info, il y a un bug dans ton script

remplace
return $this->con->execute("UPDATE nb_wordfreqs SET count += ".(int)$count."

par

return $this->con->execute("UPDATE nb_wordfreqs SET count = count + ".(int)$count."

je sais bien, c'est pas fou comme truc, mais du coup, ca marche mieux sur mon mysql 5 :)

Loïc said:

Encore une raison de plus pour que je "repackage" ce script et fasse du nettoyage. Je vais finir par prendre le temps de faire cela si ça continue :o)

Thomas Rudolf said:

Bonjour,

j'essaye depuis qq temps de remettre en oeuvre votre plugin Spamclear sous Dotclear.

Je l'avais pendant des mois et il fonctionnait bien.

En restructurant mon site je l'avais enlevé.

Dans l'installateur de plugin de Dotclear tout se passe bien. Le plugin est intégré dans mes Outils de mon site.

Mais c'est en cliquant dessus et qaund je lance la procédure d'installation, il indique des erreurs et qu'aucune base n'est installée. Je le confirme, elles ne sont pas dans mon sql.

Merci si vous avez le temps de me répondre. J'ai aussi Spamplemousse et BlocReferer.

Bien à vous

Thomas, Strasbourg

The comments are closed for this resource.


Logo of Plume CMS