【问题标题】:How to change attribute type to String (WEKA - CSV to ARFF)如何将属性类型更改为字符串(WEKA - CSV 到 ARFF)
【发布时间】:2013-06-15 07:36:31
【问题描述】:

我正在尝试使用 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 filter 可以完成这项工作,但我不确定如何使用它。

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

【问题讨论】:

    标签: java csv weka document-classification arff


    【解决方案1】:

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

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

    有个小提示here

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

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 2017-05-02
      • 2015-03-01
      • 2014-08-15
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多