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



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

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

目前,文本属性似乎被格式化为标称属性,每个消息的文本作为一个值。但我需要文本属性是一个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中读取之前设置属性类型。

我试着插入一个新的字符串属性并删除当前的标称属性,但这会删除所有的短信文本。我还尝试使用renameAttributeValue,但这似乎不能改变属性类型。

编辑:

我怀疑这个nomaltostring过滤器将完成这项工作,但我不确定如何使用它。

任何建议都将非常感谢。谢谢!

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

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

这里有一个小提示

默认情况下,非数值属性被导入为NOMINAL属性,它不一定是文本数据所需要的,特别是如果想要使用stringtoworvector过滤器。为了要将属性更改为STRING,可以运行nomaltostring在数据上过滤(package weka.filters.unsupervised.attribute),指定属性索引或索引范围注意:这个过滤器不排除class属性转换!).

最新更新