List of usage examples for org.apache.mahout.cf.taste.impl.recommender GenericItemBasedRecommender GenericItemBasedRecommender
public GenericItemBasedRecommender(DataModel dataModel, ItemSimilarity similarity)
From source file:ItemRecommender.java
License:Apache License
/** * Creates a list of recommendations using item based collaborative filtering * // w ww. ja v a 2s .c o m * @param model a model containing information about users preferences for items. Fetched from "collaborative_view" in the database * @return the list of recommendations made */ public ArrayList<CollaborativeRecommendation> RunItemRecommender(DataModel model) { ArrayList<CollaborativeRecommendation> recommendedItemsList = new ArrayList<CollaborativeRecommendation>(); try { /* Returns the degree of similarity, of two items, based on the preferences that users have expressed for the items. */ ItemSimilarity sim = new LogLikelihoodSimilarity(model); /* Given a datamodel and a similarity to produce the recommendations */ GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(model, sim); this.recommender = recommender; List<RecommendedItem> recommendations = recommender.recommend(this.userId, 167); /* Looping through all recommendations and putting up to 167 items in the collaborative recommender list*/ if (!recommendations.isEmpty()) { for (RecommendedItem recommendation : recommendations) { recommendedItemsList .add(new CollaborativeRecommendation(recommendation, (int) this.userId, "item")); } } else { /*There are no recommendations for this user*/ System.out.println("No recommendations for this user in itembased"); } } catch (TasteException e) { e.printStackTrace(); } return recommendedItemsList; }
From source file:recom.java
/** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> * methods./* w w w . j av a 2 s .co m*/ * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, TasteException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { DataModel dm = new FileDataModel(new File("info/movies.csv")); ItemSimilarity us = new PearsonCorrelationSimilarity(dm); //UserNeighborhood neighborhood = new NearestNUserNeighborhood(25, us, dm); GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dm, us); List<RecommendedItem> recommendations = recommender.recommend(1, 5); /* TODO output your page here. You may use following sample code. */ out.println("<html>"); out.println("<head>"); out.println("<title>Servlet recom</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet recom at " + request.getContextPath() + "</h1>"); out.println("</body>"); out.println("</html>"); } }
From source file:ContentBasedRecommender.java
License:Apache License
/** * Method the creates a list of recommendations. * Already rated stories are excluded, as are stories present in the front end array if add="true" * /*ww w .j a v a2s . c o m*/ * @throws TasteException thrown if there if something went wrong with Mahout */ public void runContentBasedRecommender() throws TasteException { /*Find out where this file is located*/ try { fileLocation = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } /*"content"+userId is the name of the view we shall create*/ conn.setConnection(); /*Create a temporary view the includes all preferences values for this user*/ conn.createView((int) userId); /*Sets the dataModel based on the data in the created view*/ conn.setDataModel(); DataModel model = conn.getDataModel(); /*Gets all the info from the similarites.csv file into a list of objects accepted by Mahout*/ Collection<ItemItemSimilarity> sim = getStorySimilarities(); /*GenericItemBasedRecommender need an ItemSimilarity-object as input, so create an instance of this class.*/ ItemSimilarity similarity = new GenericItemSimilarity(sim); /*Create a new Recommender-instance with our datamodel and story similarities*/ GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(model, similarity); /* Compute the recommendations. model.getNumItems() is the number of recommendations we want (we don't really want that many, * but we don't know how many of the top items the user already have rated), don't worry about the null, * and true tells the recommender that we want to include already known items*/ List<RecommendedItem> recommendations = recommender.recommend(userId, model.getNumItems(), null, true); /*Find the stories that the user have rated*/ HashMap<Integer, Integer> ratedStories = conn.getRated((int) userId); ArrayList<Integer> frontendStories = new ArrayList<>(); /* Find the stories already present in the recommendations list at front end * These stories should not be recommended again*/ if (add.equals("true")) { frontendStories = conn.getStoriesInFrontendArray((int) userId); } int ranking = 1; Random rand = new Random(); int randomDislikedRanking = rand.nextInt(6) + 5; ArrayList<DatabaseInsertObject> itemsToBeInserted = new ArrayList<>(); ArrayList<Long> idsToBeInserted = new ArrayList<>(); for (RecommendedItem recommendation : recommendations) { /* To get a story outside of the users preferences, finds the least recommended story */ if (randomDislikedRanking == ranking) { /*Make sure the false recommendation is not already in the front end array or already among the top ten recommendation (may happen if the user doesn't have many not seen/not rated stories left) */ for (int i = 1; i < recommendations.size(); i++) { long dislikedStoryId = recommendations.get(recommendations.size() - i).getItemID(); if (!frontendStories.contains((int) dislikedStoryId) && !idsToBeInserted.contains(dislikedStoryId) && ratedStories.get((int) dislikedStoryId) == null) { itemsToBeInserted.add(new DatabaseInsertObject((int) userId, "DF." + dislikedStoryId, "FalseRecommendation", 1, 0, ranking, recommendations.get(recommendations.size() - i).getValue())); idsToBeInserted.add(dislikedStoryId); System.out.print("False recommend: "); System.out.println(dislikedStoryId); break; } } ranking++; if (ranking > 10) { break; } continue; } /*If the item has not been rated,is not already in the recommendation list at front end or already a false recommendation we insert it*/ if ((ratedStories.get((int) recommendation.getItemID()) == null) && !frontendStories.contains((int) recommendation.getItemID()) && !idsToBeInserted.contains(recommendation.getItemID())) { /*Get the 30 items that had most influence on the recommendation*/ List<RecommendedItem> becauseItems = recommender.recommendedBecause(userId, recommendation.getItemID(), 30); int counter = 1; ArrayList<RecommendedItem> explanationItems = new ArrayList<>(); for (RecommendedItem because : becauseItems) { /*Add story to explanation if this story has been rated and the rating is good*/ if (!explanationItems.contains(because) && ratedStories.get((int) because.getItemID()) != null && ratedStories.get((int) because.getItemID()) > 2) { explanationItems.add(because); counter++; } if (counter > 3) { break; } } /*Gets the titles of the explanation-stories and creates a string*/ String explanation = conn.createExplanation(explanationItems); itemsToBeInserted.add(new DatabaseInsertObject((int) userId, "DF." + recommendation.getItemID(), explanation, 0, 0, ranking, recommendation.getValue())); idsToBeInserted.add(recommendation.getItemID()); System.out.println(recommendation); ranking++; } /*When we got 10 new recommendations, we're happy*/ if (ranking > 10) { break; } } this.recommendations = recommendations; /*Delete the current recommendations stored in stored_story that has not been seen by the user*/ conn.deleteRecommendations((int) userId); /*Insert the 10 items we found*/ conn.insertUpdateRecommendValues(itemsToBeInserted); /*Drop our temporary view*/ conn.dropView(); conn.closeConnection(); }
From source file:businessreco.BusinessReco.java
public static void main(String args[]) { try {/*from ww w.j a v a2 s . com*/ //Loading the DATA; DataModel dm = new FileDataModel(new File( "C:\\Users\\bryce\\Course Work\\3. Full Summer\\Big Data\\Final Project\\Yelp\\FINAL CODE\\Mahout\\data\\busirec_new.csv")); // We use the below line to relate businesses. //ItemSimilarity sim = new LogLikelihoodSimilarity(dm); TanimotoCoefficientSimilarity sim = new TanimotoCoefficientSimilarity((dm)); //Using the below line get recommendations GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dm, sim); //Looping through every business. for (LongPrimitiveIterator items = dm.getItemIDs(); items.hasNext();) { long itemId = items.nextLong(); // For each business we recommend 3 businesses. List<RecommendedItem> recommendations = recommender.mostSimilarItems(itemId, 2); for (RecommendedItem recommendation : recommendations) { System.out.println(itemId + "," + recommendation.getItemID() + "," + recommendation.getValue()); } } } catch (IOException | TasteException e) { System.out.println(e); } }
From source file:cf.wikipedia.WikipediaTasteItemItemDemo.java
License:Apache License
public static void main(String[] args) throws IOException, TasteException, SAXException, ParserConfigurationException { String recsFile = args[0];/*www . jav a 2 s . c om*/ String docIdsTitle = args[1]; long userId = Long.parseLong(args[2]); //Integer neighbors = Integer.parseInt(args[2]); InputSource is = new InputSource(new FileInputStream(docIdsTitle)); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(false); SAXParser sp = factory.newSAXParser(); WikiContentHandler handler = new WikiContentHandler(); sp.parse(is, handler); //create the data model FileDataModel dataModel = new FileDataModel(new File(recsFile)); //Create an ItemSimilarity ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel); //Create an Item Based Recommender ItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity); //Get the recommendations List<RecommendedItem> recommendations = recommender.recommend(userId, 5); TasteUtils.printRecs(recommendations, handler.map); }
From source file:cf.wikipedia.WikipediaTasteItemRecDemo.java
License:Apache License
public static void main(String[] args) throws IOException, TasteException, SAXException, ParserConfigurationException { String recsFile = args[0];/*from w ww.j av a2 s . c om*/ String docIdsTitle = args[1]; long itemId = Long.parseLong(args[2]); Integer numRecs = Integer.parseInt(args[3]); //Integer neighbors = Integer.parseInt(args[2]); InputSource is = new InputSource(new FileInputStream(docIdsTitle)); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(false); SAXParser sp = factory.newSAXParser(); WikiContentHandler handler = new WikiContentHandler(); //load the ids and titles sp.parse(is, handler); //create the data model FileDataModel dataModel = new FileDataModel(new File(recsFile)); //Create an ItemSimilarity ItemSimilarity itemSimilarity = new LogLikelihoodSimilarity(dataModel); //Create an Item Based Recommender ItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity); //Get the recommendations for the Item List<RecommendedItem> simItems = recommender.mostSimilarItems(itemId, numRecs); TasteUtils.printRecs(simItems, handler.map); }
From source file:com.anjuke.romar.mahout.factory.MahoutServiceItemRecommendFactory.java
License:Apache License
@Override public MahoutService createService() { RomarConfig config = RomarConfig.getInstance(); Recommender recommender;//from w w w . j av a 2 s. com DataModel dataModel = PersistenceDataModelFactory.createDataModel(config); ItemSimilarity similarity; if (config.isUseFileSimilarity()) { File file = new File(config.getSimilarityFile()); if (!file.exists()) { throw new IllegalArgumentException("similairy file not exists"); } if (!file.isFile()) { throw new IllegalArgumentException("similairy file is a directory"); } IteratorBuiler<ItemItemSimilarity> iteratorBuilder; if (config.isBinarySimilarityFile()) { iteratorBuilder = RomarFileSimilarityIterator.dataFileItemIteratorBuilder(); } else { iteratorBuilder = RomarFileSimilarityIterator.lineFileItemIteratorBuilder(); } similarity = new RomarFileItemSimilarity(file, iteratorBuilder); } else { similarity = createSimilarity(config, dataModel); if (config.isUseSimilariyCache()) { similarity = new CachingItemSimilarity(similarity, config.getSimilarityCacheSize()); } } recommender = new GenericItemBasedRecommender(dataModel, similarity); return new RecommenderWrapper(recommender); }
From source file:com.anjuke.romar.mahout.GenericReloadDataModelTest.java
License:Apache License
@Test public void test() throws TasteException { GenericReloadDataModel model = new GenericReloadDataModel(); ItemBasedRecommender recommender = new GenericItemBasedRecommender(model, new CachingItemSimilarity(new TanimotoCoefficientSimilarity(model), 100)); recommender.setPreference(1, 1, 5f); recommender.setPreference(1, 2, 1f); recommender.setPreference(2, 1, 1f); recommender.setPreference(2, 2, 5f); recommender.refresh(null);//from www. ja v a 2 s . co m assertEquals(0, recommender.recommend(1, 5).size()); recommender.setPreference(2, 3, 1f); recommender.refresh(null); assertEquals(1, recommender.recommend(1, 5).size()); recommender.setPreference(2, 4, 1f); recommender.refresh(null); assertEquals(2, recommender.recommend(1, 5).size()); assertEquals(2, recommender.recommend(1, 5).size()); }
From source file:com.github.gurelkaynak.recommendationengine.core.RecommenderFactory.java
public ItemBasedRecommender buildItemBasedRecommender(DataModel dataModel) { ItemBasedRecommender recommender;//from w w w.j a v a2 s .com recommender = null; try { ItemSimilarity similarity = new CachingItemSimilarity(new TanimotoCoefficientSimilarity(dataModel), dataModel); recommender = new GenericItemBasedRecommender(dataModel, similarity); } catch (TasteException exception) { System.err.println(exception); } return recommender; }
From source file:com.rssrecommender.services.MahoutService.java
@PostConstruct public void init() { try {/*from w ww .j a v a2s .c om*/ dataSource = new MysqlConnectionPoolDataSource(); dataSource.setServerName("localhost"); dataSource.setUser("root"); dataSource.setPassword("1234"); dataSource.setDatabaseName("rss_rec"); dataSource.setCachePreparedStatements(true); dataSource.setCachePrepStmts(true); dataSource.setCacheResultSetMetadata(true); dataSource.setAlwaysSendSetIsolation(true); dataSource.setElideSetAutoCommits(true); model = new MySQLJDBCDataModel(dataSource, "user_likes_article", "user_id", "article_id", "rating", null); m = new ReloadFromJDBCDataModel(model); is = new PearsonCorrelationSimilarity(m); // ItemSimilarity is = new EuclideanDistanceSimilarity(model, Weighting.WEIGHTED); // cis = new CachingItemSimilarity(is, 150); r = new GenericItemBasedRecommender(m, is); rsr = new IDRescorer() { @Override public double rescore(long id, double originalScore) { Article a = af.find((int) id); long diff = Calendar.getInstance().getTimeInMillis() - a.getDate().getTime() + 1; double time = 1.0d / (diff / (1000 * 360 * 12)); // half day period since feeds are update regularly return originalScore * time; } @Override public boolean isFiltered(long id) { //always rescore return false; } }; // Optimizer optimizer = new ConjugateGradientOptimizer(); // r = new KnnItemBasedRecommender(m, is, optimizer, 5); // } catch (TasteException ex) { Logger.getLogger(MahoutService.class.getName()).log(Level.SEVERE, null, ex); } }