我想用SVM编写一个垃圾邮件过滤程序,我选择libsvm作为工具。
我收到了1000封好邮件和1000封垃圾邮件,然后我把它们分类为:
700封good_train邮件700封spam_train邮件
300封good_test邮件300封spam_test邮件
然后我编写了一个程序来计算每个文件中每个单词出现的时间,得到的结果如下:
good_train_1.txt:今天3你好7帮助5.
我了解到libsvm需要如下格式:
1:3 2:1 3:0
2:3 2:3 3:1
1:7 3:9
作为它的投入。我知道1,2,1是标签,但1:3意味着什么?
我怎么才能把我的东西转换成这种格式呢?
发布于 2011-05-30 10:03:10
很可能,格式是
classLabel attribute1:count1 ... attributeN:countNN是你的文本语料库中不同单词的总数。您必须检查您正在使用的工具(或其源代码)的文档,以查看是否可以通过不包括计数为0的属性来使用稀疏格式。
发布于 2012-07-04 20:28:40
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应该能够回答一些问题,以及安装时附带的各种自述文件。(我个人认为"Tools“和"Python”目录中的README是一个很大的好处。)令人遗憾的是,FAQ并没有过多地触及nologin所说的数据是稀疏格式的内容。
最后,我怀疑您是否需要对邮件中可能出现的每一个可能的单词进行计数。我建议只计算你怀疑在垃圾邮件中出现的最常见的单词。其他潜在的特征包括总字数,平均字数,平均句子长度,以及其他你认为可能有帮助的数据。
https://stackoverflow.com/questions/6172159
复制相似问题