用于垃圾邮件检测的神经网络

时间:2009-04-20 21:44:02

标签: machine-learning neural-network classification spam-prevention

假设您可以访问一个电子邮件帐户,其中包含过去几年收到的电子邮件的历史记录(~10k封电子邮件),分为2组

  • 正版电子邮件
  • 垃圾邮件

您如何处理创建可用于垃圾邮件检测的神经网络解决方案的任务 - 基本上将任何电子邮件分类为垃圾邮件或非垃圾邮件?

我们假设电子邮件提取已经到位,我们只需关注分类部分。

我希望得到回答的要点是:

  1. 选择哪些参数作为NN的输入,为什么?
  2. NN的哪种结构最有可能最适合此类任务?
  3. 此外,任何资源推荐或现有实施(最好是在C#中)都非常受欢迎

    谢谢

    修改

    • 我开始使用神经网络,因为该项目的主要方面是测试NN方法如何用于垃圾邮件检测
    • 仅仅是探索神经网络和垃圾邮件主题是一个“玩具问题”

4 个答案:

答案 0 :(得分:24)

如果你坚持使用NN ......我会为每封电子邮件计算一些功能

基于角色,基于单词和词汇的功能(我估计这些约为97):

  1. 字符总数(C)
  2. alpha chars的总数/ C alpha alpha的比率
  3. 数字字符总数/ C
  4. 空白字符总数/ C
  5. 每个字母/ C的频率(键盘的36个字母 - A-Z,0-9)
  6. 特殊字符的频率(10个字符:*,_,+,=,%,$,@ ,, \,/)
  7. 总词数(M)
  8. 短字总数/ M两个字母或更少
  9. 字数/ C中的字符总数
  10. 平均字长
  11. 平均。字数中的句子长度
  12. 平均。句子长度
  13. 字长度频率分布/ M长度为n的单词的比率,n在1和15之间
  14. 类型令牌比率唯一字数/ M
  15. Hapax Legomena Freq。曾经发生过的话
  16. Hapax Dislegomena Freq。两次出现的话
  17. Yule的K测量
  18. 辛普森的D测量
  19. Sichel的S测量
  20. Brunet的W测量
  21. Honore的R测量
  22. 标点符号的频率18个标点符号:。 ,; ? ! :() - “«»< > [] {}
  23. 您还可以根据格式添加更多功能:颜色,字体,尺寸,......使用。

    这些措施大多可以在网上,论文中找到,甚至可以在维基百科上找到(它们都是简单的计算,可能基于其他功能)。

    因此,使用大约100个功能,您需要100个输入,隐藏层中的一些节点数和一个输出节点。

    输入需要根据您当前预先分类的语料库进行标准化。

    我将它分成两组,一组作为训练组,另一组作为测试组,从不混合它们。也许是50/50比率的列车/测试组具有相似的垃圾邮件/非垃圾邮件比率。

答案 1 :(得分:8)

您是否已开始使用神经网络进行此操作?这听起来好像你使用Bayesian classification很好,这在Paul Graham的几篇文章中有很好的概述:

您可以访问的分类历史记录会使用非常强大的语料库来提供贝叶斯算法,您最终可能会获得相当有效的结果。

答案 2 :(得分:2)

  1. 你基本上会遇到一个与设计和训练神经网络相似的特征提取问题。在我开始的地方,如果我是你,正在以多种方式切割和切割输入文本,每一个都是一个潜在的特征输入,沿着“这个神经元信号1.0,如果'价格'和'伟哥'发生在彼此的3个字之内“,并根据与垃圾邮件识别的最佳绝对相关性来剔除那些。
  2. 我首先采用我最好的50到200个输入特征神经元并将它们连接到单个输出神经元(训练值为1.0 =垃圾邮件,-1.0 =非垃圾邮件),即单层感知器。如果效果很差,我可能会尝试使用多层反向传播网,但不会屏住呼吸以获得很好的效果。
  3. 一般来说,我的经验让我相信神经网络在这项任务中会表现出最好的表现,而且我肯定会推荐一些贝叶斯,正如Chad Birch建议的那样,如果这不是探索神经的玩具问题。网。

答案 3 :(得分:2)

Chad,你到目前为止得到的答案是合理的,但我会回复你的更新:

  

我开始使用神经网络,因为该项目的主要方面是测试NN方法如何用于垃圾邮件检测。

那么,你有一个问题:像这样的经验测试不能证明不合适。

你可能最好不要了解NN实际上做什么和不做什么,看看为什么他们对这种分类问题不是特别好。考虑它们的可能有用的方法是作为通用函数逼近器。但是对于在分类领域(这就是垃圾邮件过滤问题)中如何将它们组合在一起的一些想法,浏览像pattern classification这样的介绍文本可能会有所帮助。

如果你在看到它运行时已经死定,那么就失败了,只需使用任何通用的NN库来实现网络本身。您的大部分问题都是如何表示输入数据。 “最佳”结构是不明显的,它可能并不重要。输入必须是语料库本身的许多(标准化)测量(特征)。有些是显而易见的(“垃圾邮件”字样等),有些则更为明显。这是你可以真正使用的部分,但是由于问题的本质,你应该期望与贝叶斯过滤器(这里有自己的问题)相比做得不好。