Example usage for org.apache.mahout.cf.taste.impl.recommender GenericItemBasedRecommender GenericItemBasedRecommender

List of usage examples for org.apache.mahout.cf.taste.impl.recommender GenericItemBasedRecommender GenericItemBasedRecommender

Introduction

In this page you can find the example usage for org.apache.mahout.cf.taste.impl.recommender GenericItemBasedRecommender GenericItemBasedRecommender.

Prototype

public GenericItemBasedRecommender(DataModel dataModel, ItemSimilarity similarity) 

Source Link

Usage

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);
    }
}