2016-11-06 16 views
0

Я пробую простую рекомендацию для фильма, сославшись на короткое видео здесь: https://www.youtube.com/watch?v=63k560Livmg. То, что я пытаюсь использовать diff, вместо консоли, я хочу, чтобы рекомендации отображались в браузере, поэтому я использую сервлеты. Но проблема в том, что когда я ввожу значение (идентификатор пользователя) в свою форму, отображается пустой экран. Пожалуйста, помогите, что я делаю неправильно. Набор данных отсюда https://mahout.apache.org/users/recommender/userbased-5-minutes.html. Обратитесь к скриншоту, прилагаемому к web.xml и иерархии.maven в eclipse, дающий filenotfound exception для файла data.csv

index.jsp

<html> 
    <body> 
    <h2>Hello World!</h2> 
    <form action="demo" method="post"> 
    loginID:<input type="text" name="name"/><br/> 
    <input type="submit" value="login"/> 

    </form> 
    </body> 
    </html> 

demo.java- сервлет для сбора значения пользователя и результат отображения.

package com.issac; 

    import java.io.IOException; 
    import java.io.PrintWriter; 
    import java.util.ArrayList; 
    import java.util.List; 

    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 


import org.apache.mahout.cf.taste.recommender.RecommendedItem; 

/** 
* Servlet implementation class demo 
*/ 
    public class demo extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
     public demo() { 
     super(); 
    // TODO Auto-generated constructor stub 
    } 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 

/** 
* @throws IOException 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    // TODO Auto-generated method stub 

     String n = request.getParameter("name"); 
     int k = Integer.parseInt(n); 
     PrintWriter out = response.getWriter(); 
     List<RecommendedItem> recommendations = new ArrayList<RecommendedItem> (); 

     try { 
      recommendations = App.getRecommend(k); 
     } catch (Exception e) { 
     // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      for (RecommendedItem recommendation : recommendations) { 
      out.println(recommendation); 





    } 

}} 

app.java - логика для выработки рекомендаций

 package com.issac; 

     import java.io.File; 
     import java.util.List; 

     import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; 
     import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood; 
     import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; 
     import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; 
     import org.apache.mahout.cf.taste.model.DataModel; 
     import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; 
     import org.apache.mahout.cf.taste.recommender.RecommendedItem; 
     import org.apache.mahout.cf.taste.recommender.UserBasedRecommender; 
     import org.apache.mahout.cf.taste.similarity.UserSimilarity; 


     public class App 
{ 
    public static List<RecommendedItem> getRecommend(int k) throws Exception 
{ 
    DataModel model = new FileDataModel(new File("data/dataset.csv")); 
    UserSimilarity similarity = new PearsonCorrelationSimilarity(model); 
    UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); 
UserBasedRecommender recommender = new  GenericUserBasedRecommender(model, neighborhood, similarity); 
     List<RecommendedItem> recommendations = recommender.recommend(k, 3); 
     return recommendations; 
    } 
    } 

трассировки стека затмения Console-

  INFO: Server startup in 15288 ms 
      SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
      SLF4J: Defaulting to no-operation (NOP) logger implementation 
     SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
     java.io.FileNotFoundException: data\dataset.csv 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init> (FileDataModel.java:182) 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init>(FileDataModel.java:169) 
     at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<init>(FileDataModel.java:149) 
     at com.issac.App.getRecommend(App.java:24) 
     at com.issac.demo.doPost(demo.java:51) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt erChain.java:292) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

enter image description here

+0

В консоли, похоже, есть трассировка стека аварий. Вам нужно посмотреть всю трассировку стека и выяснить, что пошло не так –

+0

Я проверил трассировку стека, и она показывает это - */SLF4J: Не удалось загрузить класс «org.slf4j.impl.StaticLoggerBinder». SLF4J: Реализация регистратора без операции (NOP) SLF4J: Дополнительную информацию см. В http://www.slf4j.org/codes.html#StaticLoggerBinder. java.io.FileNotFoundException: data \ dataset.csv * /. Является ли местоположение dataset.csv некорректным в иерархии, поскольку сервер не может найти dataset.csv, несмотря на то, что он присутствует в папке с данными? – techvigil

ответ

0

Так вот как это сработало для меня. После того, как FileNotFound исключения, я попытался this->

ClassLoader classLoader = App.class.getClassLoader(); 
DataModel model = new FileDataModel(new File(classLoader.getResource("data/dataset.csv").getFile())); 

вместо

DataModel model = new FileDataModel(new File("data/dataset.csv")); 

У меня нет глубоких знаний о том, почему он работал просто нашел в интернете, что-то делать с классом FileDataModel годов параметры. Любой, кто может дать объяснение, приветствуется.

0

В приложении JEE, файлы должны быть считаны через getResourceAsStream метод:

try(InputStream input=getClass().getClassLoader().getResourceAsStream("data/dataset.csv")){ 
    ... 
} 

И data папка должна быть размещена непосредственно в пределах src/main/resources.

В вашем случае, еще одна сложности существует: В связи с отсутствием конструктора DataModel из InputStream, нам нужно сохранить первое содержимое InputStream в (временный) файл:

try(InputStream input=getClass().getClassLoader().getResourceAsStream("data/dataset.csv")){ 
    // Copy the contents of the inputStream to a File, to fix the constructor FileDataModel(file): 
    File tmp=File.createTempFile("model-", ""); 
    tmp.deleteOnExit(); 
    InputStream input=new ByteArrayInputStream("enero".getBytes("ISO-8859-1")); 
    Files.copy(input, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING); 
    DataModel model = new FileDataModel(new File("data/dataset.csv")); 
    ... 
} 
+0

еще нет вывода & показ-java.io.FileNotFoundException: ресурсы Java \ src \ main \ resources \ data \ dataset.csv – techvigil

+0

Конструктор FileDataModel (InputStream) не определен – techvigil

+0

Agh. Тогда я пошел слишком быстро. ОК; Теперь прочитайте мое полное решение. –