001    /**
002     * Test13b.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     * 23/06/2007
008     */
009    package jcolibri.test.test13;
010    
011    import java.util.Collection;
012    
013    import jcolibri.casebase.LinealCaseBase;
014    import jcolibri.cbraplications.StandardCBRApplication;
015    import jcolibri.cbrcore.Attribute;
016    import jcolibri.cbrcore.CBRCase;
017    import jcolibri.cbrcore.CBRCaseBase;
018    import jcolibri.cbrcore.CBRQuery;
019    import jcolibri.cbrcore.Connector;
020    import jcolibri.exception.ExecutionException;
021    import jcolibri.extensions.textual.IE.opennlp.IETextOpenNLP;
022    import jcolibri.extensions.textual.lucene.LuceneIndex;
023    import jcolibri.method.retrieve.RetrievalResult;
024    import jcolibri.method.retrieve.NNretrieval.NNConfig;
025    import jcolibri.method.retrieve.NNretrieval.NNScoringMethod;
026    import jcolibri.method.retrieve.NNretrieval.similarity.global.Average;
027    import jcolibri.method.retrieve.NNretrieval.similarity.local.textual.LuceneTextSimilarity;
028    import jcolibri.method.retrieve.selection.SelectCases;
029    import jcolibri.test.main.SwingProgressBar;
030    import jcolibri.test.test13.connector.RestaurantsConnector;
031    import jcolibri.test.test13.gui.ResultFrame;
032    
033    /**
034     * This test shows how to use the Apache Lucene search engine in a Restaurant recommender. 
035     * <br>
036     * It uses a custum connector (RestaurantConnector) that loads cases from a normal txt file.
037     * <br>
038     * To compare the texts it uses the Lucene similarity function implemented in jcolibri.method.retrieve.NNretrieval.similarity.local.textual.LuceneTextSimilarity
039     * <br>
040     * Test13a shows whot tu use other textual similarity function from the jcolibri.method.retrieve.NNretrieval.similarity.local.textual package.
041     * 
042     * @author Juan A. Recio-Garcia
043     * @version 1.0
044     * @see jcolibri.method.retrieve.NNretrieval.similarity.local.textual.LuceneTextSimilarity
045     * @see jcolibri.test.test13.connector.RestaurantsConnector
046     */
047    public class Test13b implements StandardCBRApplication
048    {
049    
050        Connector _connector;
051        CBRCaseBase _caseBase;
052    
053        LuceneIndex luceneIndex;
054        
055        /*
056         * (non-Javadoc)
057         * 
058         * @see jcolibri.cbraplications.BasicCBRApplication#configure()
059         */
060        public void configure() throws ExecutionException
061        {
062            try
063            {
064                _connector = new RestaurantsConnector("jcolibri/test/test13/restaurants-large-v2.txt");
065                _caseBase = new LinealCaseBase();
066                
067                jcolibri.util.ProgressController.clear();
068                SwingProgressBar pb = new SwingProgressBar();
069                jcolibri.util.ProgressController.register(pb);   
070            } catch (Exception e)
071            {
072                throw new ExecutionException(e);
073            }
074        }
075    
076        /*
077         * (non-Javadoc)
078         * 
079         * @see jcolibri.cbraplications.StandardCBRApplication#preCycle()
080         */
081        public CBRCaseBase preCycle() throws ExecutionException
082        {
083            _caseBase.init(_connector);
084    
085            //Here we create the Lucene index
086            luceneIndex = jcolibri.method.precycle.LuceneIndexCreator.createLuceneIndex(_caseBase);
087            
088            return _caseBase;
089        }
090    
091        /*
092         * (non-Javadoc)
093         * 
094         * @see jcolibri.cbraplications.StandardCBRApplication#cycle(jcolibri.cbrcore.CBRQuery)
095         */
096        public void cycle(CBRQuery query) throws ExecutionException
097        {
098            Collection<CBRCase> cases = _caseBase.getCases();
099            
100            NNConfig nnConfig = new NNConfig();
101            nnConfig.setDescriptionSimFunction(new Average());
102            
103            
104            //We only compare the "description" attribute using Lucene
105            Attribute textualAttribute = new Attribute("description", RestaurantDescription.class);
106            nnConfig.addMapping(textualAttribute, new LuceneTextSimilarity(luceneIndex,query,textualAttribute, true));
107    
108            
109            System.out.println("RESULT: ");
110            
111            Collection<RetrievalResult> res = NNScoringMethod.evaluateSimilarity(cases, query, nnConfig);
112            res = SelectCases.selectTopKRR(res, 5);
113            
114            for(RetrievalResult rr: res)
115                System.out.println(rr);
116            
117            RestaurantDescription qrd = (RestaurantDescription)query.getDescription();
118            CBRCase mostSimilar = res.iterator().next().get_case();
119            RestaurantDescription rrd = (RestaurantDescription)mostSimilar.getDescription();
120            new ResultFrame(qrd.getDescription().getRAWContent(), rrd.getName(), rrd.getAddress(), rrd.getDescription().getRAWContent());
121    
122        }
123    
124        /*
125         * (non-Javadoc)
126         * 
127         * @see jcolibri.cbraplications.StandardCBRApplication#postCycle()
128         */
129        public void postCycle() throws ExecutionException
130        {
131            _connector.close();
132    
133        }
134    
135        
136        public static void main(String[] args)
137        {
138            Test13b test = new Test13b();
139            try
140            {
141                test.configure();
142                
143                CBRCaseBase caseBase = test.preCycle();
144               
145                System.out.println("CASE BASE: ");
146                for(CBRCase c: caseBase.getCases())
147                    System.out.println(c);
148                System.out.println("Total: "+caseBase.getCases().size()+" cases");
149    
150                boolean _continue = true;
151                while(_continue)
152                {
153                        String queryString = javax.swing.JOptionPane.showInputDialog("Please enter the restaurant description:");
154                        if(queryString == null)
155                            _continue = false;
156                        else
157                        {   
158                                CBRQuery query = new CBRQuery();
159                                RestaurantDescription queryDescription = new RestaurantDescription();
160                                queryDescription.setDescription(new IETextOpenNLP(queryString));
161                                query.setDescription(queryDescription);
162                                
163                                test.cycle(query);
164                        }
165                }
166                test.postCycle();
167                
168            } catch (ExecutionException e)
169            {
170                org.apache.commons.logging.LogFactory.getLog(Test13b.class).error(e);
171            }
172        }
173    }