如何在Servlet中加载分类器(Weka)

时间:2014-12-06 12:19:02

标签: java servlets tomcat7 weka

我正在尝试构建一个Prediciton-Servlet。但我无法将以前构建的分类器加载到servlet中。 这是我的代码:

public class SucessPrediction extends HttpServlet {
private static final long serialVersionUID = 1L;

public SucessPrediction() {
    super();
    // TODO Auto-generated constructor stub
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // Get formula input
        ...
    // Read Classifier and predict Success

    ServletContext context = getServletContext();
    InputStream resourceContent = context.getResourceAsStream("/WEB-INF/J48.model");
    try {
        Classifier J48 = (Classifier) weka.core.SerializationHelper.read(resourceContent);
        if (klassifizierer != null) {out.println("KLASSIFIZIERER IS LOADED");}
        predictionResult = J48.classifyInstance(DATA.firstInstance());
        DATA.classAttribute().value((int) ergebnis);
    return PredicitonResult;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

问题是,当我构建一个普通的JAVA应用程序时,它可以工作。但是在我的servlet中它不起作用。我认为它与文件路径有关。 我还读到了这个提示:File path to resource in our war/WEB-INF folder? 但无论我做什么,我都无法加载我的分类器并对我的数据进行分类。

我的系统是一个Eclipse IDE,带有集成的Tomcat7和OS Ubuntu 14.04

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

更改您的代码,以便您可以以不同方式加载分类器。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // Get formula input
        ...
    // Read Classifier and predict Success

    try {
        Classifier J48 = getClassifier();
        if (klassifizierer != null) {out.println("KLASSIFIZIERER IS LOADED");}
        predictionResult = J48.classifyInstance(DATA.firstInstance());
        DATA.classAttribute().value((int) ergebnis);
    return PredicitonResult;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

通过这种方式,您可以尝试不同的加载策略。

首先,绝对路径在您的开发机器中首先尝试以下操作。 将您的模型文件放到某个目录并尝试通过绝对路径加载它。

// absolute path
private Classifier getClassifier() throws Exception
{
   return (Classifier) weka.core.SerializationHelper.read("C:\J48.model");
}

第二,相对路径 将您的模型文件放在Web应用程序目录中,并尝试按绝对路径加载它。

// relative path in web.app
private Classifier getClassifier() throws Exception
{
    String relativeWebPath = "/ModelFiles/J48.model";
    String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
    return (Classifier) weka.core.SerializationHelper.read(absoluteDiskPath);
}