ターミナルで作業ディレクトリに移動して、
mvn archetype:create -DgroupId=sample.recommendWeb -DartifactId=recommendWeb -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1
下記のようにrecommendWebフォルダならびにディレクトリが生成されるので、
pom.xmlを下の①のように更新し、recommendWebフォルダ直下でJavaソース配置先を作成、
mkdir src/main/java
①pom.xml
4.0.0 sample.recommendWeb recommendWeb war 0.0.1 recommendWeb Maven Webapp http://maven.apache.org junit junit 3.8.1 test org.apache.mahout mahout-core 0.2 org.slf4j slf4j-jcl 1.5.8 javax.servlet servlet-api 2.5 provided recommendWeb maven-compiler-plugin 1.6 1.6 UTF-8 org.mortbay.jetty maven-jetty-plugin 6.1.7
同フォルダ(pom.xmlを含むことを確認し)で、下記コマンドを実行
mvn eclipse:eclipse -DdownloadSources=true
これで、Eclipseに対応するので、Eclipseを起動し、このプロジェクトをImport
Import後、②・③のように各ファイルを更新。
②web.xml
Archetype Created Web Application web-recommender Web Recommender Web recommender servlet RecommenderServlet 1 web-recommender recommendWeb/RecommenderServlet
③RecommenderServlet.java
import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletConfig; 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.impl.model.file.FileDataModel; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity; 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.Recommender; import org.apache.mahout.cf.taste.similarity.UserSimilarity; public class RecommenderServlet extends HttpServlet { private static final int NUM_TOP_PREFERENCES = 3; private static final int DEFAULT_HOW_MANY = 3; private Recommender recommender; public void init(ServletConfig config) throws ServletException { super.init(config); try { String csvPath= getServletContext().getRealPath("WEB-INF"); csvPath += File.separator + "critics.csv"; // モデル構築用のデータをファイルから読み込む DataModel model = new FileDataModel(new File(csvPath)); // ユーザ類似性と類似ユーザ抽出のメソッドを決定 UserSimilarity similarity = new EuclideanDistanceSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); // ユーザベースの推薦を作成 recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); } catch (Exception e) { throw new ServletException(e); } } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { String userIDString = req.getParameter("userID"); if (userIDString == null) { throw new ServletException("userID was not specified"); } long userID = Long.parseLong(userIDString); String howManyString = req.getParameter("howMany"); int howMany = howManyString == null ? DEFAULT_HOW_MANY : Integer.parseInt(howManyString); try { Listitems = recommender.recommend(userID, howMany); writePlainText(resp, userID, items); } catch (Exception te) { throw new ServletException(te); } } private void writePlainText(HttpServletResponse response, long userID, Iterable items) throws IOException, Exception { response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter writer = response.getWriter(); for (RecommendedItem recommendedItem : items) { writer.print(recommendedItem.getValue()); writer.print('\t'); writer.println(recommendedItem.getItemID()); } } }
recommendWeb/src/main/webapp/WEB-INF直下に、mahoutで検証するデータCSVファイル(critics.csv)を配置します。
これで、サーブレット設定をしてからjettyを起動。
※WebApp dir をWEB-INF/web.xmlを含むディレクトリに設定
jetty起動後、下URLのようにパラメータを渡せば、データの推定値が表示されます。
http://localhost:8080/recommendWeb/RecommenderServlet?userID=7
[以下ToDo]
・上記環境はmahout ver.0.20のTasteを利用しているためHadoop未対応とのこと、Hadoop対応版の動作検証
・MahoutでのGoogleAppEngineでの動作検証
以上です。
【参照ページ】
・Apache Mahout Project
・mahout/レコメンドサーブレットの作り方
・Mahout インストール
0 件のコメント:
コメントを投稿