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

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

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

目前,似乎text属性被格式化为名义属性,每个消息的文本都是一个值。 但是我需要text属性是一个String属性,而不是所有实例中所有文本的列表。 将text属性作为String将允许我使用StringToWordVectorfilter来训练分类器。

 // 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 ,但这似乎不适用于更改属性类型。

编辑:我怀疑这个NominalToStringfilter将完成这项工作,但我不知道如何使用它。

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

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

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

这里有一个小小的提示

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