ems*_*ems 1 java csv weka arff document-classification
我正在尝试使用WEKA库制作SMS SPAM分类器.我有一个带有"标签"和"文本"标题的CSV文件.当我使用下面的代码时,它会创建一个包含两个属性的ARFF文件:
@attribute label {ham,spam}
@attribute text {'Go until jurong point','Ok lar...', etc.}
Run Code Online (Sandbox Code Playgroud)
目前,似乎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();
Run Code Online (Sandbox Code Playgroud)
我知道我可以像这样创建一个String属性:
Attribute tmp = new Attribute("tmp", (FastVector) null);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何替换当前属性,或者在读取CSV之前设置属性类型.
我尝试插入一个新的String属性并删除当前的名义属性,但这会删除所有的SMS文本.我也尝试使用renameAttributeValue,但这似乎不适用于更改属性类型.
编辑: 我怀疑这个NominalToString过滤器将完成这项工作,但我不知道如何使用它.
任何建议将不胜感激.谢谢!
这样做了.它改变了文本属性类型,但没有改变标签属性类型(虽然我不确定为什么它会做一个而不是另一个).
NominalToString filter1 = new NominalToString();
filter1.setInputFormat(data);
data = Filter.useFilter(data, filter1);
Run Code Online (Sandbox Code Playgroud)
有一个小技巧在这里
默认情况下,非数字属性作为NOMINAL属性导入,这对于文本数据不是必需的,特别是如果想要使用StringToWordVector过滤器.为了将属性更改为STRING,可以对数据运行NominalToString过滤器(包weka.filters.unsupervised.attribute),指定应转换的属性索引或索引范围(注意:此过滤器不排除来自转换的class属性!).
| 归档时间: |
|
| 查看次数: |
8104 次 |
| 最近记录: |