001 /** 002 * MoviesRecommender.java 003 * jCOLIBRI2 framework. 004 * @author Juan A. Recio-García. 005 * GAIA - Group for Artificial Intelligence Applications 006 * http://gaia.fdi.ucm.es 007 * 11/11/2007 008 */ 009 package jcolibri.test.recommenders.rec12; 010 011 import java.util.Collection; 012 013 import jcolibri.cbraplications.StandardCBRApplication; 014 import jcolibri.cbrcore.Attribute; 015 import jcolibri.cbrcore.CBRCase; 016 import jcolibri.cbrcore.CBRCaseBase; 017 import jcolibri.cbrcore.CBRQuery; 018 import jcolibri.cbrcore.Connector; 019 import jcolibri.connector.PlainTextConnector; 020 import jcolibri.exception.ExecutionException; 021 import jcolibri.extensions.recommendation.ContentBasedProfile.ObtainQueryFromProfile; 022 import jcolibri.extensions.recommendation.casesDisplay.DisplayCasesTableMethod; 023 import jcolibri.extensions.recommendation.casesDisplay.UserChoice; 024 import jcolibri.extensions.recommendation.collaborative.CollaborativeRetrievalMethod; 025 import jcolibri.extensions.recommendation.collaborative.MatrixCaseBase; 026 import jcolibri.extensions.recommendation.collaborative.PearsonMatrixCaseBase; 027 import jcolibri.extensions.recommendation.conditionals.BuyOrQuit; 028 import jcolibri.method.retrieve.RetrievalResult; 029 import jcolibri.method.retrieve.selection.SelectCases; 030 import jcolibri.test.recommenders.rec12.moviesDB.Rating; 031 import jcolibri.test.recommenders.rec12.moviesDB.User; 032 033 /** 034 * Single-Shot movies recommender obtaining description from profile and scoring cases using collaborative recommendation. 035 * <br> 036 * This recommender uses a collaborative retrieval algorithm. These collaborative algorithms 037 * return items depending on the recommendations of other users. They require an special organization of the 038 * case base to be executed (see {@link jcolibri.extensions.recommendation.collaborative.PearsonMatrixCaseBase}). 039 * The query is obtained from a serialized profile following the behaviour of many existing on-line movies recommenders. 040 * <br>Summary: 041 * <ul> 042 * <li>Type: Single-Shot 043 * <li>Case base: movies 044 * <li>One off Preference Elicitation: Profile 045 * <li>Retrieval: Collaborative + topKselection 046 * <li>Display: In table (basic) 047 * </ul> 048 * This recommender implements the following template:<br> 049 * <center><img src="../Template1_Cycle.jpg"/></center> 050 * 051 * <br>Read the documentation of the recommenders extension for details about templates 052 * and recommender strategies: {@link jcolibri.extensions.recommendation} 053 * 054 * @see jcolibri.extensions.recommendation.ContentBasedProfile.ObtainQueryFromProfile 055 * @see jcolibri.extensions.recommendation.collaborative.CollaborativeRetrievalMethod 056 * @see jcolibri.method.retrieve.selection.SelectCases 057 * @see jcolibri.extensions.recommendation.casesDisplay.DisplayCasesTableMethod 058 * 059 * 060 * @author Juan A. Recio-Garcia 061 * @author Developed at University College Cork (Ireland) in collaboration with Derek Bridge. 062 * @version 1.0 063 * 064 */ 065 public class MoviesRecommender implements StandardCBRApplication 066 { 067 /** Connector object */ 068 Connector _connector; 069 /** CaseBase object */ 070 PearsonMatrixCaseBase _caseBase; 071 072 /* (non-Javadoc) 073 * @see jcolibri.cbraplications.StandardCBRApplication#configure() 074 */ 075 public void configure() throws ExecutionException 076 { 077 // Create a data base connector 078 _connector = new PlainTextConnector(); 079 // Init the ddbb connector with the config file 080 _connector.initFromXMLfile(jcolibri.util.FileIO 081 .findFile("jcolibri/test/recommenders/rec12/plaintextconfig.xml")); 082 // Create a Lineal case base for in-memory organization 083 _caseBase = new PearsonMatrixCaseBase(new Attribute("rating", Rating.class), 20); 084 085 } 086 087 /* (non-Javadoc) 088 * @see jcolibri.cbraplications.StandardCBRApplication#cycle(jcolibri.cbrcore.CBRQuery) 089 */ 090 public void cycle(CBRQuery query) throws ExecutionException 091 { 092 query = ObtainQueryFromProfile.obtainQueryFromProfile( "src/jcolibri/test/recommenders/rec12/profile.xml"); 093 094 Collection<RetrievalResult> res = CollaborativeRetrievalMethod.getRecommendation(_caseBase, query, 10); 095 096 Collection<CBRCase> cases = SelectCases.selectTopK(res, 5); 097 098 UserChoice choice = DisplayCasesTableMethod.displayCasesInTableBasic(cases); 099 100 // Buy or Quit 101 if(BuyOrQuit.buyOrQuit(choice)) 102 System.out.println("Finish - User Buys: "+choice.getSelectedCase()); 103 104 else 105 System.out.println("Finish - User Quits"); 106 107 } 108 109 /* (non-Javadoc) 110 * @see jcolibri.cbraplications.StandardCBRApplication#postCycle() 111 */ 112 public void postCycle() throws ExecutionException 113 { 114 // TODO Auto-generated method stub 115 116 } 117 118 /* (non-Javadoc) 119 * @see jcolibri.cbraplications.StandardCBRApplication#preCycle() 120 */ 121 public CBRCaseBase preCycle() throws ExecutionException 122 { 123 // Load cases from connector into the case base 124 _caseBase.init(_connector); 125 // Print the cases 126 java.util.Collection<CBRCase> cases = _caseBase.getCases(); 127 // for(CBRCase c: cases) 128 // System.out.println(c); 129 org.apache.commons.logging.LogFactory.getLog(this.getClass()).info(cases.size() +" cases loaded"); 130 return _caseBase; 131 } 132 133 /** 134 * @param args 135 */ 136 public static void main(String[] args) 137 { 138 //SwingProgressBar shows the progress 139 jcolibri.util.ProgressController.clear(); 140 jcolibri.util.ProgressController.register(new jcolibri.test.main.SwingProgressBar(), MatrixCaseBase.class); 141 142 143 144 StandardCBRApplication recommender = new MoviesRecommender(); 145 try 146 { 147 recommender.configure(); 148 149 recommender.preCycle(); 150 151 CBRQuery query = new CBRQuery(); 152 query.setDescription(new User()); 153 154 recommender.cycle(query); 155 156 recommender.postCycle(); 157 158 //System.exit(0); 159 } catch (Exception e) 160 { 161 org.apache.commons.logging.LogFactory.getLog(MoviesRecommender.class).error(e); 162 163 } 164 165 166 } 167 168 }