2010/01/20からのアクセス回数 8041
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を参照します。
http://localhost:8080/recommendWeb/RecommenderServlet?userID=7
今回、変更・追加したファイルを以下に示します。
cretics.csvは、レコメンドアプリケーションで使ったものをweb.xmlと同じディレクトリに入れてください。
皆様のご意見、ご希望をお待ちしております。