2010/01/19からのアクセス回数 22025
Tasteは、mahoutに含まれるレコメンドシステム用パッケージです。
mahout ver. 0.20のTasteは、まだMapReduce(hadoop)に対応して いないので、hadoupをインストールしなくても使用することができます。
mahoutでの開発には、JDK 1.6が必要です。
ネット検索するとOS XでJDK 1.6を使うには、アプリケーションのユーティリティフォルダにある Java Preferencesで切り替えるとありますが、これを実施してもターミナルでjavac -versionが1.6に 切り替わりません。
そこで、以下の設定を.profileに追加します。
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home export PATH=$JAVA_HOME/bin:$PATH
新しいターミナルを起動して、設定が正しくできたか確認します。
$ javac -version javac 1.6.0_15
mavenを使ってレコメンド・アプリケーションを作成します。
最初に、プロジェクトを作成します。
$ mvn archetype:create -DgroupId=sample.recommendApp -DartifactId=recommendApp -Dversion=0.0.1
pom.xmlのdependecyに以下の項目を追加します。
</dependency>
<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>
また、JDKを1.6にするために以下のbuildを追加します。
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
これで、
pom.xml の設定は完了です。
Eclipseを使って編集ができるように、以下のコマンドでEclipseのプロジェクトにします。
mvn eclipse:eclipse -DdownloadSources=true
これで、必要なライブラリがすべてセットされ、ソースの参照も可能なEclipseプロジェクト のできあがりです。
Eclipseで作成したrecommendAppをインポートしてください。
集合知の2章のデータを使って、ユークリッド距離によるレコメンドアプリケーション を作成してみましょう。
プログラムのメインは、以下のようになります。
// モデル構築用のデータをファイルから読み込む
DataModel model = new FileDataModel(new File("data/critics.csv"));
// ユーザ類似性と類似ユーザ抽出のメソッドを決定
UserSimilarity similarity = new EuclideanDistanceSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
similarity, model);
// ユーザベースの推薦を作成
Recommender recommender = new GenericUserBasedRecommender(model,
neighborhood, similarity);
// Toby(ユーザID=7)への推薦項目を3個検索
List<RecommendedItem> recommendations = recommender.recommend(7, 3);
// 推薦結果を出力
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
以下のテストデータとjavaのプログラムがあります。
プログラムを実行すると以下のように出力されます。
10/01/19 19:24:39 INFO file.FileDataModel: Creating FileDataModel for file data/critics.csv 10/01/19 19:24:39 INFO file.FileDataModel: Reading file info... 10/01/19 19:24:39 INFO file.FileDataModel: Read lines: 35 10/01/19 19:24:39 INFO model.GenericDataModel: Processed 7 users RecommendedItem[item:6, value:3.741911] RecommendedItem[item:1, value:3.0] RecommendedItem[item:3, value:2.4946072]
推薦の結果は、最後の2行です。ItemIdを映画の名前にすると
となり、Tobyがまだ見ていない映画のなかから、Tobyと似た嗜好をもつユーザの 好きな映画がリストアップされます。
この結果は、「集合知」2.4の結果とスコアは異なりますが順序は一致します。
# 集合知の出力 >>>recommendations.getRecommendations(recommendations.critics,'Toby', ... similarity=recommendations.sim_distance) [(3.5002478401415877, 'The Night Listener'), (2.7561242939959363, 'Lady in the Water'), (2.4619884860743739, 'Just My Luck')]
皆様のご意見、ご希望をお待ちしております。