1

我正在 Google App Engine(使用 Eclipse)中构建一个应用程序,该应用程序在其中一个部分使用 WEKA [1]。这个应用程序需要加载 ARFF 基地,但这没关系。这些基础所在的目录位于项目的根目录中。以下线路负责装载基地:

1. DataSource source;
2. source = new DataSource("bases/iris.arff");
3. Instances trainInstances = source.getDataSet();
4. trainInstances.setClassIndex(trainInstances.numAttributes() - 1);

上面几行代码是在负责执行应用程序的 servlet 中调用的代码的一部分。Servlet 运行正常,但“源”变量无法读取 arff 文件,因此在第 3 行出现以下异常:

“java.io.IOException:未在 weka.core.converters.ArffLoader.getDataSet(ArffLoader.java:1003) 指定源”

根据[2],

可以从作为应用程序的一部分上传的文件中读取,前提是该文件位于以下位置: war/WEB-INF // 在与 appengine-web.xml 中的模式匹配的位置(默认情况下包括所有内容) )

我已经遵循了这两点,但没有成功。对于第二个,我的配置如下:

<resource-files>
    <include path="/bases/**.arff" />
</resource-files>

鉴于这段悠久的历史,我问你:有没有将“bases”目录放在某个地方,或者在 GAE xml 文件或 Eclipse 上配置一些东西,从而可以加载 ARFF 基础?


参考

[1] www.cs.waikato.ac.nz/ml/weka/

[2] https://developers.google.com/appengine/kb/java#readfile

4

1 回答 1

0

您的问题更多是关于在 Web 应用程序环境中加载资源。stackoverflow 中有关在 Web 应用程序环境中加载资源的一些附加 资源。

将您的 arff 文件放在 source-src 目录中。当你编译你的应用程序时,这个目录下的文件被复制到 web-inf/classes 目录下。

项目浏览器

如果你创建一个war文件,你可以看到它们被复制到哪里。看(出口 - 战争)

在确保您的 arff 文件包含在您的 Web 存档文件(war 文件)中之后。您可以使用适当的路径。如下所示。您需要使用InputStream 构造函数而不是字符串之一。

InputStream stream = getServletContext().getResourceAsStream("WEB-INF/classes/iris.arff");
DataSource source = new DataSource(stream);

我已经用简单的 Web 应用程序项目尝试过这个,它可以工作。我的代码如下。

deneme.jsp

<%
InputStream stream = getServletContext().getResourceAsStream("WEB-INF/classes/iris.arff");
String summary = LoadArffFile.loadArffFileAndFindSummary(stream );

out.println(summary);

%>

加载ArffFile.java

public static String loadArffFileAndFindSummary( InputStream stream)
{

     DataSource source = new  DataSource(stream);
     String summary = null;
    try {
        summary = source.getStructure().toSummaryString();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     return summary;
}

在tomcat中输出。

Relation Name: iris Num Instances: 0 Num Attributes: 5 Name Type Nom Int Real Missing Unique Dist 1 sepallength Num 0% 0% 0% 0 / 0% 0 / 0% 0 2 sepalwidth Num 0% 0% 0% 0 / 0% 0 / 0% 0 3 petallength Num 0% 0% 0% 0 / 0% 0 / 0% 0 4 petalwidth Num 0% 0% 0% 0 / 0% 0 / 0% 0 5 class Nom 0% 0% 0% 0 / 0% 0 / 0% 0 
于 2012-07-04T21:02:46.830 回答