diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..befafaa --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +target/ +*.iml +.DS_Store diff --git a/pom.xml b/pom.xml index 8169ff7..26eb9e6 100644 --- a/pom.xml +++ b/pom.xml @@ -26,5 +26,11 @@ 4.7 test + + org.slf4j + slf4j-api + 1.7.5 + + diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..c842611 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/test/.DS_Store b/src/test/.DS_Store new file mode 100644 index 0000000..762fe79 Binary files /dev/null and b/src/test/.DS_Store differ diff --git a/src/test/java/.DS_Store b/src/test/java/.DS_Store new file mode 100644 index 0000000..fb6af32 Binary files /dev/null and b/src/test/java/.DS_Store differ diff --git a/src/test/java/nearsoft/.DS_Store b/src/test/java/nearsoft/.DS_Store new file mode 100644 index 0000000..083635f Binary files /dev/null and b/src/test/java/nearsoft/.DS_Store differ diff --git a/src/test/java/nearsoft/academy/.DS_Store b/src/test/java/nearsoft/academy/.DS_Store new file mode 100644 index 0000000..633cb8b Binary files /dev/null and b/src/test/java/nearsoft/academy/.DS_Store differ diff --git a/src/test/java/nearsoft/academy/bigdata/.DS_Store b/src/test/java/nearsoft/academy/bigdata/.DS_Store new file mode 100644 index 0000000..04f3321 Binary files /dev/null and b/src/test/java/nearsoft/academy/bigdata/.DS_Store differ diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/BookRecommender.java b/src/test/java/nearsoft/academy/bigdata/recommendation/BookRecommender.java new file mode 100644 index 0000000..91977ea --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/BookRecommender.java @@ -0,0 +1,53 @@ +package nearsoft.academy.bigdata.recommendation; + + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import org.apache.mahout.cf.taste.common.TasteException; +import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; +import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood; +import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; +import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; +import org.apache.mahout.cf.taste.model.DataModel; +import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; +import org.apache.mahout.cf.taste.recommender.RecommendedItem; +import org.apache.mahout.cf.taste.recommender.UserBasedRecommender; +import org.apache.mahout.cf.taste.similarity.UserSimilarity; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class BookRecommender { + List RecommendedProducts ; + BiMap products ; + BiMap users ; + + private String path; + public BookRecommender(String path, BiMap users, BiMap products) + { + this.RecommendedProducts = new ArrayList(); + this.path = path; + this.users = users; + this.products = products; + } + + public List getRecommendationsForUser( String userID) throws IOException, TasteException { + DataModel model = new FileDataModel(new File(this.path)); + UserSimilarity similarity = new PearsonCorrelationSimilarity(model); + UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); + UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); + List RecommendedProducts = new ArrayList(); + List recommendations = recommender.recommend(this.users.get(userID),3); + for (RecommendedItem recomendation:recommendations) + { + long value = (long) recomendation.getItemID(); + this.RecommendedProducts.add(this.products.inverse().get(value) ); + } + + return this.RecommendedProducts; + } + + +} diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java new file mode 100644 index 0000000..f0f64bd --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,82 @@ +package nearsoft.academy.bigdata.recommendation; +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; +import org.apache.mahout.cf.taste.common.TasteException; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +public class MovieRecommender { + private String path; + int information; + + BiMap products ; + BiMap users ; + long totalReviews = 0; + PrintWriter csvWriter ; + String product; + String user; + + public static void main(String[] args) throws IOException, TasteException { + + } + public MovieRecommender(String path) throws IOException, TasteException { + this.path = path; + this.totalReviews = 0; + this.information = 0; + this.users = HashBiMap.create(); + this.products = HashBiMap.create(); + this.csvWriter= new PrintWriter("dataset.csv"); + BufferedReader reader; + InputStream stream = new GZIPInputStream(new FileInputStream(path)); + reader = new BufferedReader(new InputStreamReader(stream, "US-ASCII")); + String line = reader.readLine(); + long productID = 0; + long userID = 0; + while (line != null ) { + if (line.startsWith("product/productId:")) { + product = line.split(": ")[1]; + if (!products.containsKey(product)) { + products.put(product, productID); + productID++; + } + + }else if (line.startsWith("review/userId:")) { + user= line.split(": ")[1]; + if (!users.containsKey(user)) { + users.put(user, userID); + userID++; + } + + }else if (line.startsWith("review/score:")) { + this.totalReviews ++; + csvWriter.println(users.get(user) + "," + products.get(product) + "," + line.split(": ")[1]); + + } + line = reader.readLine(); + } + csvWriter.close(); + } + + public long getTotalReviews() { + return this.totalReviews; + } + + public long getTotalProducts() { + return this.products.size(); + } + + public long getTotalUsers() { + return this.users.size(); + } + + public List getRecommendationsForUser(String userID) throws IOException,TasteException { + BookRecommender bookRecommender = new BookRecommender("dataset.csv", this.users, this.products); + + List RecommendedProducts = new ArrayList(); + RecommendedProducts = bookRecommender.getRecommendationsForUser(userID); + + return RecommendedProducts; + } +} diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java index 0d0b1fe..dc3d57d 100644 --- a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java @@ -15,7 +15,7 @@ public class MovieRecommenderTest { public void testDataInfo() throws IOException, TasteException { //download movies.txt.gz from // http://snap.stanford.edu/data/web-Movies.html - MovieRecommender recommender = new MovieRecommender("/path/to/movies.txt.gz"); + MovieRecommender recommender = new MovieRecommender("/Users/sandraherrera/Downloads/movies.txt.gz"); assertEquals(7911684, recommender.getTotalReviews()); assertEquals(253059, recommender.getTotalProducts()); assertEquals(889176, recommender.getTotalUsers()); @@ -24,7 +24,6 @@ public void testDataInfo() throws IOException, TasteException { assertThat(recommendations, hasItem("B0002O7Y8U")); assertThat(recommendations, hasItem("B00004CQTF")); assertThat(recommendations, hasItem("B000063W82")); - } }