19

假设您可以访问一个电子邮件帐户,该帐户将过去几年收到的电子邮件(约 10k 封电子邮件)的历史分为 2 组

  • 真正的电子邮件
  • 垃圾邮件

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

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

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

  1. 选择哪些参数作为 NN 的输入,为什么?
  2. NN 的哪种结构最有可能最适合此类任务?

此外,任何资源建议或现有实现(最好在 C# 中)都非常受欢迎

谢谢

编辑

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

4 回答 4

24

如果你坚持使用神经网络......我会为每封电子邮件计算一些特征

基于字符、基于单词和词汇的功能(我数了一下,大约有 97 个):

  1. 字符总数 (C)
  2. alpha 字符总数 / C alpha 字符的比率
  3. 数字字符总数/ C
  4. 空白字符总数/C
  5. 每个字母的频率 / C(键盘的 36 个字母 - AZ,0-9)
  6. 特殊字符的频率(10 个字符:*、_、+、=、%、$、@、ـ、\、/)
  7. 总字数(M)
  8. 总短字数/M 两个字母或更少
  9. 总字数/C
  10. 平均字长
  11. 平均 以字符为单位的句子长度
  12. 平均 单词的句子长度
  13. 字长频率 distribution/M 长度为 n 的单词的比率,n 介于 1 和 15 之间
  14. Type Token Ratio No. Of unique Words/ M
  15. Hapax Legomena 频率。一次出现的词
  16. Hapax Dislegomena 频率。出现两次的词
  17. Yule 的 K 度量
  18. 辛普森 D 度量
  19. Sichel 的 S 度量
  20. Brunet 的 W 度量
  21. Honore 的 R 度量
  22. 标点符号的频率 18 个标点字符:. ; ; ? !: ( ) – “ « » < > [ ] { }

您还可以根据格式添加更多功能:颜色、字体、大小……使用。

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

因此,对于大约 100 个特征,您需要 100 个输入、隐藏层中的一些节点和一个输出节点。

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

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

于 2009-05-06T12:54:11.987 回答
8

你打算用神经网络来做吗?听起来您已经很好地使用了贝叶斯分类,这在 Paul Graham 的几篇文章中得到了很好的概述:

您可以访问的分类历史将使非常强大的语料库提供给贝叶斯算法,您最终可能会得到非常有效的结果。

于 2009-04-20T21:47:23.507 回答
2
  1. 你基本上会遇到一个与设计和训练神经网络类似的范围的特征提取问题。如果我是你,我将从哪里开始,以多种方式对输入文本进行切片和切块,每一种都是潜在的特征输入,类似于“如果出现‘价格’和‘伟哥’,这个神经元发出 1.0 信号彼此相距 3 个字以内”,并根据与垃圾邮件识别的最佳绝对相关性剔除那些。
  2. 我会从我最好的 50 到 200 个输入特征神经元开始,并将它们连接到单个输出神经元(针对 1.0 = 垃圾邮件,-1.0 = 非垃圾邮件训练的值),即单层感知器。如果效果不佳,我可能会尝试使用多层反向传播网络,但我不会屏住呼吸以获得出色的结果。

一般来说,我的经验使我相信神经网络在这项任务中最多只能表现出平庸的表现,如果这不是探索神经网络的玩具问题,我肯定会推荐一些贝叶斯算法,就像 Chad Birch 所建议的那样。

于 2009-04-20T22:06:43.430 回答
2

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

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

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

您可能最好了解一下 NN 实际做什么和不做什么,看看为什么它们对于这类分类问题不是一个特别好的主意。考虑它们的一种有用方法可能是作为通用函数逼近器。但是对于这一切如何在分类领域结合在一起的一些想法(这就是垃圾邮件过滤问题),浏览诸如模式分类之类的介绍文本可能会有所帮助。

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

于 2009-04-20T23:28:22.220 回答