如何使用 libsvm 进行文本分类?
Posted
技术标签:
【中文标题】如何使用 libsvm 进行文本分类?【英文标题】:How to use libsvm for text classification? 【发布时间】:2011-09-04 13:20:19 【问题描述】:我想用 SVM 编写一个垃圾邮件过滤程序,我选择 libsvm 作为工具。 我收到了 1000 封好邮件和 1000 封垃圾邮件,然后我将它们分类为: 700 封 good_train 邮件 700 封 spam_train 邮件 300 封 good_test 邮件 300 封 spam_test 邮件 然后我写了一个程序来计算每个文件中每个单词出现的时间,得到的结果如下:
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 是什么意思呢? 我怎样才能将我拥有的东西转换成这种格式?
【问题讨论】:
【参考方案1】:格式可能是
classLabel attribute1:count1 ... attributeN:countN
N 是文本语料库中不同单词的总数。您必须检查您正在使用的工具(或其来源)的文档,以查看是否可以通过不包含计数为 0 的属性来使用更稀疏的格式。
【讨论】:
【参考方案2】: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 的常见问题解答应该能够回答一些问题,以及安装随附的各种 README 文件。 (我个人发现“工具”和“Python”目录中的 README 是一个很大的福音。)遗憾的是,FAQ 并没有涉及 nologin 所说的关于数据是稀疏格式的内容。
最后一点,我怀疑您是否需要记录邮件中可能出现的每一个单词。我建议只计算您怀疑出现在垃圾邮件中的最常见单词。其他潜在功能包括总字数、平均字长、平均句子长度以及您认为可能有用的其他可能数据。
【讨论】:
以上是关于如何使用 libsvm 进行文本分类?的主要内容,如果未能解决你的问题,请参考以下文章