我正在尝试使用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属性转换!).