diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..61e0943 Binary files /dev/null and b/.DS_Store differ diff --git a/data/.DS_Store b/data/.DS_Store new file mode 100644 index 0000000..d87d959 Binary files /dev/null and b/data/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..af53228 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..5c022e0 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..01c0e07 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..ba52ac7 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..b8c2689 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..479bec1 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/MovieRecommender.java b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java new file mode 100644 index 0000000..1e4b496 --- /dev/null +++ b/src/test/java/nearsoft/academy/bigdata/recommendation/MovieRecommender.java @@ -0,0 +1,130 @@ +package nearsoft.academy.bigdata.recommendation; + +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; +//Librerías de mahoot necesarias para el recommender + +import java.io.*; +import java.util.*; +import java.util.zip.*; +//Librerías para el manejo de archivos zip en java + +public class MovieRecommender { + + HashMap uniqueUser = new HashMap(); + HashMap uniqueProduct = new HashMap(); + int totalReviews = 0; + //Aquí declaramos las variables globales que usaremos y devolveremos en métodos + + public MovieRecommender(String filename) throws IOException{ + //Constructor de la clase + + InputStream inputStream = new GZIPInputStream(new FileInputStream(filename)); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + String strCurrentLine; + //Construimos un objeto de BufferedReader para el archivo gzip dado + + String prodPattern = "product/productId: "; + String userPattern = "review/userId: "; + String scorePattern = "review/score: "; + //Variables con el patrón que buscaremos en las líneas + + String product = ""; + int productCont = 0; + String user = ""; + int userCont = 0; + String score = ""; + //Variables auxiliares donde almacenamos los valores de cada línea + + File moviesData = new File("data/moviesdb.csv"); + FileWriter writer = new FileWriter(moviesData); + BufferedWriter lineWritter = new BufferedWriter(writer); + //Construimos objeto para la creación y escritura de archivo csv + + while((strCurrentLine = br.readLine()) != null){ + //Cíclo para recorrer línea a línea del archivo + + if(strCurrentLine.contains(prodPattern)) { + product = strCurrentLine.substring(prodPattern.length()); + if(!this.uniqueProduct.containsKey(product)){ + this.uniqueProduct.put(product, productCont); + productCont++; + } + + } + if(strCurrentLine.contains(userPattern)) { + user = strCurrentLine.substring(userPattern.length()); + if(!this.uniqueUser.containsKey(user)){ + this.uniqueUser.put(user, userCont); + userCont++; + } + } + if(strCurrentLine.contains(scorePattern)) { + this.totalReviews++; + score = strCurrentLine.substring(scorePattern.length()); + lineWritter.write(this.uniqueUser.get(user) + "," + this.uniqueProduct.get(product) + "," + score + "\n"); + } + //Condicionales para encontrar patrones en las líneas, + //si se encuentra cierto patrón se procesa la línea dependiendo + //el patrón que se encuentr + } + lineWritter.close(); + writer.close(); + br.close(); + inputStream.close(); + + + } + + public String getKey(int val) + { + for(String key : this.uniqueProduct.keySet()){ + if(this.uniqueProduct.get(key) == val){ + return key; + } + } + return null; + } + //Método para devolver el key del hashmap de productos dado un valor + + public List getRecommendationsForUser(String user) throws IOException, TasteException { + + int numUser = this.uniqueUser.get(user); + List recs = new ArrayList(); + + DataModel model = new FileDataModel(new File("data/moviesdb.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(numUser, 3); + for (RecommendedItem recommendation : recommendations){ + recs.add(getKey((int)recommendation.getItemID())); + } + return recs; + } + //Implementación del recommender de 5 min dada la base de datos que constuimos + + public int getTotalReviews(){ + return this.totalReviews; + } + //Método para devolver el total de reviews + + public int getTotalProducts(){ + return this.uniqueProduct.size(); + } + //Método para devolver el total de productos únicos + + public int getTotalUsers(){ + return this.uniqueUser.size(); + } + //Método para devolver el total de usuarios únicos + +}