2013-06-18 119 views
1

我正在尝试使用WEKA库制作SMS SPAM分类器。我有一个带有“标签”和“文本”标题的CSV文件。当我使用下面的代码,它创建了一个ARFF文件有两个属性:如何将属性类型更改为字符串(WEKA - CSV到ARFF)

@attribute label {ham,spam} 
@attribute text {'Go until jurong point','Ok lar...', etc.} 

目前,似乎文本属性格式化为一个值,每封邮件的文本标称属性。但是我需要text属性是一个String属性,而不是所有实例中所有文本的列表。将text属性作为String将允许我使用StringToWordVector过滤器来训练分类器。

// load CSV 
CSVLoader loader = new CSVLoader(); 
loader.setSource(new File(args[0])); 
Instances data = loader.getDataSet(); 

// save ARFF 
ArffSaver saver = new ArffSaver(); 
saver.setInstances(data); 
saver.setFile(new File(args[1])); 
saver.setDestination(new File(args[1])); 
saver.writeBatch(); 

我知道我可以这样创建一个字符串属性:

Attribute tmp = new Attribute("tmp", (FastVector) null); 

但我不知道如何来取代目前的属性,或CSV阅读之前设置的属性类型。

我试着插入一个新的字符串属性并删除当前的名义属性,但是这会删除所有的SMS文本。我也尝试使用renameAttributeValue,但这似乎不适用于更改属性类型。

编辑: 我怀疑这NominalToString filter将做的工作,但我不知道如何使用它。

任何建议将不胜感激。谢谢!

回答

8

这没有把戏。它改变了文本属性类型,但不是标签属性类型(尽管我不确定它为什么做了一个而不是另一个)。

NominalToString filter1 = new NominalToString(); 
filter1.setInputFormat(data); 
data = Filter.useFilter(data, filter1); 

有一个小技巧here

默认情况下,非数值属性得到进口名义 属性,并不一定期望的文本数据, 特别是如果想使用StringToWordVector过滤。为了将 的属性更改为STRING,可以对数据运行NominalToString 过滤器(包weka.filters.unsupervised.attribute), 指定属性索引或应该被 转换的索引范围(注意:此过滤器不排除 转换中的类属性!)。