mahout/レコメンドサーブレットの作り方
2015-07-12
FrontPage
2010/01/20からのアクセス回数
mavenを使って、サーブレット用のプロジェクトを作成します。
$ mvn archetype:create -DgroupId=sample.recommendWeb -DartifactId=recommendWeb \
-DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1
}}
生成されたディレクトリ構成は、以下のようになっています。
- recommendWeb/
|- pom.xml
|-+ src/
|-+ main/
|-+ resources/
|-+ webapp/
|-+ WEB-INF/
|- web.xml
|- index.jsp
}}
レコメンドアプリケーションと同様にpom.xmlに追加します。
dependeciesに追加
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
}}
buildに追加
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
</plugin>
</plugins>
}}
javaプログラムのディレクトリを作成します。
$ mkdir src/main/java
}}
以下のコマンドでEclipseのプロジェクトにします。
mvn eclipse:eclipse -DdownloadSources=true
}}
recommendWebプロジェクトをEclipseにインポートします。
サーブレット本体は、次のようになります。
内容はほとんどtaste-webと同じです。ただ自分で作成する必要がある場合に備えて、
作成手順を確認するために作成しました。
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);
}
}
// GET要求の処理(指定されたユーザの推薦を取り出し、返す)
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 {
List<RecommendedItem> items = recommender.recommend(userID, howMany);
writePlainText(resp, userID, items);
} catch (Exception te) {
throw new ServletException(te);
}
}
// 指定されたユーザのスコアーとアイテムIDを出力する
private void writePlainText(HttpServletResponse response, long userID,
Iterable<RecommendedItem> 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());
}
}
}
}}
最後にweb.xmlを設定すれば完成です。
web.xmlは、mavenのひな形に以下の項目を追加します。
<servlet>
<servlet-name>web-recommender</servlet-name>
<display-name>Web Recommender</display-name>
<description>Web recommender servlet</description>
<servlet-class>sample.recommendWeb.RecommenderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>web-recommender</servlet-name>
<url-pattern>/RecommenderServlet</url-pattern>
</servlet-mapping>
}}
サーブレットの動作を確認するために、jettyを使用します。
以下のコマンドをjettyを起動します。終了はCtrl-Cです。
$ mvn jetty:run
}}
ブラウザーから以下のURLを参照します。
}}
今回、変更・追加したファイルを以下に示します。
cretics.csvは、レコメンドアプリケーションで使ったものをweb.xmlと同じディレクトリに入れてください。