diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..75b806f --- /dev/null +++ b/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..f150976 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + big-data + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..8dd9b1d --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..ac8e750 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml index 8169ff7..bd68aa7 100644 --- a/pom.xml +++ b/pom.xml @@ -10,9 +10,25 @@ big-data http://maven.apache.org + + + + org,apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + + + UTF-8 + + 11 + 11 + + + @@ -20,6 +36,8 @@ mahout-core 0.9 + + junit junit 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..eaf2346 --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,128 @@ +/* + * 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.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 fabrizzioalco + */ + +public class MovieRecommender { + private int totalReviews; + private int totalProducts; + private int totalUsers; + + + HashMap Users = new HashMap(); + HashMap Products = new HashMap(); + HashMap Products2 = new HashMap(); + + MovieRecommender(String path) throws FileNotFoundException, IOException{ + + //writing the txt file + File movieFile = new File(path); + BufferedReader bufferInput = new BufferedReader(new FileReader(movieFile)); + + //Writing the txt to csv + File newMovieFile = new File("amazonMovies.csv"); + FileWriter fw = new FileWriter(newMovieFile); + BufferedWriter bufferWriter = new BufferedWriter(fw); + + String userID = ""; + String productID = ""; + String userMovieScore = ""; + String line; + + while((line = bufferInput.readLine()) != null){ + + switch(line.split(" ")[0]){ + case "review/userId:": + userID = line.split(" ")[1]; + + if(Users.containsKey(userID) != true){ + Users.put(userID, totalUsers); + totalUsers++; + + } + break; + case "product/productId:": + productID = line.split(" ")[1]; + if(Products.containsKey(productID) != true){ + totalProducts++; + Products.put(productID, totalProducts); + Products2.put(totalProducts, productID); + + } + break; + case "review/score:": + totalReviews++; + userMovieScore = line.split(" ")[1]; + bufferWriter.write(totalUsers + "," + totalProducts + "," + userMovieScore); + break; + } + + } + bufferInput.close(); + bufferWriter.close(); + } + + 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{ + + DataModel model = new FileDataModel(new File("amazonMovies.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(Users.get(userID), 3); + + List res = new ArrayList(); + + for(RecommendedItem recommendation: recommendations){ + res.add(Products2.get((int) recommendation.getItemID())); + } + + return res; + } + + + +} + diff --git a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java index 0d0b1fe..2c4666a 100644 --- a/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java @@ -15,10 +15,10 @@ 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"); - assertEquals(7911684, recommender.getTotalReviews()); - assertEquals(253059, recommender.getTotalProducts()); - assertEquals(889176, recommender.getTotalUsers()); + MovieRecommender recommender = new MovieRecommender("/Users/fabrizzioalco/Documents/movies.txt"); + assertEquals(2061014, recommender.getTotalReviews()); + assertEquals(66044, recommender.getTotalProducts()); + assertEquals(525481, recommender.getTotalUsers()); List recommendations = recommender.getRecommendationsForUser("A141HP4LYPWMSR"); assertThat(recommendations, hasItem("B0002O7Y8U")); diff --git a/target/classes/.netbeans_automatic_build b/target/classes/.netbeans_automatic_build new file mode 100644 index 0000000..e69de29 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..ba4b625 --- /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..58eea46 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,2 @@ +/Users/fabrizzioalco/Documents/nearsoft/big-data/big-data-exercises/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.java +/Users/fabrizzioalco/Documents/nearsoft/big-data/big-data-exercises/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..1706b2f --- /dev/null +++ b/target/surefire-reports/TEST-nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.mahout.cf.taste.common.NoSuchUserException: 0 + at org.apache.mahout.cf.taste.impl.model.GenericDataModel.getPreferencesFromUser(GenericDataModel.java:213) + at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.getPreferencesFromUser(FileDataModel.java:665) + at org.apache.mahout.cf.taste.impl.similarity.AbstractSimilarity.userSimilarity(AbstractSimilarity.java:112) + at org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity.userSimilarity(PearsonCorrelationSimilarity.java:60) + at org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood.getUserNeighborhood(ThresholdUserNeighborhood.java:89) + at org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender.recommend(GenericUserBasedRecommender.java:87) + at org.apache.mahout.cf.taste.impl.recommender.AbstractRecommender.recommend(AbstractRecommender.java:63) + at nearsoft.academy.bigdata.recommendation.MovieRecommender.getRecommendationsForUser(MovieRecommender.java:114) + at nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.testDataInfo(MovieRecommenderTest.java:23) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) + at org.junit.runners.ParentRunner.run(ParentRunner.java:236) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) + at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) + at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) + + SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". +SLF4J: Defaulting to no-operation (NOP) logger implementation +SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. + + + \ 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..77ac12f --- /dev/null +++ b/target/surefire-reports/nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.txt @@ -0,0 +1,44 @@ +------------------------------------------------------------------------------- +Test set: nearsoft.academy.bigdata.recommendation.MovieRecommenderTest +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 26.341 sec <<< FAILURE! +testDataInfo(nearsoft.academy.bigdata.recommendation.MovieRecommenderTest) Time elapsed: 26.292 sec <<< ERROR! +org.apache.mahout.cf.taste.common.NoSuchUserException: 0 + at org.apache.mahout.cf.taste.impl.model.GenericDataModel.getPreferencesFromUser(GenericDataModel.java:213) + at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.getPreferencesFromUser(FileDataModel.java:665) + at org.apache.mahout.cf.taste.impl.similarity.AbstractSimilarity.userSimilarity(AbstractSimilarity.java:112) + at org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity.userSimilarity(PearsonCorrelationSimilarity.java:60) + at org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood.getUserNeighborhood(ThresholdUserNeighborhood.java:89) + at org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender.recommend(GenericUserBasedRecommender.java:87) + at org.apache.mahout.cf.taste.impl.recommender.AbstractRecommender.recommend(AbstractRecommender.java:63) + at nearsoft.academy.bigdata.recommendation.MovieRecommender.getRecommendationsForUser(MovieRecommender.java:114) + at nearsoft.academy.bigdata.recommendation.MovieRecommenderTest.testDataInfo(MovieRecommenderTest.java:23) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) + at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) + at org.junit.runners.ParentRunner.run(ParentRunner.java:236) + at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) + at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) + at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:566) + at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) + at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) + at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) + diff --git a/target/test-classes/.netbeans_automatic_build b/target/test-classes/.netbeans_automatic_build new file mode 100644 index 0000000..e69de29 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..01c9e0c 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..75a598b Binary files /dev/null and b/target/test-classes/nearsoft/academy/bigdata/recommendation/MovieRecommenderTest.class differ