如何将属性类型更改为String(WEKA - CSV到ARFF)

时间:2013-06-18 22:09:37

标签: java csv weka document-classification arff

我尝试使用WEKA库制作SMS SPAM分类器。我有一个带有"标签"的CSV文件和"文字"标题。当我使用下面的代码时,它会创建一个包含两个属性的ARFF文件:

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

目前,似乎text属性被格式化为名义属性,每个消息的文本都是一个值。但是我需要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();

我知道我可以像这样创建一个String属性:

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

但我不知道如何替换当前属性,或者在读取CSV之前设置属性类型。

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

修改 我怀疑这个NominalToString filter会完成这项工作,但我不确定如何使用它。

我们非常感谢任何建议。谢谢!

1 个答案:

答案 0 :(得分:8)

这就是诀窍。它改变了文本属性类型,但没有改变标签属性类型(虽然我不确定为什么它会做一个而不是另一个)。

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

有一个小提示here

  

默认情况下,非数字属性作为NOMINAL导入   属性,不一定是文本数据所需的,   特别是如果想要使用StringToWordVector过滤器。为了   要将属性更改为STRING,可以运行NominalToString   过滤(包weka.filters.unsupervised.attribute)对数据,   指定应该是的索引的属性索引或范围   转换(注意:此过滤器不排除来自的类属性)   转换!)。