diff --git a/pom.xml b/pom.xml index 8169ff7..84bcbe4 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,8 @@ UTF-8 + 1.7 + 1.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..012a5a3 --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,121 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package nearsoft.academy.bigdata.recommendation; + +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.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +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 Ernesto + */ +public class MovieRecommender { + private int totalReviews = 0, totalUsers = 0, totalProducts=0; + private UserBasedRecommender recommender; + private HashMap users =new HashMap(); + private Hashtable products = new Hashtable<>(); + + public MovieRecommender(String path) throws IOException, TasteException{ + start(path); + } + private void start(String path) throws FileNotFoundException, IOException, TasteException { + String pathWriter= "src/test/java/nearsoft/academy/bigdata/recommendation/movies.csv"; + String userId="", productId= "", score, line; + int currentUser=0, currentProduct =0; + + File file = new File(path); + BufferedWriter writer; + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + writer = new BufferedWriter(new FileWriter(pathWriter)); + while((line =reader.readLine()) !=null){ + String[] part=line.split(": "); + switch(part[0]){ + case "product/productId": + productId = part[1]; + if (!products.containsKey(productId)) { + totalProducts++; + products.put(productId,totalProducts); + currentProduct = totalProducts; + }else{ + currentProduct = products.get(productId); + } + break; + case "review/userId": + userId = part[1]; + if (!users.containsKey(userId)) { + totalUsers++; + users.put(userId,totalUsers); + currentUser = totalUsers; + }else{ + currentUser = users.get(userId); + } + break; + case "review/score": + score = part[1]; + writer.write(currentUser+","+currentProduct+","+score+"\n"); + totalReviews++; + break; + } + } + reader.close(); + } + writer.close(); + DataModel model = new FileDataModel(new File(pathWriter)); + UserSimilarity similarity = new PearsonCorrelationSimilarity(model); + UserNeighborhood group = new ThresholdUserNeighborhood(0.1, similarity, model); + recommender = new GenericUserBasedRecommender(model, group, similarity); + } + public int getTotalReviews() { + return totalReviews; + } + + public int getTotalProducts() { + return totalProducts; + } + + public int getTotalUsers() { + return totalUsers; + } + public List getRecommendationsForUser(String userId) throws IOException, TasteException{ + List list = new ArrayList(); + int id= users.get(userId); + List recommendations = recommender.recommend(id, 3); + for(RecommendedItem recommendation: recommendations){ + list.add(getProductName((int)recommendation.getItemID())); + } + return list; + } + public String getProductName(int value){ + Enumeration e = products.keys(); + while (e.hasMoreElements()){ + String key = (String) e.nextElement(); + if (products.get(key)==value){ + return key; + } + } + return null; + } +} diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java index 0d0b1fe..e110c7a 100644 --- a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java @@ -1,11 +1,9 @@ package nearsoft.academy.bigdata.recommendation; -import org.apache.mahout.cf.taste.common.TasteException; import org.junit.Test; - import java.io.IOException; import java.util.List; - +import org.apache.mahout.cf.taste.common.TasteException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.hasItem; @@ -15,6 +13,8 @@ public class MovieRecommenderTest { public void testDataInfo() throws IOException, TasteException { //download movies.txt.gz from // http://snap.stanford.edu/data/web-Movies.html + MovieRecommender recommender; + MovieRecommender recommender = new MovieRecommender("/path/to/movies.txt.gz"); assertEquals(7911684, recommender.getTotalReviews()); assertEquals(253059, recommender.getTotalProducts()); @@ -24,7 +24,5 @@ public void testDataInfo() throws IOException, TasteException { assertThat(recommendations, hasItem("B0002O7Y8U")); assertThat(recommendations, hasItem("B00004CQTF")); assertThat(recommendations, hasItem("B000063W82")); - - } - } +} diff --git a/target/big-data-1.0-SNAPSHOT.jar b/target/big-data-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..464d84b 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..cd0a871 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon Apr 20 12:03:16 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..e69de29 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..ffbf53f --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,2 @@ +C:\Users\Ernesto\Desktop\big-data-exercises-master\src\test\java\nearsoft\academy\bigdata\recommendation\MovieRecommender.java +C:\Users\Ernesto\Desktop\big-data-exercises-master\src\test\java\nearsoft\academy\bigdata\recommendation\MovieRecommenderTest.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..9f1f183 --- /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..5e79cd9 --- /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: 973.576 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..8b43005 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$MovieRecommender.class b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest$MovieRecommender.class new file mode 100644 index 0000000..6ae9115 Binary files /dev/null and b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest$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..84afb54 Binary files /dev/null and b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.class differ