mahout(ver.0.20) Webアプリ作成手順
前記事で、Mavenが動くようになったので、mvnプロジェクトからmahoutを入れてみます。
ターミナルで作業ディレクトリに移動して、
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
同フォルダ(pom.xmlを含むことを確認し)で、下記コマンドを実行
mvn eclipse:eclipse -DdownloadSources=true
これで、Eclipseに対応するので、Eclipseを起動し、このプロジェクトをImport
Import後、②・③のように各ファイルを更新。
②web.xml
③RecommenderServlet.java
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 インストール
ターミナルで作業ディレクトリに移動して、
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,
Iterableitems) 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 インストール