diff --git a/pom.xml b/pom.xml index 8169ff7..b82bb07 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,8 @@ UTF-8 + 7 + 7 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..7f7f788 --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,111 @@ + +package nearsoft.academy.bigdata.recommendation; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +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; + +/** + * @author carlo + */ +public class MovieRecommender { + + private UserBasedRecommender recommender; + private HashMap users = new HashMap(); + private HashBiMap products = HashBiMap.create(); + private int totalReviews = 0, totalUsers = 0, totalProducts = 0; + + // Constructor + public MovieRecommender(String path) throws IOException, TasteException { + inicialize(path); + } + + private void inicialize(String path) throws FileNotFoundException, IOException, TasteException { + String pathWriter = "D:/Charlitos/Nearsoft/programs/Semana_3/movies.csv"; + File file = new File(path); + BufferedReader br = new BufferedReader(new FileReader(file)); + BufferedWriter wr = new BufferedWriter(new FileWriter(pathWriter)); + + String userId = "", productId = "", score, line; + int currentUser = 0, currentProduct = 0; + + while ((line = br.readLine()) != null) { + switch(line.split(" ")[0]) { + case "product/productId:": + productId = line.split(" ")[1]; + if (!products.containsKey(productId)) { + totalProducts++; + products.put(productId,totalProducts); + currentProduct = totalProducts; + }else{ + currentProduct = products.get(productId); + } + break; + case "review/userId:": + userId = line.split(" ")[1]; + if (!users.containsKey(userId)) { + totalUsers++; + users.put(userId,totalUsers); + currentUser = totalUsers; + }else{ + currentUser = users.get(userId); + } + break; + case "review/score:": + score = line.split(" ")[1]; + wr.write(currentUser+","+currentProduct+","+score+"\n"); + totalReviews++; + break; + } + } + br.close(); + wr.close(); + DataModel model = new FileDataModel(new File(pathWriter)); + UserSimilarity similarity = new PearsonCorrelationSimilarity(model); + UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); + recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); + } + + public int getTotalReviews() { + return totalReviews; + } + + public int getTotalProducts() { + return totalProducts; + } + + public int getTotalUsers() { + return totalUsers; + } + + public List getRecommendationsForUser(String userId) throws TasteException { + List list = new ArrayList(); + int id = users.get(userId); + List recommendations = recommender.recommend(id, 3); + BiMap inverseProducts = products.inverse(); + for (RecommendedItem recommendation: recommendations) { + list.add(inverseProducts.get((int) recommendation.getItemID())); + } + return list; + } + +} diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java index 0d0b1fe..54b0346 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("D:/Charlitos/Nearsoft/programs/Semana_3/movies.txt"); assertEquals(7911684, recommender.getTotalReviews()); assertEquals(253059, recommender.getTotalProducts()); assertEquals(889176, recommender.getTotalUsers()); diff --git a/target/big-data-1.0-SNAPSHOT.jar b/target/big-data-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..ba2396e Binary files /dev/null and b/target/big-data-1.0-SNAPSHOT.jar differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..4485044 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sun Apr 19 21:24:13 MST 2020 +groupId=nearsoft.academy +artifactId=big-data +version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..14095b7 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,2 @@ +nearsoft\academy\bigdata\recommendation\MovieRecommender.class +nearsoft\academy\bigdata\recommendation\MovieRecommenderTest.class diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..092df19 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,2 @@ +D:\NetBeansProjects\big-data-exercises-master\src\test\java\nearsoft\academy\bigdata\recommendation\MovieRecommenderTest.java +D:\NetBeansProjects\big-data-exercises-master\src\test\java\nearsoft\academy\bigdata\recommendation\MovieRecommender.java diff --git a/target/surefire-reports/TEST-nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.xml b/target/surefire-reports/TEST-nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.xml new file mode 100644 index 0000000..526920d --- /dev/null +++ b/target/surefire-reports/TEST-nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/target/surefire-reports/nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.txt b/target/surefire-reports/nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.txt new file mode 100644 index 0000000..ebeb4f4 --- /dev/null +++ b/target/surefire-reports/nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: nearsoft.academy.bigdata.recommendation.MovieRecommenderTest +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 520.792 sec diff --git a/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommender.class b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommender.class new file mode 100644 index 0000000..84cfe5b Binary files /dev/null and b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommender.class differ diff --git a/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.class b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.class new file mode 100644 index 0000000..56fcca4 Binary files /dev/null and b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.class differ