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

19

假设你可以访问一个带有过去几年(约1万封电子邮件)接收邮件历史记录的电子邮件账户,并将其分类为以下两组:

  • 真实电子邮件
  • 垃圾邮件

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

假设已经有了获取电子邮件的功能,我们仅需关注分类部分。

我希望能得到解答的主要问题是:

  1. 选择哪些参数作为神经网络的输入,以及为什么选择这些参数?
  2. 对于这样的任务,哪种神经网络结构最有可能工作最佳?

同时,任何资源推荐或现有实现(最好是使用C#编写的实现)都会受到欢迎。

谢谢

编辑

  • 我决定使用神经网络,因为该项目的主要方面是测试神经网络方法在垃圾邮件检测方面的效果。
  • 此外,这是一个“玩具问题”,只是为了探索神经网络和垃圾邮件的主题。
4个回答

24
如果您坚持使用神经网络...我将为每封电子邮件计算一些特征。
包括基于字符、基于词语和词汇的特征(大约有97个),例如:
  1. 总字符数 (C)
  2. 字母字符总数/C 字母字符比率
  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 只出现过一次的单词的频率
  16. Hapax Dislegomena 出现两次的单词的频率
  17. Yule's K度量
  18. Simpson's D度量
  19. Sichel's S度量
  20. Brunet's W度量
  21. Honore's R度量
  22. 标点符号的频率 18个标点符号:。،;?!:() - “ «»<>[]{}
您还可以根据电子邮件的格式添加一些基于样式、字体、大小等的特征。
大多数这些特征都可以在网上、论文中甚至维基百科中找到(它们都是简单的计算,可能基于其他特征)。
因此,使用约100个特征,您需要100个输入,一个或多个隐藏层中的节点数以及一个输出节点。

输入需要根据您当前的预分类语料库进行规范化处理。

我会将其拆分为两组,一个作为训练组,另一个作为测试组,永不混合。也许以相似的垃圾邮件/非垃圾邮件比率的50/50比率进行。


8

你是否决定使用神经网络进行操作?看起来你已经很适合使用贝叶斯分类,Paul Graham在几篇文章中对此进行了详细阐述:

你可以利用所拥有的分类历史记录作为强有力的语料库来提供给贝叶斯算法,这样你可能会得到相当有效的结果。


谢谢Chad,是的,我决定使用神经网络来完成这个任务,这是一个要求,并且这样做是为了测试神经网络方法在这种情况下是否可行。 - kristof

2
  1. 您将面临一个完整的问题,与设计和训练神经网络类似,需要进行特征提取。如果我是您,我会从对输入文本进行大量切片和分割开始,每个分割都是潜在的特征输入,例如“如果'价格'和'Viagra'在彼此之间的3个单词内出现,则该神经元信号为1.0”,然后根据与垃圾邮件识别的最佳绝对相关性进行筛选。
  2. 我会从最好的50到200个输入特征神经元开始,并将它们连接到一个单输出神经元(值为1.0表示垃圾邮件,-1.0表示非垃圾邮件),即单层感知器。如果效果不佳,我可能会尝试多层反向传播网络,但不会对结果抱有太高期望。

总的来说,我的经验告诉我神经网络在这个任务中的表现一般,如果这不是用于探索神经网络的玩具问题,我强烈建议像Chad Birch建议的那样使用贝叶斯方法。


谢谢Chaos,说得好。我也认为特征提取与NN本身的问题复杂度相似。是的,这确实是一个探索神经网络的玩具问题。 - kristof

2
Chad,你目前收到的回答是合理的,但我会回应你的更新内容:“我决定使用神经网络作为主要方面,因为该项目的主要目标是测试NN方法在垃圾邮件检测方面的效果。”
那么,你有一个问题:这样的实证测试无法证明不适用性。
你最好学习一些关于神经网络实际上可以做什么和不能做什么的知识,看看为什么它们对于这种分类问题并不是一个特别好的想法。可能一个有帮助的思考方式是将它们视为通用函数逼近器。但是,如果你想了解如何将所有这些组合在分类领域中(这就是垃圾邮件过滤问题所在的领域),可以浏览像pattern classification这样的介绍性文本。
如果你坚决要让它运行,那么可以使用任何一般的神经网络库来实现网络本身。大部分问题在于如何表示输入数据。最好的结构并不明显,而且可能并不太重要。输入将是对语料库本身的多个(标准化的)测量(特征)。有些很明显(如“垃圾邮件”单词的数量等),有些则不那么明显。这是你可以真正尝试的部分,但由于问题的性质,你应该预计与贝叶斯过滤器相比表现较差(后者在这里也有自己的问题)。

谢谢Simon,当我听到这个想法时,我首先想到的是:输入可以使用什么参数。你也是对的,这种测试不能真正证明不适用性。我应该补充一下,这只是一个练习,是为了让那些在人工智能领域相对较新的人玩转神经网络和垃圾邮件检测问题 - 我会更新我的问题以更好地解释这个问题 :) - kristof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接