php贝叶斯,php – 将单个概率与朴素贝叶斯垃圾邮件过滤相结合

我正在尝试通过分析我已经积累的语料库来生成垃圾邮件过滤器。

我已经实现了代码来计算消息是垃圾邮件的概率,因为它包含一个特定的单词,通过从wiki实现以下公式:

我的PHP代码

public function pSpaminess($word)

{

$ps = $this->pContentIsSpam();

$ph = $this->pContentIsHam();

$pws = $this->pWordInSpam($word);

$pwh = $this->pWordInHam($word);

$psw = ($pws * $ps) / ($pws * $ps + $pwh * $ph);

return $psw;

}

根据“组合个人概率”部分,我已经实现了代码来组合测试消息中所有唯一字词的概率来确定垃圾邮件。

从维基公式:

我的PHP代码:

public function predict($content)

{

$words = $this->tokenize($content);

$pProducts = 1;

$pSums = 1;

foreach($words as $word)

{

$p = $this->pSpaminess($word);

echo "$word: $p\n";

$pProducts *= $p;

$pSums *= (1 - $p);

}

return $pProducts / ($pProducts + $pSums);

}

在测试字符串“这根本不是很糟糕”,产生以下输出:

C:\projects\bayes>php test.php

this: 0.19907407407407

isn't: 0.23

very: 0.2

bad: 0.2906976744186

at: 0.17427385892116

all: 0.16098484848485

probability message is spam: float(0.00030795502523944)

这是我的问题:我是否正确实施个人概率?假设我正在生成有效的单词概率,组合方法是否正确?

我关心的是计算结果的可能性很小。我已经测试了一个更大的测试消息,最终导致了科学计数的概率超过10个零位。我期待在10或100位的价值观。

我希望问题在于我的PHP实现 – 但是当我从维基百科中检查组合函数时,公式的分红是分数的乘积。我看不出多个概率的组合最终会超过0.1%的概率。

如果是这种情况,那么信息越长,概率分数越低,如何补偿垃圾邮件配额来正确预测垃圾邮件/火腿的小型和大型测试用例?

附加信息

我的语料库实际上是一个约40k的评论的集合。我实际上是应用我的“垃圾邮件过滤器”反对这些评论。根据投票数量,我将个人评论评为垃圾邮件/火腿:如果投票少于投票数,则被认为是Ham,否则为垃圾邮件。

现在,由于语料库的类型,事实证明,垃圾邮件中使用的词几乎比火腿更多。也就是说,这里列出了垃圾邮件的十大列表,比火腿更频繁。

+-----------+------------+-----------+

| word | spam_count | ham_count |

+-----------+------------+-----------+

| krugman | 30 | 27 |

| fetus | 12.5 | 7.5 |

| boehner | 12 | 10 |

| hatred | 11.5 | 5.5 |

| scum | 11 | 10 |

| reserve | 11 | 10 |

| incapable | 8.5 | 6.5 |

| socalled | 8.5 | 5.5 |

| jones | 8.5 | 7.5 |

| orgasms | 8.5 | 7.5 |

+-----------+------------+-----------+

相反,大多数词在火腿上比火腿更丰富。举个例子,我排名前10位的垃圾邮件数最多的单词列表。

+------+------------+-----------+

| word | spam_count | ham_count |

+------+------------+-----------+

| the | 4884 | 17982 |

| to | 4006.5 | 14658.5 |

| a | 3770.5 | 14057.5 |

| of | 3250.5 | 12102.5 |

| and | 3130 | 11709 |

| is | 3102.5 | 11032.5 |

| i | 2987.5 | 10565.5 |

| that | 2953.5 | 10725.5 |

| it | 2633 | 9639 |

| in | 2593.5 | 9780.5 |

+------+------------+-----------+

如您所见,垃圾邮件使用频率明显低于火腿使用量。在我的40k评论的语料库中,2100评论被认为是垃圾邮件。

如下所述,对垃圾邮件发布率的测试短语如下:

短语

Cops are losers in general. That's why they're cops.

分析:

C:\projects\bayes>php test.php

cops: 0.15833333333333

are: 0.2218958611482

losers: 0.44444444444444

in: 0.20959269435914

general: 0.19565217391304

that's: 0.22080730418068

why: 0.24539170506912

they're: 0.19264544456641

float(6.0865969793861E-5)

据此,垃圾邮件的概率极低。但是,如果我现在分析一个火腿评论:

短语

Bill and TED's excellent venture?

分析

C:\projects\bayes>php test.php

bill: 0.19534050179211

and: 0.21093065570456

ted's: 1

excellent: 0.16091954022989

venture: 0.30434782608696

float(1)

好的,这很有趣我正在做这些例子,因为我正在撰写这个更新,所以这是我第一次看到这个具体测试用例的结果。我认为我的预测是倒转的。它实际上挑选了火腿的可能性,而不是垃圾邮件。这值得验证。

对已知火腿的新测试。

短语

Complain about $174,000 salary being too little for self. Complain about $50,000 a year too much for teachers.

Scumbag congressman.

分析

C:\projects\bayes>php test.php

complain: 0.19736842105263

about: 0.21896031561847

174: 0.044117647058824

000: 0.19665809768638

salary: 0.20786516853933

being: 0.22011494252874

too: 0.21003236245955

little: 0.21134020618557

for: 0.20980452359022

self: 0.21052631578947

50: 0.19245283018868

a: 0.21149315683195

year: 0.21035386631717

much: 0.20139771283355

teachers: 0.21969696969697

scumbag: 0.22727272727273

congressman: 0.27678571428571

float(3.9604152477223E-11)

很不幸的是,不行。原来是巧合的结果。我开始怀疑是否也许不能轻易量化评论。或许垃圾邮件的性质与垃圾邮件的性质截然不同。

也许垃圾邮件过滤只有在您有特定的单词类垃圾邮件时才可行?

最终更新

正如答复所指出的,奇怪的结果是由于语料库的性质。使用没有明确定义垃圾信息的评论语料库贝叶斯分类不能执行。由于可能(可能)任何一个评论可能会收到各种用户的垃圾邮件和火腿评级,所以不可能为垃圾评论生成硬分类。

最终,我想生成一个评论分类器,可以确定评论文章是否会根据贝叶斯分类进行评估,以便评论内容。我仍然可以调查分类器的电子邮件垃圾邮件,看看这样的分类器是否可以猜测评论系统的业务响应。但是现在的问题得到回答。感谢大家的投入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值