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


Reply via email to