根据贝叶斯推断及其互联网应用(二):过滤垃圾邮件实现:
首先收集垃圾邮件和正常邮件,分词后计算每个词分别出现的频率,比如计算垃圾邮件库每个词的频率:
//分词略过
foreach ($words as $word) {
$key = base64_encode($word);
if (isset($spamwords[$key])) {
$spamwords[$key]++;
} else {
$spamwords[$key] = 1;
}
}
单个词判断垃圾邮件概率:
//先验概率为50%
$ps = 0.5;
$ph = 0.5;
//在正常邮件中的出现频率,比如4000封正常邮件2封包含这个词。
$pwh = 0.0005;
//在垃圾邮件中的出现频率
$pws = 0.05;
//垃圾邮件概率
$psw = $pws * $ps / ($pws * $ps + $pwh * $ph);
echo $psw;
多个词计算联合概率:
//根据上面计算的多个词的概率集合
$psws = array(0.2, 0.3, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9, 0.8);
$numerator = 1;
$denominator1 = 1;
$denominator2 = 1;
foreach ($psws as $value) {
$numerator *= $value;
$denominator1 *= $value;
$denominator2 *= 1 - $value;
}
echo $numerator / ($denominator1 + $denominator2);