Mentions légales du service

Skip to content
Snippets Groups Projects
Commit a9667626 authored by Jérôme Euzenat's avatar Jérôme Euzenat
Browse files

- new revision of the string distance alignments

parent 6ed6c95b
No related branches found
No related tags found
No related merge requests found
/* /*
* $Id$ * $Id$
* *
* Copyright (C) INRIA Rhne-Alpes, 2003-2005 * Copyright (C) INRIA Rhne-Alpes, 2003-2006
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by * it under the terms of the GNU Lesser General Public License as published by
...@@ -100,11 +100,25 @@ public class DistanceAlignment extends BasicAlignment implements AlignmentProces ...@@ -100,11 +100,25 @@ public class DistanceAlignment extends BasicAlignment implements AlignmentProces
// This is a 1:1 alignment in fact // This is a 1:1 alignment in fact
else setType("11"); else setType("11");
getSimilarity().initialize( (OWLOntology)getOntology1(), (OWLOntology)getOntology2(), alignment ); sim.initialize( (OWLOntology)getOntology1(), (OWLOntology)getOntology2(), alignment );
getSimilarity().compute( params ); sim.compute( params );
if ( params.getParameter("printMatrix") != null ) printDistanceMatrix(params);
extract( getType(), params ); extract( getType(), params );
} }
public void printDistanceMatrix( Parameters params ){
System.out.println("\\documentclass{article}\n");
System.out.println("\\usepackage{graphics}\n");
System.out.println("\\begin{document}\n");
System.out.println("\\begin{figure}");
sim.printClassSimilarityMatrix("tex");
System.out.println();
sim.printPropertySimilarityMatrix("tex");
System.out.println("\\caption{Class distance with measure "+(String)params.getParameter("stringFunction")+"}");
System.out.println("\\end{figure}");
System.out.println("\n\\end{document}");
}
/** /**
* Extract the alignment form the Similarity * Extract the alignment form the Similarity
* There are theoretically 16 types of extractors composing the * There are theoretically 16 types of extractors composing the
...@@ -192,7 +206,6 @@ public class DistanceAlignment extends BasicAlignment implements AlignmentProces ...@@ -192,7 +206,6 @@ public class DistanceAlignment extends BasicAlignment implements AlignmentProces
found = true; max = val; ind2 = current; found = true; max = val; ind2 = current;
} }
} }
System.err.println(ind1+" -- "+ind2+" = "+max);
if ( found ) addAlignCell(ind1,ind2, "=", max); if ( found ) addAlignCell(ind1,ind2, "=", max);
} }
} }
......
/* /*
* $Id$ * $Id$
* *
* Copyright (C) INRIA Rhne-Alpes, 2003-2005 * Copyright (C) INRIA Rhne-Alpes, 2003-2006
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by * it under the terms of the GNU Lesser General Public License as published by
...@@ -23,6 +23,7 @@ package fr.inrialpes.exmo.align.impl; ...@@ -23,6 +23,7 @@ package fr.inrialpes.exmo.align.impl;
import java.util.Iterator; import java.util.Iterator;
import java.util.HashMap; import java.util.HashMap;
import java.net.URI; import java.net.URI;
import java.text.NumberFormat;
import org.semanticweb.owl.model.OWLOntology; import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLClass; import org.semanticweb.owl.model.OWLClass;
...@@ -57,15 +58,22 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -57,15 +58,22 @@ public abstract class MatrixMeasure implements Similarity {
public int nbclass2 = 0; // number of classes in onto2 public int nbclass2 = 0; // number of classes in onto2
public int nbprop1 = 0; // number of classes in onto1 public int nbprop1 = 0; // number of classes in onto1
public int nbprop2 = 0; // number of classes in onto2 public int nbprop2 = 0; // number of classes in onto2
public int nbind1 = 0; // number of individuals in onto1
public int nbind2 = 0; // number of individuals in onto2
public int i, j = 0; // index for onto1 and onto2 classes public int i, j = 0; // index for onto1 and onto2 classes
public int l1, l2 = 0; // length of strings (for normalizing) public int l1, l2 = 0; // length of strings (for normalizing)
public HashMap classlist2 = null; // onto2 classes public HashMap classlist2 = null; // onto2 classes
public HashMap classlist1 = null; // onto1 classes public HashMap classlist1 = null; // onto1 classes
public HashMap proplist2 = null; // onto2 properties public HashMap proplist2 = null; // onto2 properties
public HashMap proplist1 = null; // onto1 properties public HashMap proplist1 = null; // onto1 properties
public HashMap indlist2 = null; // onto2 individuals
public HashMap indlist1 = null; // onto1 individuals
private NumberFormat numFormat = null; // printing
public double clmatrix[][]; // distance matrix public double clmatrix[][]; // distance matrix
public double prmatrix[][]; // distance matrix public double prmatrix[][]; // distance matrix
public double indmatrix[][]; // distance matrix
public void initialize( OWLOntology onto1, OWLOntology onto2, Alignment align ){ public void initialize( OWLOntology onto1, OWLOntology onto2, Alignment align ){
initialize( onto1, onto2 ); initialize( onto1, onto2 );
...@@ -79,6 +87,8 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -79,6 +87,8 @@ public abstract class MatrixMeasure implements Similarity {
classlist1 = new HashMap(); // onto1 classes classlist1 = new HashMap(); // onto1 classes
proplist2 = new HashMap(); // onto2 properties proplist2 = new HashMap(); // onto2 properties
proplist1 = new HashMap(); // onto1 properties proplist1 = new HashMap(); // onto1 properties
indlist2 = new HashMap(); // onto2 instances
indlist1 = new HashMap(); // onto1 instances
try { try {
// Create class lists // Create class lists
...@@ -104,6 +114,15 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -104,6 +114,15 @@ public abstract class MatrixMeasure implements Similarity {
proplist1.put( it.next(), new Integer(nbprop1) ); proplist1.put( it.next(), new Integer(nbprop1) );
} }
prmatrix = new double[nbprop1+1][nbprop2+1]; prmatrix = new double[nbprop1+1][nbprop2+1];
// Create individual lists
for ( Iterator it = onto2.getIndividuals().iterator(); it.hasNext(); nbind2++ ){
indlist2.put( it.next(), new Integer(nbind2) );
}
for ( Iterator it = onto1.getIndividuals().iterator(); it.hasNext(); nbind1++ ){
indlist1.put( it.next(), new Integer(nbind1) );
}
indmatrix = new double[nbind1+1][nbind2+1];
} catch (OWLException e) { e.printStackTrace(); }; } catch (OWLException e) { e.printStackTrace(); };
} }
...@@ -117,6 +136,15 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -117,6 +136,15 @@ public abstract class MatrixMeasure implements Similarity {
clmatrix[((Integer)classlist1.get(cl1)).intValue()][((Integer)classlist2.get(cl2)).intValue()] = measure( cl1, cl2 ); clmatrix[((Integer)classlist1.get(cl1)).intValue()][((Integer)classlist2.get(cl2)).intValue()] = measure( cl1, cl2 );
} }
} }
// Compute distances on individuals
// (this comes first because otherwise, it2 is defined)
for ( Iterator it2 = onto2.getIndividuals().iterator(); it2.hasNext(); ){
OWLIndividual ind2 = (OWLIndividual)it2.next();
for ( Iterator it1 = onto1.getIndividuals().iterator(); it1.hasNext(); ){
OWLIndividual ind1 = (OWLIndividual)it1.next();
indmatrix[((Integer)indlist1.get(ind1)).intValue()][((Integer)indlist2.get(ind2)).intValue()] = measure( ind1, ind2 );
}
}
// Compute distances on properties // Compute distances on properties
ConcatenatedIterator it2 = new ConcatenatedIterator it2 = new
ConcatenatedIterator(onto2.getObjectProperties().iterator(), ConcatenatedIterator(onto2.getObjectProperties().iterator(),
...@@ -131,13 +159,11 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -131,13 +159,11 @@ public abstract class MatrixMeasure implements Similarity {
prmatrix[((Integer)proplist1.get(pr1)).intValue()][((Integer)proplist2.get(pr2)).intValue()] = measure( pr1, pr2 ); prmatrix[((Integer)proplist1.get(pr1)).intValue()][((Integer)proplist2.get(pr2)).intValue()] = measure( pr1, pr2 );
} }
} }
} catch (OWLException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); }
} }
public double getIndividualSimilarity( OWLIndividual i1, OWLIndividual i2 ){ public double getIndividualSimilarity( OWLIndividual i1, OWLIndividual i2 ){
// JE: non finished... return indmatrix[((Integer)indlist1.get(i1)).intValue()][((Integer)indlist2.get(i2)).intValue()];
int i,j = 0;
return 0.;
} }
public double getClassSimilarity( OWLClass c1, OWLClass c2 ){ public double getClassSimilarity( OWLClass c1, OWLClass c2 ){
return clmatrix[((Integer)classlist1.get(c1)).intValue()][((Integer)classlist2.get(c2)).intValue()]; return clmatrix[((Integer)classlist1.get(c1)).intValue()][((Integer)classlist2.get(c2)).intValue()];
...@@ -145,4 +171,37 @@ public abstract class MatrixMeasure implements Similarity { ...@@ -145,4 +171,37 @@ public abstract class MatrixMeasure implements Similarity {
public double getPropertySimilarity( OWLProperty p1, OWLProperty p2 ){ public double getPropertySimilarity( OWLProperty p1, OWLProperty p2 ){
return prmatrix[((Integer)proplist1.get(p1)).intValue()][((Integer)proplist2.get(p2)).intValue()]; return prmatrix[((Integer)proplist1.get(p1)).intValue()][((Integer)proplist2.get(p2)).intValue()];
} }
// Not an efficient access...
public void printClassSimilarityMatrix( String type ){
// Number format class to format the values
numFormat = NumberFormat.getInstance();
numFormat.setMinimumFractionDigits( 2 );
numFormat.setMaximumFractionDigits( 2 );
System.out.print("\\begin{tabular}{r|");
for ( int i = 0; i < nbclass1 ; i++ ) System.out.print("c");
System.out.println("}");
try {
for ( Iterator it1 = onto1.getClasses().iterator(); it1.hasNext(); ){
OWLClass cl1 = (OWLClass)it1.next();
System.out.print(" & \\rotatebox{90}{"+cl1.getURI().getFragment()+"}");
}
System.out.println(" \\\\ \\hline");
for ( Iterator it2 = onto2.getClasses().iterator(); it2.hasNext(); ){
OWLClass cl2 = (OWLClass)it2.next();
System.out.print(cl2.getURI().getFragment());
for ( Iterator it1 = onto1.getClasses().iterator(); it1.hasNext(); ){
OWLClass cl1 = (OWLClass)it1.next();
System.out.print(" & "+numFormat.format(clmatrix[((Integer)classlist1.get(cl1)).intValue()][((Integer)classlist2.get(cl2)).intValue()]));
}
System.out.println("\\\\");
}
} catch (OWLException e) { e.printStackTrace(); };
System.out.println("\n\\end{tabular}");
}
// Considered not useful so far
public void printPropertySimilarityMatrix( String type ){};
public void printIndividualSimilarityMatrix( String type ){};
} }
/* /*
* $Id$ * $Id$
* *
* Copyright (C) INRIA Rhne-Alpes, 2004 * Copyright (C) INRIA Rhne-Alpes, 2004, 2006
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by * it under the terms of the GNU Lesser General Public License as published by
...@@ -54,9 +54,19 @@ public interface Similarity ...@@ -54,9 +54,19 @@ public interface Similarity
public double getClassSimilarity( OWLClass c1, OWLClass c2 ); public double getClassSimilarity( OWLClass c1, OWLClass c2 );
public double getPropertySimilarity( OWLProperty p1, OWLProperty p2); public double getPropertySimilarity( OWLProperty p1, OWLProperty p2);
public double getIndividualSimilarity( OWLIndividual i1, OWLIndividual i2 ); public double getIndividualSimilarity( OWLIndividual i1, OWLIndividual i2 );
public void printClassSimilarityMatrix( String type );
public void printPropertySimilarityMatrix( String type );
public void printIndividualSimilarityMatrix( String type );
// New implementation // New implementation
public double measure( OWLClass c1, OWLClass c2 ) throws OWLException; // JE: this is better as a new implementation.
public double measure( OWLProperty p1, OWLProperty p2) throws OWLException; // however, currently the implementation does not follow it:
public double measure( OWLIndividual i1, OWLIndividual i2 ) throws OWLException; // the abstract matrix class provides the get- accessors and the
// concrete classes implement measure as their computation function.
// This is not clean. What should be done is:
public double measure( OWLClass c1, OWLClass c2 ) throws Exception;
public double measure( OWLProperty p1, OWLProperty p2) throws Exception;
public double measure( OWLIndividual i1, OWLIndividual i2 ) throws Exception;
} }
/*
* $Id: StringDistAlignment.java 149 2005-06-17 08:25:34Z euzenat $
*
* Copyright (C) INRIA Rhne-Alpes, 2003-2006
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package fr.inrialpes.exmo.align.impl.method;
import java.util.Iterator;
import java.util.Hashtable;
import java.lang.reflect.Method;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLProperty;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLException;
import fr.inrialpes.exmo.align.impl.DistanceAlignment;
import fr.inrialpes.exmo.align.impl.MatrixMeasure;
import fr.inrialpes.exmo.align.impl.Similarity;
import org.semanticweb.owl.align.Alignment;
import org.semanticweb.owl.align.AlignmentProcess;
import org.semanticweb.owl.align.AlignmentException;
import org.semanticweb.owl.align.Parameters;
/**
* Represents an OWL ontology alignment. An ontology comprises a number of
* collections. Each ontology has a number of classes, properties and
* individuals, along with a number of axioms asserting information
* about those objects.
*
* An improvement of that class is that, since it is based on names only,
* it can match freely property names with class names...
*
* @author Jrme Euzenat
* @version $Id: NameEqAlignment.java 149 2005-06-17 08:25:34Z euzenat $
*/
public class StringDistAlignment extends DistanceAlignment implements AlignmentProcess {
Method dissimilarity = null;
/** Creation **/
public StringDistAlignment( OWLOntology onto1, OWLOntology onto2 ){
super( onto1, onto2 );
setSimilarity( new MatrixMeasure() {
public double measure( OWLClass cl1, OWLClass cl2 ) throws Exception{
String[] params = { cl1.getURI().getFragment(), cl2.getURI().getFragment() };
//if ( debug > 4 )
return ((Double)dissimilarity.invoke( null, params )).doubleValue();
}
public double measure( OWLProperty pr1, OWLProperty pr2 ) throws Exception{
String[] params = { pr1.getURI().getFragment(), pr2.getURI().getFragment() };
return ((Double)dissimilarity.invoke( null, params )).doubleValue();
}
public double measure( OWLIndividual id1, OWLIndividual id2 ) throws Exception{
String[] params = { id1.getURI().getFragment(), id2.getURI().getFragment() };
return ((Double)dissimilarity.invoke( null, params )).doubleValue();
}
} );
setType("**");
};
/* Processing */
public void align( Alignment alignment, Parameters params ) throws AlignmentException, OWLException {
//ignore alignment;
double threshold = 1.; // threshold above which distances are to high
// Get function from params
String f = (String)params.getParameter("stringFunction");
try {
String fname = "equalDistance";
if ( f != null ) fname = f.trim();
Class sClass = Class.forName("java.lang.String");
Class[] mParams = { sClass, sClass };
dissimilarity = Class.forName("fr.inrialpes.exmo.align.impl.method.StringDistances").getMethod( fname, mParams );
} catch (Exception e) { throw new AlignmentException("Missing Class or method");};
//NoSuchMethodException, ClassNotFoundException
// Initialize matrix
getSimilarity().initialize( (OWLOntology)getOntology1(), (OWLOntology)getOntology2(), alignment );
// Compute similarity/dissimilarity
getSimilarity().compute( params );
// Print matrix if asked
if ( params.getParameter("printMatrix") != null ) printDistanceMatrix( params );
// Extract alignment
extract( type, params );
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment