From: <lor...@us...> - 2011-03-18 09:35:31
|
Revision: 2726 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=2726&view=rev Author: lorenz_b Date: 2011-03-18 09:35:21 +0000 (Fri, 18 Mar 2011) Log Message: ----------- Integrated template based SPARQL query learning algorithm. Modified Paths: -------------- trunk/components-ext/pom.xml Added Paths: ----------- trunk/components-ext/src/main/java/org/dllearner/algorithm/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/cli/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/cli/TestFrontend.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DRS2SPARQL_Converter.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DUDE2UDRS_Converter.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/learning/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/learning/SPARQLTemplateBasedLearner.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Case.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Feature.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Gender.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/LexicalSelection.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/MorphologicalProperty.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Numerus.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Prep_de.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Unification.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/Category.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/FootNode.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/LTAG_Tree_Constructor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/SubstNode.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/TerminalNode.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/Tree.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/TreeNode.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/AdjunctionPointer.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/DerivationTree.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/DerivedTree.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/GrammarFilter.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/LTAGLexicon.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/LTAG_Lexicon_Constructor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/LeftCompletor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/LeftPredictor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/MoveDotDown.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/MoveDotUp.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/Operation.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/OperationPointer.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/OperationType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/ParseGrammar.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/ParseState.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/Parser.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/ParserOperation.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/Preprocessor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/RightCompletor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/RightPredictor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/Scanner.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/SubstCompletor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/SubstPredictor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/SubstitutionPointer.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/parser/TAG.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/LTAGTreeParser.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/LTAGTreeParserConstants.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/LTAGTreeParserTokenManager.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/LTAG_Parser.jj trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/ParseException.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/SimpleCharStream.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/Token.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/reader/TokenMgrError.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/Complex_DRS_Condition.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/DRS.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/DRS_Condition.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/DRS_Quantifier.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/DiscourseReferent.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/Negated_DRS.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/Simple_DRS_Condition.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/drs/UDRS.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/data/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/data/Argument.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/data/DUDE_Constructor.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/data/Dude.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/data/Restriction.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/DUDE_Parser.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/DUDE_Parser.jj trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/DUDE_ParserConstants.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/DUDE_ParserTokenManager.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/ParseException.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/SimpleCharStream.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/Token.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/dudes/reader/TokenMgrError.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/CompositeType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/DomType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/DominanceConstraint.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/ElemType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/ElementaryType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/Label.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/Pair.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/Position.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/SemanticRepresentation.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/SortalRestriction.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sem/util/Type.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/Query.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Aggregate.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Entity.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Filter.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Negation.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_OrderBy.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Pair.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_PairType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Prefix.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Property.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_QueryType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Term.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Triple.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SPARQL_Value.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/Slot.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/SlotType.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/sparql/Template.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/templator/ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/templator/POStagger.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/templator/SlotBuilder.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/templator/Templator.java trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/templator/WordNet.java trunk/components-ext/src/main/resources/ trunk/components-ext/src/main/resources/log4j.properties trunk/components-ext/src/main/resources/tbsl/ trunk/components-ext/src/main/resources/tbsl/lexicon/ trunk/components-ext/src/main/resources/tbsl/lexicon/english.lex trunk/components-ext/src/main/resources/tbsl/models/ trunk/components-ext/src/main/resources/tbsl/models/README-Models.txt trunk/components-ext/src/main/resources/tbsl/models/bidirectional-distsim-wsj-0-18.tagger trunk/components-ext/src/main/resources/tbsl/models/bidirectional-distsim-wsj-0-18.tagger.props trunk/components-ext/src/main/resources/tbsl/models/left3words-wsj-0-18.tagger trunk/components-ext/src/main/resources/tbsl/models/left3words-wsj-0-18.tagger.props trunk/components-ext/src/test/java/org/dllearner/algorithm/ trunk/components-ext/src/test/java/org/dllearner/algorithm/tbsl/ trunk/components-ext/src/test/java/org/dllearner/algorithm/tbsl/POStest.java trunk/components-ext/src/test/java/org/dllearner/algorithm/tbsl/WordNetTest.java Modified: trunk/components-ext/pom.xml =================================================================== --- trunk/components-ext/pom.xml 2011-03-17 11:24:56 UTC (rev 2725) +++ trunk/components-ext/pom.xml 2011-03-18 09:35:21 UTC (rev 2726) @@ -18,5 +18,18 @@ <groupId>org.dllearner</groupId> <artifactId>components-core</artifactId> </dependency> + <dependency> + <groupId>org.dllearner</groupId> + <artifactId>autosparql</artifactId> + <version>1.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>com.jamonapi</groupId> + <artifactId>jamon</artifactId> + <version>2.7</version> + <type>jar</type> + <scope>compile</scope> + </dependency> </dependencies> </project> Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/cli/TestFrontend.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/cli/TestFrontend.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/cli/TestFrontend.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,47 @@ +package org.dllearner.algorithm.tbsl.cli; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Set; + +import org.dllearner.algorithm.tbsl.sparql.Template; +import org.dllearner.algorithm.tbsl.templator.Templator; + + +public class TestFrontend { + + public static void main(String[] args) { + + Templator templator = new Templator(); + + System.out.println("======= SPARQL Templator v0.1 ============="); + System.out.println("\nType ':q' to quit."); + + while (true) { + String s = getStringFromUser("input > ").trim(); + + if (s.equals(":q")) { + System.exit(0); + } + + Set<Template> temps = templator.buildTemplates(s); + + for (Template temp : temps) { + System.out.println(temp.toString()); + } + + } + } + + public static String getStringFromUser(String msg) { + String str = ""; + try { + System.out.println("\n===========================================\n"); + System.out.print(msg); + str = new BufferedReader(new InputStreamReader(System.in)).readLine(); + } catch (IOException e) { + } + return str; + } +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DRS2SPARQL_Converter.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DRS2SPARQL_Converter.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DRS2SPARQL_Converter.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,352 @@ +package org.dllearner.algorithm.tbsl.converter; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.dllearner.algorithm.tbsl.sem.drs.Complex_DRS_Condition; +import org.dllearner.algorithm.tbsl.sem.drs.DRS; +import org.dllearner.algorithm.tbsl.sem.drs.DRS_Condition; +import org.dllearner.algorithm.tbsl.sem.drs.DRS_Quantifier; +import org.dllearner.algorithm.tbsl.sem.drs.DiscourseReferent; +import org.dllearner.algorithm.tbsl.sem.drs.Negated_DRS; +import org.dllearner.algorithm.tbsl.sem.drs.Simple_DRS_Condition; +import org.dllearner.algorithm.tbsl.sparql.Query; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Aggregate; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Filter; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_OrderBy; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Pair; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_PairType; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Prefix; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Property; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_QueryType; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Term; +import org.dllearner.algorithm.tbsl.sparql.SPARQL_Triple; +import org.dllearner.algorithm.tbsl.sparql.Slot; +import org.dllearner.algorithm.tbsl.sparql.Template; + + +public class DRS2SPARQL_Converter { + + // suppresses console output + private boolean silent = true; + List<Slot> slots; + Template template; + List<Integer> usedInts; + + public DRS2SPARQL_Converter() { + template = new Template(new Query()); + usedInts = new ArrayList<Integer>(); + } + + public DRS2SPARQL_Converter(boolean silent) { + setSilent(silent); + template = new Template(new Query()); + usedInts = new ArrayList<Integer>(); + } + + public boolean isSilent() { + return silent; + } + + public void setSilent(boolean silent) { + this.silent = silent; + } + + public List<SPARQL_Property> getProperties(Complex_DRS_Condition cond) { + List<SPARQL_Property> retVal = new ArrayList<SPARQL_Property>(); + + return retVal; + } + + public Template convert(DRS drs,List<Slot> ls) { + + Set<SPARQL_Prefix> prefixes = new HashSet<SPARQL_Prefix>(); + prefixes.add(new SPARQL_Prefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")); + prefixes.add(new SPARQL_Prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#")); + + if (!isSilent()) { + System.out.print("Converting DRS{" + drs.toString() + "}..."); + } + + template = new Template(new Query()); + slots = ls; + + Query q = convert(drs, new Query(), false); + q.setPrefixes(prefixes); + + template.setQuery(q); + + if (!isSilent()) { + System.out.println("... done"); + } + + return template; + } + + private Query convert(DRS drs, Query query, boolean negate) { + + redundantEqualRenaming(drs); + + for (DiscourseReferent referent : drs.getDRs()) { + if (referent.isMarked()) { + SPARQL_Term term = new SPARQL_Term(referent.toString().replace("?","")); + term.setIsVariable(true); + query.addSelTerm(term); + } + if (referent.isNonexistential()) { + SPARQL_Term term = new SPARQL_Term(referent.getValue()); + term.setIsVariable(true); + SPARQL_Filter f = new SPARQL_Filter(); + f.addNotBound(term); + query.addFilter(f); + } + for (Slot s : slots) { + if (s.getAnchor().equals(referent.toString())) { + template.addSlot(s); + break; + } + } + } + + Set<SPARQL_Triple> statements = new HashSet<SPARQL_Triple>(); + + for (DRS_Condition condition : drs.getConditions()) { + Set<SPARQL_Triple> scondition = convertCondition(condition, query).getConditions(); + statements.addAll(scondition); + if (negate) { + for (int i = 0; i < scondition.size(); ++i) { + SPARQL_Term term = ((SPARQL_Triple) scondition.toArray()[i]).getVariable(); + if (query.isSelTerm(term)) { + SPARQL_Filter f = new SPARQL_Filter(); + f.addNotBound(term); + query.addFilter(f); + } + } + } + } + + if (query.getSelTerms().size() == 0) + query.setQt(SPARQL_QueryType.ASK); + + query.setConditions(statements); + + return query; + } + + private Query convertCondition(DRS_Condition condition, Query query) { + if (condition.isComplexCondition()) { + if (!isSilent()) { + System.out.print("|complex:" + condition.toString()); + } + Complex_DRS_Condition complex = (Complex_DRS_Condition) condition; + + DRS restrictor = complex.getRestrictor(); + DRS_Quantifier quant = complex.getQuantifier(); + DRS scope = complex.getScope(); + + // call recursively + for (DRS_Condition cond : restrictor.getConditions()) { + query = convertCondition(cond, query); + } + for (DRS_Condition cond : scope.getConditions()) { + query = convertCondition(cond, query); + } + // add the quantifier at last + DiscourseReferent ref = complex.getReferent(); + String sref = ref.getValue(); + if (!isSilent()) { + System.out.print("|quantor:" + quant); + } + switch (quant) { + case HOW_MANY: + query.addSelTerm(new SPARQL_Term(sref, SPARQL_Aggregate.COUNT)); + break; + case EVERY: + // probably save to ignore // TODO unless in cases like "which actor starred in every movie by spielberg?" + // query.addFilter(new SPARQL_Filter(new SPARQL_Term(sref))); + break; + case NO: + SPARQL_Filter f = new SPARQL_Filter(); + f.addNotBound(new SPARQL_Term(sref)); + query.addFilter(f); + break; + case FEW: // + break; + case MANY: // + break; + case MOST: // + break; + case SOME: // + break; + case THE_LEAST: + query.addSelTerm(new SPARQL_Term(sref, SPARQL_Aggregate.COUNT)); + query.addOrderBy(new SPARQL_Term(sref, SPARQL_OrderBy.ASC)); + query.setLimit(1); + break; + case THE_MOST: + query.addSelTerm(new SPARQL_Term(sref, SPARQL_Aggregate.COUNT)); + query.addOrderBy(new SPARQL_Term(sref, SPARQL_OrderBy.DESC)); + query.setLimit(1); + break; + } + } else if (condition.isNegatedCondition()) { + if (!isSilent()) { + System.out.print("|negation:" + condition.toString()); + } + Negated_DRS neg = (Negated_DRS) condition; + query = convert(neg.getDRS(), query, true); + + } else { + Simple_DRS_Condition simple = (Simple_DRS_Condition) condition; + + if (!isSilent()) { + System.out.print(isSilent() + "|simple:" + condition.toString()); + } + + int arity = simple.getArguments().size(); + String predicate = simple.getPredicate(); + if (predicate.startsWith("SLOT")) { + for (Slot s : slots) { + if (s.getAnchor().equals(predicate)) { + predicate = "p" + createFresh(); + s.setAnchor(predicate); + template.addSlot(s); + break; + } + } + } + SPARQL_Property prop = new SPARQL_Property(predicate); + prop.setIsVariable(true); + + if (predicate.equals("count")) { + // COUNT(?x) AS ?c + query.addSelTerm(new SPARQL_Term(simple.getArguments().get(0).getValue(), SPARQL_Aggregate.COUNT, true, new SPARQL_Term(simple.getArguments().get(1).getValue(),true))); + return query; + } else if (predicate.equals("sum")) { + query.addSelTerm(new SPARQL_Term(simple.getArguments().get(1).getValue(), SPARQL_Aggregate.SUM)); + return query; + } else if (predicate.equals("greater")) { + query.addFilter(new SPARQL_Filter( + new SPARQL_Pair( + new SPARQL_Term(simple.getArguments().get(0).getValue(),true), + new SPARQL_Term(simple.getArguments().get(1).getValue()), + SPARQL_PairType.GT))); + return query; + } else if (predicate.equals("greaterorequal")) { + query.addFilter(new SPARQL_Filter( + new SPARQL_Pair( + new SPARQL_Term(simple.getArguments().get(0).getValue(),true), + new SPARQL_Term(simple.getArguments().get(1).getValue()), + SPARQL_PairType.LT))); + return query; + } else if (predicate.equals("less")) { + query.addFilter(new SPARQL_Filter( + new SPARQL_Pair( + new SPARQL_Term(simple.getArguments().get(0).getValue(),true), + new SPARQL_Term(simple.getArguments().get(1).getValue()), + SPARQL_PairType.LTEQ))); + return query; + } else if (predicate.equals("lessorequal")) { + query.addFilter(new SPARQL_Filter( + new SPARQL_Pair( + new SPARQL_Term(simple.getArguments().get(0).getValue(),true), + new SPARQL_Term(simple.getArguments().get(1).getValue()), + SPARQL_PairType.GT))); + return query; + } else if (predicate.equals("maximum")) { + query.addSelTerm(new SPARQL_Term(simple.getArguments().get(1).getValue(), SPARQL_Aggregate.MAX)); + return query; + } else if (predicate.equals("minimum")) { + query.addSelTerm(new SPARQL_Term(simple.getArguments().get(1).getValue(), SPARQL_Aggregate.MIN)); + return query; + } else if (predicate.equals("equal")) { + query.addFilter(new SPARQL_Filter( + new SPARQL_Pair( + new SPARQL_Term(simple.getArguments().get(0).getValue(),true), + new SPARQL_Term(simple.getArguments().get(1).getValue()), + SPARQL_PairType.EQ))); + return query; + } + + if (arity == 1) { + SPARQL_Term term = new SPARQL_Term(simple.getArguments().get(0).getValue(),true); + query.addCondition(new SPARQL_Triple(term,new SPARQL_Property("type",new SPARQL_Prefix("rdf","")),prop)); + } + else if (arity == 2) { + String arg1 = simple.getArguments().get(0).getValue(); + String arg2 = simple.getArguments().get(1).getValue(); + query.addCondition(new SPARQL_Triple(new SPARQL_Term(arg1,true),prop,new SPARQL_Term(arg2,true))); + } + else if (arity > 2) { + // TODO + } + } + return query; + } + + private void redundantEqualRenaming(DRS drs) { + + Set<Simple_DRS_Condition> equalsConditions = new HashSet<Simple_DRS_Condition>(); + for (Simple_DRS_Condition c : drs.getAllSimpleConditions()) { + if(c.getPredicate().equals("equal")) { + equalsConditions.add(c); + } + } + + DiscourseReferent firstArg; + DiscourseReferent secondArg; + boolean firstIsURI; + boolean secondIsURI; + + for (Simple_DRS_Condition c : equalsConditions) { + + firstArg = c.getArguments().get(0); + secondArg = c.getArguments().get(1); + firstIsURI = isUri(firstArg.getValue()); + secondIsURI = isUri(secondArg.getValue()); + + boolean oneArgIsInt = firstArg.toString().matches("[0..9]") || secondArg.toString().matches("[0..9]"); + + drs.removeCondition(c); + if (firstIsURI) { + drs.replaceEqualRef(secondArg, firstArg, false); + for (Slot s : slots) { + if (s.getAnchor().equals(secondArg.getValue())) { + s.setAnchor(firstArg.getValue()); + } + } + } else if (secondIsURI) { + drs.replaceEqualRef(firstArg, secondArg, false); + for (Slot s : slots) { + if (s.getAnchor().equals(firstArg.getValue())) { + s.setAnchor(secondArg.getValue()); + } + } + } else if (!oneArgIsInt) { + drs.replaceEqualRef(firstArg, secondArg, false); + for (Slot s : slots) { + if (s.getAnchor().equals(firstArg.getValue())) { + s.setAnchor(secondArg.getValue()); + } + } + } + } + + } + + private boolean isUri(String arg) { + return false; // TODO + } + + private int createFresh() { + + int fresh = 0; + for (int i = 0; usedInts.contains(i); i++) { + fresh = i+1 ; + } + usedInts.add(fresh); + return fresh; + } +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DUDE2UDRS_Converter.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DUDE2UDRS_Converter.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/converter/DUDE2UDRS_Converter.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,77 @@ +package org.dllearner.algorithm.tbsl.converter; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import org.dllearner.algorithm.tbsl.sem.drs.DRS; +import org.dllearner.algorithm.tbsl.sem.drs.UDRS; +import org.dllearner.algorithm.tbsl.sem.dudes.data.Dude; +import org.dllearner.algorithm.tbsl.sem.util.DomType; +import org.dllearner.algorithm.tbsl.sem.util.DominanceConstraint; +import org.dllearner.algorithm.tbsl.sem.util.Label; + +public class DUDE2UDRS_Converter { + + public DUDE2UDRS_Converter() { + } + + public UDRS convert(Dude dude) throws UnsupportedOperationException { + + UDRS udrs = new UDRS(); + + // determining bottom and top + + Set<Label> bottoms = new HashSet<Label>(); + Set<Label> tops = new HashSet<Label>(); + + for (DominanceConstraint constraint : dude.getDominanceConstraints()) { + if (!constraint.getType().equals(DomType.equal)) { + tops.add(constraint.getSuper()); + bottoms.add(constraint.getSub()); + } + } + for (DominanceConstraint constraint : dude.getDominanceConstraints()) { + if (!constraint.getType().equals(DomType.equal)) { + tops.remove(constraint.getSub()); + bottoms.remove(constraint.getSuper()); + } + } + + if (tops.isEmpty()) { // then all constraints were equals + tops.add(new Label("noTop")); + } + if (bottoms.isEmpty()) { // just to make sure... + bottoms.add(new Label("noBottom")); + } + + // precondition: tops and bottoms are singleton sets + Label bottomLabel = (new ArrayList<Label>(bottoms)).get(0); + Label topLabel = (new ArrayList<Label>(tops)).get(0); + + udrs.setBottom(bottomLabel); + udrs.setTop(topLabel); + + // copying components and dominance constraints + + for ( DRS component : dude.getComponents() ) + { + udrs.addComponent(component.clone()); + } + + if (!topLabel.toString().equals("noTop")) { + udrs.addComponent(dude.getComponent(topLabel).clone()); + } + if (!bottomLabel.toString().equals("noBottom")) { + udrs.addComponent(dude.getComponent(bottomLabel).clone()); + } + + for ( DominanceConstraint constraint : dude.getDominanceConstraints() ) + { + udrs.addDominanceConstraint(constraint); + } + + return udrs; + } + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/learning/SPARQLTemplateBasedLearner.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/learning/SPARQLTemplateBasedLearner.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/learning/SPARQLTemplateBasedLearner.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,230 @@ +package org.dllearner.algorithm.tbsl.learning; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.log4j.Logger; +import org.dllearner.algorithm.tbsl.sparql.Query; +import org.dllearner.algorithm.tbsl.sparql.Slot; +import org.dllearner.algorithm.tbsl.sparql.SlotType; +import org.dllearner.algorithm.tbsl.sparql.Template; +import org.dllearner.algorithm.tbsl.templator.Templator; +import org.dllearner.autosparql.server.search.SolrSearch; +import org.dllearner.kb.sparql.ExtractionDBCache; +import org.dllearner.kb.sparql.SparqlEndpoint; +import org.dllearner.kb.sparql.SparqlQuery; +import org.dllearner.sparqlquerygenerator.util.ModelGenerator; +import org.dllearner.sparqlquerygenerator.util.ModelGenerator.Strategy; + +import com.hp.hpl.jena.query.QueryExecution; +import com.hp.hpl.jena.query.QueryExecutionFactory; +import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.jamonapi.Monitor; +import com.jamonapi.MonitorFactory; + +public class SPARQLTemplateBasedLearner { + + private static final Logger logger = Logger.getLogger(SPARQLTemplateBasedLearner.class); + private Monitor mon = MonitorFactory.getTimeMonitor("stbl"); + + private static final int TOP_K = 5; + private static final String SOLR_SERVER_URL = "http://139.18.2.173:8080/apache-solr-1.4.1"; + private static final int RECURSION_DEPTH = 2; + + private SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpediaLiveAKSW(); + private ExtractionDBCache cache = new ExtractionDBCache("cache"); + + private SolrSearch resource_index; + private SolrSearch class_index; + private SolrSearch property_index; + private ModelGenerator modelGenenerator; + private Templator templateGenerator; + + private String question; + + + public SPARQLTemplateBasedLearner(){ + resource_index = new SolrSearch(SOLR_SERVER_URL + "/dbpedia_resources"); + resource_index.setHitsPerPage(TOP_K); + class_index = new SolrSearch(SOLR_SERVER_URL + "/dbpedia_classes"); + class_index.setHitsPerPage(TOP_K); + property_index = new SolrSearch(SOLR_SERVER_URL + "/dbpedia_properties"); + property_index.setHitsPerPage(TOP_K); + + Set<String> predicateFilters = new HashSet<String>(); + predicateFilters.add("http://dbpedia.org/ontology/wikiPageWikiLink"); + predicateFilters.add("http://dbpedia.org/property/wikiPageUsesTemplate"); + modelGenenerator = new ModelGenerator(endpoint, predicateFilters); + + templateGenerator = new Templator(); + } + + public void setEndpoint(SparqlEndpoint endpoint){ + this.endpoint = endpoint; + Set<String> predicateFilters = new HashSet<String>(); + predicateFilters.add("http://dbpedia.org/ontology/wikiPageWikiLink"); + predicateFilters.add("http://dbpedia.org/property/wikiPageUsesTemplate"); + modelGenenerator = new ModelGenerator(endpoint, predicateFilters); + } + + public void learnSPARQLQueries(String question){ + this.question = question; + + //generate SPARQL query templates + logger.info("Generating SPARQL query templates..."); + mon.start(); + Set<Template> templates = templateGenerator.buildTemplates(question); + mon.stop(); + logger.info("Done in " + mon.getLastValue() + "ms."); + logger.info("Templates:"); + for(Template t : templates){ + logger.info(t); + } + + //generate candidate SPQRL queries + List<String> possibleSPARQLQueries = getPossibleSPARQLQueries(templates); + + //test candidates on remote endpoint + validateAgainstRemoteEndpoint(possibleSPARQLQueries); + + //test candidates on local model + validateAgainstLocalModel(possibleSPARQLQueries); + + } + + private Model getWorkingModel(List<String> resources){ + logger.info("Generating local model..."); + mon.start(); + Model workingModel = ModelFactory.createDefaultModel(); + Model model; + for(String resource : resources){ + model = modelGenenerator.createModel(resource, Strategy.CHUNKS, RECURSION_DEPTH); + workingModel.add(model); + } + mon.stop(); + logger.info("Done in " + mon.getLastValue() + "ms."); + logger.info("Local model contains " + workingModel.size() + " triples."); + return workingModel; + } + + private List<String> getPossibleSPARQLQueries(Set<Template> templates){ + logger.info("Generating candidate SPARQL queries..."); + mon.start(); + List<String> queries = new ArrayList<String>(); + Query query; + for(Template template : templates){ + query = template.getQuery(); + queries.add(query.toString()); + for(Slot slot : template.getSlots()){ + Set<String> tmp = new HashSet<String>(); + String var = slot.getAnchor(); + List<String> words = slot.getWords(); + for(String uri : getCandidateURIs(slot)){ + for(String q : queries){ + tmp.add(q.replace("?" + var, "<" + uri + ">")); + } + } + if(!words.isEmpty()){ + queries.clear(); + queries.addAll(tmp); + } + } + } + mon.stop(); + logger.info("Done in " + mon.getLastValue() + "ms."); + return queries; + } + + private Set<String> getCandidateURIs(Slot slot){ + logger.info("Generating candidate URIs for " + slot.getWords() + "..."); + mon.start(); + SolrSearch index = null; + Set<String> uris = new HashSet<String>(); + if(slot.getSlotType() == SlotType.CLASS){ + index = class_index; + } else if(slot.getSlotType() == SlotType.PROPERTY){ + index = property_index; + } else if(slot.getSlotType() == SlotType.RESOURCE){ + index = resource_index; + } + for(String word : slot.getWords()){ + uris.addAll(index.getResources("label:" + word)); + + } + mon.stop(); + logger.info("Done in " + mon.getLastValue() + "ms."); + logger.info("Candiate URIs: " + uris); + return uris; + } + + private void validateAgainstRemoteEndpoint(List<String> queries){ + logger.info("Testing candidate SPARQL queries on remote endpoint..."); + mon.start(); + for(String query : queries){ + logger.info("Testing query:\n" + query); + List<String> results = getResultFromRemoteEndpoint(query); + logger.info("Result: " + results); + } + mon.stop(); + logger.info("Done in " + mon.getLastValue() + "ms."); + } + + private void validateAgainstLocalModel(List<String> queries){ + List<String> resources = resource_index.getResources(question); + + Model model = getWorkingModel(resources); + + for(String query : queries){ + System.out.println("Testing query:\n" + query); + List<String> results = getResultFromLocalModel(query, model); + System.out.println("Result: " + results); + } + } + + private List<String> getResultFromRemoteEndpoint(String query){ + List<String> resources = new ArrayList<String>(); + ResultSet rs = SparqlQuery.convertJSONtoResultSet(cache.executeSelectQuery(endpoint, query + " LIMIT 1")); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + resources.add(qs.get("y").toString()); + } + return resources; + } + + private List<String> getResultFromLocalModel(String query, Model model){ + List<String> resources = new ArrayList<String>(); + QueryExecution qe = QueryExecutionFactory.create(query, model); + ResultSet rs = qe.execSelect(); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + resources.add(qs.get("y").toString()); + } + return resources; + } + + + /** + * @param args + * @throws MalformedURLException + */ + public static void main(String[] args) throws MalformedURLException { + SPARQLTemplateBasedLearner learner = new SPARQLTemplateBasedLearner(); + SparqlEndpoint endpoint = new SparqlEndpoint(new URL("http://db0.aksw.org:8999/sparql"), + Collections.<String>singletonList("http://dbpedia.org"), Collections.<String>emptyList()); + learner.setEndpoint(endpoint); + learner.learnSPARQLQueries("Give me all countries in Europe"); +// learner.learnSPARQLQueries("Give me all soccer clubs in Premier League"); + + } + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Case.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Case.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Case.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,5 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +public enum Case implements MorphologicalProperty { + NOM, GEN, DAT, ACC +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Feature.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Feature.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Feature.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,186 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +import java.util.regex.Pattern; + +/** + * Object to store the morphological properties of a TreeNode (root node) or the + * morphological requirements of a SubstNode. + * + * @author felix + * + */ +public class Feature { + + private Case c; + private Numerus n; + private Gender g; + private Prep_de p; + + public Feature(Case c, Numerus n, Gender g, Prep_de p) { + this.c = c; + this.n = n; + this.g = g; + this.p = p; + } + + /** + * used by the ltagParser to construct the Feature object from a string. + * + * @param s + * e.g. "{c:nom,g:g}" + * @return + */ + public static Feature construct(String s) { + + Case c = null; + Numerus n = null; + Gender g = null; + Prep_de p = null; + + String[] parts = s.replaceAll("\\{|\\}", "").split(","); + for (String x : parts) { + if (Pattern.matches("(c:(nom|gen|dat|acc))", x)) { + if (x.substring(2).equals("nom")) { + c = Case.NOM; + } + if (x.substring(2).equals("gen")) { + c = Case.GEN; + } + if (x.substring(2).equals("dat")) { + c = Case.DAT; + } + if (x.substring(2).equals("acc")) { + c = Case.ACC; + } + } + if (Pattern.matches("(n:(sg|pl))", x)) { + if (x.substring(2).equals("sg")) { + n = Numerus.SG; + } + if (x.substring(2).equals("pl")) { + n = Numerus.PL; + } + } + if (Pattern.matches("(g:(m|f|n))", x)) { + if (x.substring(2).equals("m")) { + g = Gender.M; + } + if (x.substring(2).equals("f")) { + g = Gender.F; + } + if (x.substring(2).equals("n")) { + g = Gender.N; + } + } + if (Pattern.matches("(p:(an|durch))", x)) { + if (x.substring(2).equals("an")) { + p = Prep_de.AN; + } + if (x.substring(2).equals("durch")) { + p = Prep_de.DURCH; + } + } + } + if (c == null && g == null && n == null && p == null) { + return null; + } else { + return new Feature(c, n, g, p); + } + + } + + public String toString() { + String cStr = ""; + String nStr = ""; + String gStr = ""; + String pStr = ""; + if (c != null) { + cStr = "c:" + c.toString().toLowerCase() + " "; + } + if (n != null) { + nStr = "n:" + n.toString().toLowerCase() + " "; + } + if (g != null) { + gStr = "g:" + g.toString().toLowerCase(); + } + if (p != null) { + pStr = "p:" + p.toString().toLowerCase(); + } + + return ("{" + cStr + nStr + gStr + pStr + "}").trim().replaceAll(" ", ","); + } + + public Case getC() { + return c; + } + + public void setC(Case c) { + this.c = c; + } + + public Numerus getN() { + return n; + } + + public void setN(Numerus n) { + this.n = n; + } + + public Gender getG() { + return g; + } + + public void setG(Gender g) { + this.g = g; + } + + public Prep_de getP() { + return p; + } + + public void setP(Prep_de p) { + this.p = p; + } + + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((c == null) ? 0 : c.hashCode()); + result = prime * result + ((g == null) ? 0 : g.hashCode()); + result = prime * result + ((n == null) ? 0 : n.hashCode()); + result = prime * result + ((p == null) ? 0 : p.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof Feature)) + return false; + Feature other = (Feature) obj; + if (c == null) { + if (other.c != null) + return false; + } else if (!c.equals(other.c)) + return false; + if (g == null) { + if (other.g != null) + return false; + } else if (!g.equals(other.g)) + return false; + if (n == null) { + if (other.n != null) + return false; + } else if (!n.equals(other.n)) + return false; + if (p == null) { + if (other.p != null) + return false; + } else if (!p.equals(other.p)) + return false; + return true; + } + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Gender.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Gender.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Gender.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,5 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +public enum Gender implements MorphologicalProperty { + M,F,N +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/LexicalSelection.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/LexicalSelection.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/LexicalSelection.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,5 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +public interface LexicalSelection { + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/MorphologicalProperty.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/MorphologicalProperty.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/MorphologicalProperty.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,10 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +/** + * a morphological property can currently be Case, Numerus or Gender. + * @author felix + * + */ +public interface MorphologicalProperty { + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Numerus.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Numerus.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Numerus.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,5 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +public enum Numerus implements MorphologicalProperty { + SG,PL +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Prep_de.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Prep_de.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Prep_de.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,5 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +public enum Prep_de implements LexicalSelection { + AN, DURCH +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Unification.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Unification.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/agreement/Unification.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,76 @@ +package org.dllearner.algorithm.tbsl.ltag.agreement; + +/** + * implements the unification of two Feature objects. This is used by + * earleyParser.SubstPredictor() to determine if a tree can be substituted into + * a SubstNode if the SubstNode has Feature requirements. + * + * @author felix + * + */ +public class Unification { + + /** + * @param a + * FeatureConstraints from the SubstNode + * @param b + * Feature from the RootNode of the Tree candidate + */ + public static boolean isUnifiable(Feature a, Feature b) { + + if (a == null && b == null) { + return true; + } + else if (a == null && b != null) { + if (b.getP() == null) { return true;} + else { return false; } + } + else if (b == null && a != null) { + if (a.getP() == null) { return true; } + else { return false; } + } else { + if (a.equals(b)) { + return true; + } else { + if (unify(a.getC(), b.getC()) && unify(a.getN(), b.getN()) + && unify(a.getG(), b.getG()) + && unify(a.getP(), b.getP())) { + return true; + } + return false; + } + } + } + + private static boolean unify(MorphologicalProperty a, + MorphologicalProperty b) { + if (a == null || b == null) { + return true; + } else { + if (a.equals(b)) { + return true; + } else { + return false; + } + } + } + + private static boolean unify(LexicalSelection a, LexicalSelection b) { + if (a == null && b == null) { + return true; + } else if (a.equals(b)) { + return true; + } + return false; + } + + public static void main(String[] args) { + Feature a = Feature.construct("{c:nom,n:pl,p:durch}"); + Feature b = Feature.construct("{c:nom,p:durch}"); + + System.out.println(a); + System.out.println(b); + System.out.println(Unification.isUnifiable(a, b)); + } + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/Category.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/Category.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/Category.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,8 @@ +package org.dllearner.algorithm.tbsl.ltag.data; + +/** defines the categories a node in an LTAG tree can have. **/ +public enum Category { + + S, WH, NP, DP, VP, V, DET, PP, N, P, ADV, PART, ADJ, ADJCOMP, PUNCT, CC, EX, NUM, C, NEG + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/FootNode.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/FootNode.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/FootNode.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,195 @@ +package org.dllearner.algorithm.tbsl.ltag.data; + +import java.util.ArrayList; +import java.util.List; + +import org.dllearner.algorithm.tbsl.ltag.agreement.Feature; + + +/** + * A FootNode represents a TreeNode in an auxiliary tree which has the same + * category as the root node. No adjunction is allowed at a FootNode. + **/ + +public class FootNode implements TreeNode { + + Category category; + Tree parent; + boolean NA = false; + + public FootNode(Category cat) { + category = cat; + parent = null; + } + + public FootNode clone() { + FootNode out = new FootNode(category); + out.NA = NA; + return out; + } + + public TreeNode adjoin(String label, TreeNode tree) + throws UnsupportedOperationException { + + if (tree.isAuxTree()) { + + FootNode output = new FootNode(category); + + output.setChildren(new ArrayList<TreeNode>()); + + return output; + } else { + throw new UnsupportedOperationException( + "adjoin failed at foot node because the following argument is not an auxiliary tree:\n" + + tree.toString()); + } + } + + public FootNode substitute(String index, TreeNode tree) { + return this; + } + + public Tree replaceFoot(List<TreeNode> trees) { + Tree output = new Tree(); + + output.setCategory(category); + output.setChildren(trees); + + return output; + } + + public boolean isAuxTree() { + + List<FootNode> footNodes = getFootNodes(); + + if (footNodes.size() == 1) { + FootNode footNode = footNodes.get(0); + return (category.equals(footNode.category)); + } else { + return false; + } + } + + public List<FootNode> getFootNodes() { + + List<FootNode> output = new ArrayList<FootNode>(); + + output.add(this); + + return output; + + } + + public List<TerminalNode> getTerminalNodes() { + List<TerminalNode> output = new ArrayList<TerminalNode>(); + return output; + } + + public Category getCategory() { + return category; + } + + public void setCategory(Category cat) { + category = cat; + } + + public List<TreeNode> getChildren() { + ArrayList<TreeNode> output = new ArrayList<TreeNode>(); + return output; + } + + public void setChildren(List<TreeNode> treelist) { + + } + + public Tree getParent() { + return parent; + } + + public void setParent(Tree tree) { + parent = tree; + } + + public void setParentForTree() { + } + + public String toString() { + return category + "*"; + } + + public String toFileString() { + return this.getCategory().toString()+"*"; + } + + public String toString(String indent) { + return indent + category + "*"; + } + + public TreeNode getRightSibling() { + int idx = this.parent.children.indexOf(this); + + // if this is rightmost children of parent, + if (idx == parent.children.size() - 1) { + return null; + } + + else { + // return right sibling + return parent.children.get(idx + 1); + } + } + + public boolean getAdjConstraint() { + return NA; + } + + public void setAdjConstraint(boolean x) { + NA = x; + } + + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((category == null) ? 0 : category.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof FootNode)) + return false; + FootNode other = (FootNode) obj; + if (category == null) { + if (other.category != null) + return false; + } else if (!category.equals(other.category)) + return false; + return true; + } + + public String getAnchor() { + return ""; + } + + public Feature getFeature() { + return null; + } + + public void setFeature(Feature f) {} + + + public TreeNode isGovernedBy(Category cat) { + if (this.getParent() == null) { + return null; + } else if (this.getParent().getCategory().equals(cat)){ + return this.getParent(); + } else { + return this.getParent().isGovernedBy(cat); + } + } + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/LTAG_Tree_Constructor.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/LTAG_Tree_Constructor.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/LTAG_Tree_Constructor.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,23 @@ +package org.dllearner.algorithm.tbsl.ltag.data; + +import java.io.StringReader; + +import org.dllearner.algorithm.tbsl.ltag.reader.LTAGTreeParser; +import org.dllearner.algorithm.tbsl.ltag.reader.ParseException; + + +public class LTAG_Tree_Constructor { + + public TreeNode construct(String string) throws ParseException + { + // new TreeNode interface in fracosem.ltag + TreeNode tree; + LTAGTreeParser parser = new LTAGTreeParser(new StringReader(new String(string))); + parser.ReInit(new StringReader(new String(string))); + tree = parser.Tree(); + + return tree; + } + + +} Added: trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/SubstNode.java =================================================================== --- trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/SubstNode.java (rev 0) +++ trunk/components-ext/src/main/java/org/dllearner/algorithm/tbsl/ltag/data/SubstNode.java 2011-03-18 09:35:21 UTC (rev 2726) @@ -0,0 +1,201 @@ +package org.dllearner.algorithm.tbsl.ltag.data; + +import java.util.ArrayList; +import java.util.List; + +import org.dllearner.algorithm.tbsl.ltag.agreement.Feature; + + +/** + * A SubstNode represents a TreeNode within a tree where the substitution + * operation is applicable. It has a field index that stores the (string) id of + * this substitution node + **/ + +public class SubstNode implements TreeNode { + + Category category; + String index; + Tree parent; + Feature constraints; + + public SubstNode(String ind, Category cat, Feature f) { + + category = cat; + index = ind; + parent = null; + constraints = f; + + } + + public SubstNode adjoin(String label, TreeNode tree) { + return this; + } + + public TreeNode substitute(String ind, TreeNode tree) { + if (index.equals(ind)) { + return tree; + } else { + return this; + } + + } + + public SubstNode replaceFoot(List<TreeNode> trees) { + return this; + } + + public boolean isAuxTree() { + return false; + } + + public List<FootNode> getFootNodes() { + List<FootNode> output = new ArrayList<FootNode>(); + return output; + } + + public List<TerminalNode> getTerminalNodes() { + List<TerminalNode> output = new ArrayList<TerminalNode>(); + return output; + } + + public Category getCategory() { + return category; + } + + public void setCategory(Category cat) { + category = cat; + } + + public List<TreeNode> getChildren() { + ArrayList<TreeNode> output = new ArrayList<TreeNode>(); + return output; + } + + public SubstNode clone() { + return new SubstNode(index, category, constraints); + } + + public void setChildren(List<TreeNode> treelist) { + + } + + public Tree getParent() { + return parent; + } + + public void setParent(Tree tree) { + parent = tree; + + } + + public void setParentForTree() { + } + + public String toString() { + return category.toString() + "[" + index + "]"; + } + + public String toString(String indent) { + return indent + category.toString() + "[" + index + "]"; + } + + public String toFileString() { + String constStr = ""; + if (constraints!=null) { + constStr = constraints.toString(); + } + return this.getCategory().toString() + "[" + this.index + "]" + + constStr; + } + + public TreeNode getRightSibling() { + int idx = this.parent.children.indexOf(this); + + // if this is rightmost children of parent, + if (idx == parent.children.size() - 1) { + return null; + } + + else { + // return right sibling + return parent.children.get(idx + 1); + } + } + + public boolean getAdjConstraint() { + return false; + } + + public void setAdjConstraint(boolean x) { + } + + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((category == null) ? 0 : category.hashCode()); + result = prime * result + ((index == nu... [truncated message content] |