From 15acc41b24c750b8a2f867d8e22f16a324d43eee Mon Sep 17 00:00:00 2001 From: Ivan Frescas Date: Mon, 7 Oct 2019 11:26:37 -0600 Subject: [PATCH 1/2] Solution for MovieRecommender --- .../recommendation/MovieRecommender.java | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java 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 100755 index 0000000..7babdcb --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,145 @@ +package nearsoft.academy.bigdata.recommendation; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.GZIPInputStream; +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.recommender.RecommendedItem; +import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; +import org.apache.mahout.cf.taste.recommender.UserBasedRecommender; +import org.apache.mahout.cf.taste.similarity.UserSimilarity; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +/** + * + * @author ifrescas + */ + +public class MovieRecommender { + + private int totalReviews = 0; + private int totalProducts = 0; + private int totalUsers = 0; + + //Hash map para almacenar ids + //HashMap productsMap = new HashMap(); + //HashMap usersMap = new HashMap(); + + BiMap productsMap = HashBiMap.create(); + BiMap usersMap = HashBiMap.create(); + + + public MovieRecommender(String path) throws IOException { + + + + //Escritura de datos para crear archivo .csv + File result = new File("Result.csv"); + FileWriter fw = new FileWriter(result); + BufferedWriter bw = new BufferedWriter(fw); + + // Lectura de datos + String infile = path; + GZIPInputStream in = new GZIPInputStream(new FileInputStream(infile)); + Reader decoder = new InputStreamReader(in); + BufferedReader br = new BufferedReader(decoder); + String line; + + String cvsProd=""; + String cvsUser=""; + String cvsScore = ""; + + int prodNum = 0; + int userNum = 0; + int reviewNum = 0; + + + while ((line = br.readLine()) != null) { + if (line.startsWith("product/productId:")) { + reviewNum++; + + String [] parts = line.split(": "); + String productId = parts[1]; + + if (!productsMap.containsKey(productId)) { + productsMap.put(productId,prodNum++); + } + cvsProd = productsMap.get(productId).toString(); + + } else if (line.startsWith("review/userId")) { + String [] parts = line.split(": "); + String userId = parts[1]; + + if(!usersMap.containsKey(userId)) { + usersMap.put(userId,userNum++); + } + cvsUser = usersMap.get(userId).toString(); + + } + else if (line.startsWith("review/score")) { + String [] parts = line.split(": "); + cvsScore = parts[1]; + + String entry = String.format("%s,%s,%s\n", cvsUser ,cvsProd, cvsScore); + bw.write(entry); + } + } + + br.close(); + bw.close(); + + this.totalReviews = reviewNum; + this.totalProducts = productsMap.size(); + this.totalUsers = usersMap.size(); + + } + + public int getTotalReviews() { + return this.totalReviews; + } + + public int getTotalProducts() { + return this.totalProducts; + } + + public int getTotalUsers() { + return this.totalUsers; + } + + + public List getRecommendationsForUser(String userId) throws IOException, TasteException { + + List results = new ArrayList(); + + int user = usersMap.get(userId); + + DataModel model = new FileDataModel(new File("Result.csv")); + UserSimilarity similarity = new PearsonCorrelationSimilarity(model); + UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); + UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); + + List recommendations = recommender.recommend(user, 3); + + for (RecommendedItem recommendation : recommendations) { + results.add(productsMap.inverse().get((int)recommendation.getItemID())); + } + return results; + + } +} From fc9383e938dfed7dd98d8da7a5ba57ddcb6ee56c Mon Sep 17 00:00:00 2001 From: Ivan Frescas Date: Wed, 9 Oct 2019 13:04:29 -0600 Subject: [PATCH 2/2] Solution for MovieRecommender --- .../recommendation/MovieRecommender.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java index 7babdcb..f45c06e 100755 --- a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -37,24 +37,21 @@ public class MovieRecommender { private int totalProducts = 0; private int totalUsers = 0; - //Hash map para almacenar ids - //HashMap productsMap = new HashMap(); - //HashMap usersMap = new HashMap(); - BiMap productsMap = HashBiMap.create(); BiMap usersMap = HashBiMap.create(); + static final String fieldProduct = "product/productId:"; + static final String fieldUser = "review/userId"; + static final String fieldscore = "review/score"; public MovieRecommender(String path) throws IOException { - - //Escritura de datos para crear archivo .csv File result = new File("Result.csv"); FileWriter fw = new FileWriter(result); BufferedWriter bw = new BufferedWriter(fw); - // Lectura de datos + String infile = path; GZIPInputStream in = new GZIPInputStream(new FileInputStream(infile)); Reader decoder = new InputStreamReader(in); @@ -70,8 +67,9 @@ public MovieRecommender(String path) throws IOException { int reviewNum = 0; + while ((line = br.readLine()) != null) { - if (line.startsWith("product/productId:")) { + if (line.startsWith(fieldProduct)) { reviewNum++; String [] parts = line.split(": "); @@ -82,7 +80,7 @@ public MovieRecommender(String path) throws IOException { } cvsProd = productsMap.get(productId).toString(); - } else if (line.startsWith("review/userId")) { + } else if (line.startsWith(fieldUser)) { String [] parts = line.split(": "); String userId = parts[1]; @@ -92,7 +90,7 @@ public MovieRecommender(String path) throws IOException { cvsUser = usersMap.get(userId).toString(); } - else if (line.startsWith("review/score")) { + else if (line.startsWith(fieldscore)) { String [] parts = line.split(": "); cvsScore = parts[1];