Author: srowen
Date: Tue Jan 6 16:29:58 2009
New Revision: 732187
URL: http://svn.apache.org/viewvc?rev=732187&view=rev
Log: (empty)
Added:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/README
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java
- copied, changed from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java
- copied, changed from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderBuilder.java
- copied, changed from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderBuilder.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderEvaluatorRunner.java
- copied, changed from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderEvaluatorRunner.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/README
Added:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/README
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/README?rev=732187&view=auto
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/README
(added)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/README
Tue Jan 6 16:29:58 2009
@@ -0,0 +1,9 @@
+Code works with BookCrossing data set, which is not included in this
distribution but is downloadable from
+http://www.informatik.uni-freiburg.de/~cziegler/BX/
+
+Data set originated from:
+
+Improving Recommendation Lists Through Topic Diversification,
+ Cai-Nicolas Ziegler, Sean M. McNee, Joseph A. Konstan, Georg Lausen;
+ Proceedings of the 14th International World Wide Web Conference (WWW '05),
May 10-14, 2005, Chiba, Japan.
+ To appear.
\ No newline at end of file
Copied:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java
(from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java)
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java?p2=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java&p1=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java&r1=731349&r2=732187&rev=732187&view=diff
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java
(original)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java
Tue Jan 6 16:29:58 2009
@@ -15,190 +15,68 @@
* limitations under the License.
*/
-package org.apache.mahout.cf.taste.example.bookcrossing;
+package org.apache.mahout.cf.taste.example.jester;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
-import org.apache.mahout.cf.taste.impl.common.FileLineIterable;
-import org.apache.mahout.cf.taste.impl.common.IOUtils;
+import org.apache.mahout.cf.taste.example.grouplens.GroupLensDataModel;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
-import org.apache.mahout.cf.taste.model.Item;
-import org.apache.mahout.cf.taste.model.User;
+import org.apache.mahout.cf.taste.impl.model.GenericPreference;
import org.apache.mahout.cf.taste.model.Preference;
-import org.apache.mahout.cf.taste.example.grouplens.GroupLensDataModel;
+import org.apache.mahout.cf.taste.model.Item;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.OutputStreamWriter;
-import java.util.Map;
-import java.util.NoSuchElementException;
import java.util.List;
-import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.ArrayList;
-public final class BookCrossingDataModel extends FileDataModel {
+public final class JesterDataModel extends FileDataModel {
- private Map<String, Book> bookMap;
- private Map<String, String[]> userDataMap;
- private final File booksFile;
- private final File usersFile;
-
- public BookCrossingDataModel() throws IOException {
-
this(GroupLensDataModel.readResourceToTempFile("/org/apache/mahout/cf/taste/example/bookcrossing/BX-Book-Ratings.csv"),
-
GroupLensDataModel.readResourceToTempFile("/org/apache/mahout/cf/taste/example/bookcrossing/BX-Books.csv"),
-
GroupLensDataModel.readResourceToTempFile("/org/apache/mahout/cf/taste/example/bookcrossing/BX-Users.csv"));
+ private int userBeingRead;
+
+ public JesterDataModel() throws IOException {
+
this(GroupLensDataModel.readResourceToTempFile("/org/apache/mahout/cf/taste/example/jester/jester-data-1.csv"));
}
/**
- * @param ratingsFile BookCrossing ratings file in its native format
- * @param booksFile BookCrossing books file in its native format
- * @param usersFile BookCrossing books file in its native format
- * @throws IOException if an error occurs while reading or writing files
+ * @param ratingsFile Jester ratings file in CSV format
+ * @throws java.io.IOException if an error occurs while reading or writing
files
*/
- public BookCrossingDataModel(File ratingsFile, File booksFile, File
usersFile) throws IOException {
- super(convertBCFile(ratingsFile));
- this.booksFile = booksFile;
- this.usersFile = usersFile;
+ public JesterDataModel(File ratingsFile) throws IOException {
+ super(ratingsFile);
}
@Override
- protected void reload() {
- bookMap = new FastMap<String, Book>(5001);
- userDataMap = new FastMap<String, String[]>(5001);
-
- for (String line : new FileLineIterable(booksFile, true)) {
- String[] tokens = tokenizeLine(line, 5);
- if (tokens != null) {
- String id = tokens[0];
- bookMap.put(id, new Book(id, tokens[1], tokens[2],
Integer.parseInt(tokens[3]), tokens[4]));
- }
- }
- for (String line : new FileLineIterable(usersFile, true)) {
- String[] tokens = tokenizeLine(line, 3);
- if (tokens != null) {
- String id = tokens[0];
- userDataMap.put(id, new String[] { tokens[1], tokens[2] });
- }
- }
-
+ public void reload() {
+ userBeingRead = 0;
super.reload();
- bookMap = null;
- userDataMap = null;
- }
-
- private static String[] tokenizeLine(String line, int numTokens) {
- String[] result = new String[numTokens];
- int pos = 0;
- int token = 0;
- int start = 0;
- int end = 0;
- boolean inQuote = false;
- int length = line.length();
- while (pos < length && token < numTokens) {
- char c = line.charAt(pos);
- if (c == '"') {
- if (inQuote) {
- if (line.charAt(pos - 1) != '\\') {
- end = pos;
- inQuote = false;
- }
- } else {
- start = pos + 1;
- inQuote = true;
- }
- } else if (c == ';' && !inQuote) {
- if (start == end) {
- // last token was unquoted
- end = pos + 1;
- }
- result[token] = line.substring(start, end);
- start = pos + 1;
- end = pos + 1;
- token++;
- }
- pos++;
- }
- if (token == numTokens - 1) {
- // one more at end
- if (start == end) {
- // last token was unquoted
- end = pos;
- }
- result[token] = line.substring(start, end);
- token++;
- }
- if (token != numTokens) {
- return null;
- }
- for (int i = 0; i < result.length; i++) {
- if ("NULL".equalsIgnoreCase(result[i])) {
- result[i] = null;
- }
- }
- return result;
- }
-
- @Override
- protected User buildUser(String id, List<Preference> prefs) {
- String[] userData = userDataMap.get(id);
- if (userData == null) {
- throw new NoSuchElementException();
- }
- String location = userData[0];
- String[] locationTokens = location.split(",");
- for (int i = 0; i < locationTokens.length; i++) {
- if (locationTokens[i] != null) {
- locationTokens[i] = locationTokens[i].trim();
- if (locationTokens[i].length() == 0) {
- locationTokens[i] = null;
- }
- }
- }
- String city = locationTokens[0];
- String state = locationTokens.length > 1 ? locationTokens[1] : null;
- String country = locationTokens.length > 2 ? locationTokens[2] : null;
- Integer age = userData[1] == null ? null : Integer.valueOf(userData[1]);
- return new BookCrossingUser(id, prefs, city, state, country, age);
}
@Override
- protected Item buildItem(String id) {
- Item item = bookMap.get(id);
- if (item == null) {
- // some books aren't in books file?
- return new Book(id, null, null, 0, null);
- }
- return item;
- }
-
- private static File convertBCFile(File originalFile) throws IOException {
- File resultFile = new File(new File(System.getProperty("java.io.tmpdir")),
"taste.bookcrossing.txt");
- if (!resultFile.exists()) {
- PrintWriter writer = null;
- try {
- writer = new PrintWriter(new OutputStreamWriter(new
FileOutputStream(resultFile), Charset.forName("UTF-8")));
- for (String line : new FileLineIterable(originalFile, true)) {
- if (line.indexOf(',') >= 0) {
- // crude hack to work around corruptions in data file -- some bad
lines with commas in them
- continue;
- }
- String convertedLine = line.replace(';', ',').replace("\"", "");
- writer.println(convertedLine);
+ protected void processLine(String line, Map<String, List<Preference>> data,
Map<String, Item> itemCache) {
+ String userID = String.valueOf(userBeingRead);
+ String[] jokePrefs = line.split(",");
+ int itemIDNum = 0;
+ List<Preference> prefs = new ArrayList<Preference>(101);
+ for (String jokePref : jokePrefs) {
+ double jokePrefValue = Double.parseDouble(jokePref);
+ if (jokePrefValue >= -10.0 && jokePrefValue <= 10.0) {
+ String itemID = String.valueOf(itemIDNum);
+ Item item = itemCache.get(itemID);
+ if (item == null) {
+ item = buildItem(itemID);
+ itemCache.put(itemID, item);
}
- writer.flush();
- } catch (IOException ioe) {
- resultFile.delete();
- throw ioe;
- } finally {
- IOUtils.quietClose(writer);
+ prefs.add(new GenericPreference(null, item, jokePrefValue));
}
+ itemIDNum++;
}
- return resultFile;
+ data.put(userID, prefs);
+ userBeingRead++;
}
@Override
public String toString() {
- return "BookCrossingDataModel";
+ return "JesterDataModel";
}
}
\ No newline at end of file
Copied:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java
(from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java)
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java?p2=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java&p1=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java&r1=731349&r2=732187&rev=732187&view=diff
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
(original)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java
Tue Jan 6 16:29:58 2009
@@ -15,36 +15,31 @@
* limitations under the License.
*/
-package org.apache.mahout.cf.taste.example.bookcrossing;
+package org.apache.mahout.cf.taste.example.jester;
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;
-import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
-import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
+import
org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.recommender.Rescorer;
-import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
-import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import java.util.Collection;
import java.util.List;
/**
- * A simple {...@link Recommender} implemented for the Book Crossing demo.
+ * A simple {...@link org.apache.mahout.cf.taste.recommender.Recommender}
implemented for the Book Crossing demo.
* See the <a href="http://www.informatik.uni-freiburg.de/~cziegler/BX/">Book
Crossing site</a>.
*/
-public final class BookCrossingRecommender implements Recommender {
+public final class JesterRecommender implements Recommender {
private final Recommender recommender;
- public BookCrossingRecommender(DataModel dataModel, BookCrossingDataModel
bcModel) throws TasteException {
- UserSimilarity similarity = new GeoUserSimilarity(bcModel);
- UserNeighborhood neighborhood = new NearestNUserNeighborhood(5,
similarity, dataModel);
- recommender = new CachingRecommender(new
GenericUserBasedRecommender(dataModel, neighborhood, similarity));
+ public JesterRecommender(DataModel dataModel) throws TasteException {
+ recommender = new CachingRecommender(new SlopeOneRecommender(dataModel));
}
@Override
Copied:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderBuilder.java
(from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderBuilder.java)
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderBuilder.java?p2=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderBuilder.java&p1=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderBuilder.java&r1=731349&r2=732187&rev=732187&view=diff
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderBuilder.java
(original)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderBuilder.java
Tue Jan 6 16:29:58 2009
@@ -15,24 +15,18 @@
* limitations under the License.
*/
-package org.apache.mahout.cf.taste.example.bookcrossing;
+package org.apache.mahout.cf.taste.example.jester;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.Recommender;
-final class BookCrossingRecommenderBuilder implements RecommenderBuilder {
-
- private final BookCrossingDataModel bcModel;
-
- BookCrossingRecommenderBuilder(BookCrossingDataModel bcModel) {
- this.bcModel = bcModel;
- }
+final class JesterRecommenderBuilder implements RecommenderBuilder {
@Override
public Recommender buildRecommender(DataModel dataModel) throws
TasteException {
- return new BookCrossingRecommender(dataModel, bcModel);
+ return new JesterRecommender(dataModel);
}
}
\ No newline at end of file
Copied:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderEvaluatorRunner.java
(from r731349,
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderEvaluatorRunner.java)
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderEvaluatorRunner.java?p2=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderEvaluatorRunner.java&p1=lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderEvaluatorRunner.java&r1=731349&r2=732187&rev=732187&view=diff
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommenderEvaluatorRunner.java
(original)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommenderEvaluatorRunner.java
Tue Jan 6 16:29:58 2009
@@ -15,11 +15,12 @@
* limitations under the License.
*/
-package org.apache.mahout.cf.taste.example.bookcrossing;
+package org.apache.mahout.cf.taste.example.jester;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import
org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
+import org.apache.mahout.cf.taste.model.DataModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,18 +30,18 @@
* <p>A simple example "runner" class which will evaluate the performance of
the current
* implementation of {...@link
org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommender}.</p>
*/
-public final class BookCrossingRecommenderEvaluatorRunner {
+public final class JesterRecommenderEvaluatorRunner {
- private static final Logger log =
LoggerFactory.getLogger(BookCrossingRecommenderEvaluatorRunner.class);
+ private static final Logger log =
LoggerFactory.getLogger(JesterRecommenderEvaluatorRunner.class);
- private BookCrossingRecommenderEvaluatorRunner() {
+ private JesterRecommenderEvaluatorRunner() {
// do nothing
}
public static void main(String... args) throws IOException, TasteException {
RecommenderEvaluator evaluator = new
AverageAbsoluteDifferenceRecommenderEvaluator();
- BookCrossingDataModel model = new BookCrossingDataModel();
- double evaluation = evaluator.evaluate(new
BookCrossingRecommenderBuilder(model),
+ DataModel model = new JesterDataModel();
+ double evaluation = evaluator.evaluate(new JesterRecommenderBuilder(),
model,
0.9,
0.1);
Added:
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/README
URL:
http://svn.apache.org/viewvc/lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/README?rev=732187&view=auto
==============================================================================
---
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/README
(added)
+++
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/README
Tue Jan 6 16:29:58 2009
@@ -0,0 +1,10 @@
+Code works with Jester data set, which is not included in this distribution
but is downloadable from
+http://www.ieor.berkeley.edu/~goldberg/jester-data/
+
+Note that the code here works on data set 1, after being converted to CSV
format.
+
+Data set originated from:
+
+Eigentaste: A Constant Time Collaborative Filtering Algorithm.
+ Ken Goldberg, Theresa Roeder, Dhruv Gupta, and Chris Perkins.
+ Information Retrieval, 4(2), 133-151. July 2001.
\ No newline at end of file