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 }