1

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

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

目前,似乎文本属性被格式化为一个名义属性,每个消息的文本作为一个值。但我需要 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 过滤器可以完成这项工作,但我不确定如何使用它。

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

4

1 回答 1

8

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

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

这里有一个小技巧

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

于 2013-06-19T20:17:51.590 回答