这是我在这个论坛的第一个问题.... 我正在使用WEKA API在java中创建adata-mining应用程序。 我首先进行预处理阶段,当我保存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;
}
如果有人可以提出一些想法,我会非常感激的...
谢谢!
答案 0 :(得分:1)
您应该在.arff文件上避免写入注释,甚至在从Java写入时更多。这些文件非常“解析器敏感”。用于创建这些文件的Weka API由于这个特殊原因而受到限制。
即使您可以随时使用%符号手动添加评论。这就是说,我不建议您将实例,属性和值写入.arff文件。 ; - )
答案 1 :(得分:0)
我没有理由不将注释写入ARFF文件的标头中。 specification清楚地说:
以%开头的行是注释。
因此,虽然它在技术上有效,但如果您想使用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文件的顶部。