001 /** 002 * OntCosine.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/01/2007 008 */ 009 package jcolibri.method.retrieve.NNretrieval.similarity.local.ontology; 010 011 import java.util.ArrayList; 012 import java.util.HashSet; 013 import java.util.Iterator; 014 import java.util.Set; 015 016 import jcolibri.datatypes.Instance; 017 import jcolibri.exception.NoApplicableSimilarityFunctionException; 018 import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction; 019 import jcolibri.util.FileIO; 020 import jcolibri.util.OntoBridgeSingleton; 021 import es.ucm.fdi.gaia.ontobridge.OntoBridge; 022 import es.ucm.fdi.gaia.ontobridge.OntologyDocument; 023 024 /** 025 * This function computes the cosine similarity. 026 * See package documentation for details. 027 * 028 * @author Juan A. Recio-Garcia 029 * @version 1.0 030 * @see jcolibri.method.retrieve.NNretrieval.similarity.local 031 */ 032 public class OntCosine implements LocalSimilarityFunction { 033 034 /* (non-Javadoc) 035 * @see jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction#compute(java.lang.Object, java.lang.Object, jcolibri.cbrcore.CaseComponent, jcolibri.cbrcore.CaseComponent, jcolibri.cbrcore.CBRCase, jcolibri.cbrcore.CBRQuery, java.lang.String) 036 */ 037 public double compute(Object caseObject, Object queryObject) throws NoApplicableSimilarityFunctionException 038 { 039 if ((caseObject == null) || (queryObject == null)) 040 return 0; 041 if (!(caseObject instanceof Instance)) 042 throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), caseObject.getClass()); 043 if (!(queryObject instanceof Instance)) 044 throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), queryObject.getClass()); 045 046 Instance i1 = (Instance)caseObject; 047 Instance i2 = (Instance)queryObject; 048 049 if(i1.equals(i2)) 050 return 1; 051 052 053 OntoBridge ob = OntoBridgeSingleton.getOntoBridge(); 054 055 Set<String> sc1 = new HashSet<String>(); 056 for(Iterator<String> iter = ob.listBelongingClasses(i1.toString());iter.hasNext(); ) 057 sc1.add(iter.next()); 058 sc1.remove(ob.getThingURI()); 059 060 Set<String> sc2 = new HashSet<String>(); 061 for(Iterator<String> iter = ob.listBelongingClasses(i2.toString());iter.hasNext(); ) 062 sc2.add(iter.next()); 063 sc2.remove(ob.getThingURI()); 064 065 double sc1size = sc1.size(); 066 double sc2size = sc2.size(); 067 068 sc1.retainAll(sc2); 069 double intersectionsize = sc1.size(); 070 071 double res = intersectionsize / (Math.sqrt(sc1size)* Math.sqrt(sc2size)); 072 return res; 073 } 074 075 /** Applicable to Instance */ 076 public boolean isApplicable(Object o1, Object o2) 077 { 078 if((o1==null)&&(o2==null)) 079 return true; 080 else if(o1==null) 081 return o2 instanceof Instance; 082 else if(o2==null) 083 return o1 instanceof Instance; 084 else 085 return (o1 instanceof Instance)&&(o2 instanceof Instance); 086 } 087 088 /** 089 * Testing method using test5 ontology 090 */ 091 public static void main(String[] args) 092 { 093 try { 094 // Obtain a reference to OntoBridge 095 OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge(); 096 // Configure it to work with the Pellet reasoner 097 ob.initWithPelletReasoner(); 098 // Setup the main ontology 099 OntologyDocument mainOnto = new OntologyDocument("http://gaia.fdi.ucm.es/ontologies/vacation.owl", 100 FileIO.findFile("jcolibri/test/test5/vacation.owl").toExternalForm()); 101 // There are not subontologies 102 ArrayList<OntologyDocument> subOntologies = new ArrayList<OntologyDocument>(); 103 // Load the ontology 104 ob.loadOntology(mainOnto, subOntologies, false); 105 106 OntCosine sim = new OntCosine(); 107 108 System.out.println("cosine(CAR,TRAIN)="+sim.compute(new Instance("CAR"), new Instance("TRAIN"))); 109 System.out.println("cosine(CAR,IBIZA)="+sim.compute(new Instance("CAR"), new Instance("IBIZA"))); 110 System.out.println("cosine(CAR,I101)="+sim.compute(new Instance("CAR"), new Instance("I101"))); 111 112 }catch(Exception e) 113 { 114 org.apache.commons.logging.LogFactory.getLog(OntDeepBasic.class).error(e); 115 } 116 } 117 }