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    }