4

我想用 SVM 编写一个垃圾邮件过滤程序,我选择 libsvm 作为工具。
我收到了 1000 封好邮件和 1000 封垃圾邮件,然后我将它们分类为:
700 份好邮件 700 份垃圾邮件
300 份好测试邮件 300 份垃圾测试邮件
然后我编写了一个程序来计算每个单词在每个文件中出现的时间,得到的结果如下:

good_train_1.txt:  
today 3  
hello 7  
help 5  
...    

我了解到 libsvm 需要如下格式:

1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9

作为其输入。我知道 1, 2, 1 是标签,但是 1:3 是什么意思?
我怎样才能将我拥有的东西转换成这种格式?

4

2 回答 2

4

可能的格式是

classLabel attribute1:count1 ... attributeN:countN

N 是文本语料库中不同单词的总数。您必须检查您正在使用的工具(或其来源)的文档,以查看是否可以通过不包含计数为 0 的属性来使用更稀疏的格式。

于 2011-05-30T10:03:10.213 回答
1
How could I transfer what I've got to this format?

这就是我将如何做到这一点。我将使用您必须计算训练集中每封邮件的字数的脚本。然后,使用另一个脚本并将该数据转换为您之前显示的 LIBSVM 格式。(这可以通过多种方式完成,但使用 Python 等简单的输入/输出语言编写应该是合理的)我会将所有“好邮件”数据批处理到一个文件中,并将该类标记为“1” . 然后,我将对“垃圾邮件”数据执行相同的过程,并将该类标记为“-1”。正如 nologin 所说,LIBSVM 要求类标签在特征之前,但特征本身可以是任意数字,只要它们是按升序排列的,例如 2:5 3:6 5:9 是允许的,但不是 3:23 1 :3 7:343。

如果您担心您的数据格式不正确,请使用他们的脚本

checkdata.py

在训练之前,它应该报告任何可能的错误。

一旦你有两个单独的文件,其中的数据格式正确,你可以调用

cat file_good file_spam > file_training

并生成一个包含好邮件和垃圾邮件数据的培训文件。然后,对测试集执行相同的过程。以这种方式形成数据的一个心理优势是,您知道训练(或测试)集中的前 700 封(或 300 封)邮件是好邮件,其余的是垃圾邮件。这样可以更轻松地创建您可能想要对数据执行操作的其他脚本,例如精确/召回代码。

如果您还有其他问题,http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html上的 FAQ应该可以回答一些问题,以及安装时附带的各种 README 文件. (我个人发现“工具”和“Python”目录中的 README 是一个很大的福音。)遗憾的是,FAQ 并没有涉及 nologin 所说的关于数据是稀疏格式的内容。

最后一点,我怀疑您是否需要计算邮件中可能出现的每个可能的单词。我建议只计算您怀疑出现在垃圾邮件中的最常见单词。其他潜在功能包括总字数、平均字长、平均句子长度以及您认为可能有用的其他可能数据。

于 2012-07-04T20:28:40.247 回答