function psplit($string){ return explode(' ', strtolower($string)); } // decoupage d'une chaine en array de mots
interface WordDb{ public function Count($word); } // words database
class FileWordDb implements WordDb{
public function __construct($filename){ $this->words = array_count_values(psplit(file_get_contents($filename))); }
public function Count($word){ return isset($this->words[$word])?$this->words[$word]:0; }
public function isInPart($word, $p){
$count = count($this->words);
$val = $this->Count($word);
$n = 0;
foreach ($this->words as $v) if ($v > $val)$n++;
return $n < $count * $p;
}
protected $words;
}
function is_spam($string, WordDb $spams, WordDb $ham){
$tab=psplit($string);
$P1=1; $Q1=1;
foreach ($tab as $w){
if ($ham->isInPart($w, 1/30) && $spams->isInPart($w, 1/30)) continue; // permet de supprimer les determinants et choses qui n'apportent rien
$H = $ham->Count($w); $S = $spams->Count($w);
$f=(0.5+$S)/(1+$S+$H);
$P1*=(1-$f); $Q1*=$f;
}
return (1-$P1)/(2-$P1-$Q1);
}
Remarque :
En copiant mes fichiers spams et mails de thunderbird, j'arrive a avoir des resultats satisfaisants pour les trois tests suivants :
echo is_spam( 'Bonjour un code en java a ete depose sur un forum codes-sources cliquez ici pour lire le nouveau message', new FileWordDb('bayesDb/spams'), new FileWordDb('bayesDb/informatique')), '';
echo is_spam( 'enlarge your penis', new FileWordDb('bayesDb/spams'), new FileWordDb('bayesDb/informatique')), '';
echo is_spam( 'enlarge your penis en codant en java', new FileWordDb('bayesDb/spams'), new FileWordDb('bayesDb/informatique')), '';
une valeur 0.5 incorrecte.
On peut s'en servir sur un forum pour eviter le spam, ou alerter les admins, ou faire des choses du genre.