5

这是我在这个论坛上的第一个问题....我正在使用 WEKA API 在 java 中制作数据挖掘应用程序。我首先进行预处理阶段,当我保存 ARFF 文件时,我想添加几行(作为注释)指定我对文件所做的预处理任务......问题是我没有知道如何从 java WEKA API 向 ARFF 文件添加注释。为了保存文件,我像这样使用 ArffSaver 类...

    try {
        ArffSaver saver = new ArffSaver();
        saver.setInstances(dataPost);
        saver.setFile(arffFile);
        saver.writeBatch();
        return true;
    } catch (IOException ex) {
        Logger.getLogger(Preprocesamiento.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    }

如果有人能给出一些想法,我会非常高兴......谢谢!

4

2 回答 2

1

您应该避免在 .arff 文件上编写注释,在使用 Java 编写时更是如此。这些文件非常“解析器敏感”。由于这个特殊原因,用于创建这些文件的 Weka API 受到限制。

尽管如此,您始终可以使用%符号手动添加您的评论。这就是说,我不建议您将实例、属性和值以外的任何内容写入 .arff 文件。;-)

于 2013-04-18T16:15:41.643 回答
0

我没有理由将注释写入 ARFF 文件的标题。规范清楚地说:

以 % 开头的行是注释。

因此,虽然它在技术上是有效的,但如果您想使用该ArffSaver#setFile方法可能会很困难。这个方法在内部做了很多(方便,但有些随意和未指定)工作,直到它最终调用

setDestination(new FileOutputStream(m_outputFile));

如果这不是必需的,最简单的选择是直接写入OutputStream,然后可以简单地将其设置为ArffSaver. 这可以包装在一个小的辅助方法中,例如,像这样:

static void writeArff(
    Instances instances, 
    List<String> commentLines, 
    OutputStream outputStream) throws IOException
{
    ArffSaver saver = new ArffSaver();
    saver.setInstances(instances);
    if (commentLines != null && !commentLines.isEmpty())
    {
        BufferedWriter bw = new BufferedWriter(
            new OutputStreamWriter(outputStream));
        for (String commentLine : commentLines)
        {
            bw.write("% " + commentLine + "\n");
        }
        bw.write("\n");
        bw.flush();
    }
    saver.setDestination(outputStream);
    saver.writeBatch();
}

当这样称呼它时

 List<String> comments = Arrays.asList("A comment", "Another one");
writeArff(instances, comments, outputStream);

然后给定的注释将被插入到 ARFF 文件的顶部。

于 2018-03-18T02:18:56.050 回答