我尝试使用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会完成这项工作,但我不确定如何使用它。
我们非常感谢任何建议。谢谢!
答案 0 :(得分:8)
这就是诀窍。它改变了文本属性类型,但没有改变标签属性类型(虽然我不确定为什么它会做一个而不是另一个)。
NominalToString filter1 = new NominalToString();
filter1.setInputFormat(data);
data = Filter.useFilter(data, filter1);
有一个小提示here
默认情况下,非数字属性作为NOMINAL导入 属性,不一定是文本数据所需的, 特别是如果想要使用StringToWordVector过滤器。为了 要将属性更改为STRING,可以运行NominalToString 过滤(包weka.filters.unsupervised.attribute)对数据, 指定应该是的索引的属性索引或范围 转换(注意:此过滤器不排除来自的类属性) 转换!)。