package org.maltparser.core.syntaxgraph; import org.maltparser.core.config.ConfigurationDir; import org.maltparser.core.exception.MaltChainedException; import org.maltparser.core.flow.FlowChartInstance; import org.maltparser.core.flow.FlowException; import org.maltparser.core.flow.item.ChartItem; import org.maltparser.core.flow.spec.ChartItemSpecification; import org.maltparser.core.helper.HashSet; import org.maltparser.core.io.dataformat.DataFormatInstance; import org.maltparser.core.io.dataformat.DataFormatManager; import org.maltparser.core.io.dataformat.DataFormatSpecification.DataStructure; import org.maltparser.core.io.dataformat.DataFormatSpecification.Dependency; import org.maltparser.core.options.OptionManager; import org.maltparser.core.symbol.SymbolTableHandler; import org.maltparser.core.syntaxgraph.ds2ps.LosslessMapping; /** * * * @author Johan Hall */ public class SyntaxGraphChartItem extends ChartItem { private String idName; private String structureName; private String taskName; private TokenStructure graph; public SyntaxGraphChartItem() { super(); } @Override public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException { super.initialize(flowChartinstance, chartItemSpecification); for (String key : chartItemSpecification.getChartItemAttributes().keySet()) { if (key.equals("id")) { idName = chartItemSpecification.getChartItemAttributes().get(key); } else if (key.equals("structure")) { structureName = chartItemSpecification.getChartItemAttributes().get(key); } else if (key.equals("task")) { taskName = chartItemSpecification.getChartItemAttributes().get(key); } } if (idName == null) { idName = getChartElement("graph").getAttributes().get("id").getDefaultValue(); } else if (structureName == null) { structureName = getChartElement("graph").getAttributes().get("structure").getDefaultValue(); } else if (taskName == null) { taskName = getChartElement("graph").getAttributes().get("task").getDefaultValue(); } } public int preprocess(int signal) throws MaltChainedException { if (taskName.equals("create")) { boolean phrase = false; boolean dependency = false; ConfigurationDir configDir = (ConfigurationDir) flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName); DataFormatInstance dataFormatInstance = null; DataFormatManager dataFormatManager = configDir.getDataFormatManager(); SymbolTableHandler symbolTables = configDir.getSymbolTables(); for (String key : configDir.getDataFormatInstanceKeys()) { DataFormatInstance dfi = configDir.getDataFormatInstance(key); if (dfi.getDataFormarSpec().getDataStructure() == DataStructure.PHRASE) { phrase = true; } if (dfi.getDataFormarSpec().getDataStructure() == DataStructure.DEPENDENCY) { dependency = true; dataFormatInstance = dfi; } } if (dependency == false && OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "flowchart").toString().equals("learn")) { dependency = true; HashSet<Dependency> deps = dataFormatManager.getInputDataFormatSpec().getDependencies(); String nullValueStategy = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "singlemalt", "null_value").toString(); for (Dependency dep : deps) { dataFormatInstance = dataFormatManager.getDataFormatSpec(dep.getDependentOn()).createDataFormatInstance(symbolTables, nullValueStategy); configDir.addDataFormatInstance(dataFormatManager.getOutputDataFormatSpec().getDataFormatName(), dataFormatInstance); } } if (dependency == true && phrase == false) { graph = new DependencyGraph(symbolTables); flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, structureName, graph); } else if (dependency == true && phrase == true) { graph = new MappablePhraseStructureGraph(symbolTables); final DataFormatInstance inFormat = configDir.getDataFormatInstance(dataFormatManager.getInputDataFormatSpec().getDataFormatName()); final DataFormatInstance outFormat = configDir.getDataFormatInstance(dataFormatManager.getOutputDataFormatSpec().getDataFormatName()); if (inFormat != null && outFormat != null) { LosslessMapping mapping; if (inFormat.getDataFormarSpec().getDataStructure() == DataStructure.DEPENDENCY) { mapping = new LosslessMapping(inFormat, outFormat); } else { mapping = new LosslessMapping(outFormat, inFormat); } if (inFormat.getDataFormarSpec().getDataStructure() == DataStructure.PHRASE) { mapping.setHeadRules(OptionManager.instance().getOptionValue(getOptionContainerIndex(), "graph", "head_rules").toString()); } ((MappablePhraseStructureGraph) graph).setMapping(mapping); } else { throw new FlowException("Couldn't determine the input and output data format. "); } flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, structureName, graph); flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.PhraseStructure.class, structureName, graph); } else if (dependency == false && phrase == true) { graph = new PhraseStructureGraph(symbolTables); flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.PhraseStructure.class, structureName, graph); } else { graph = new Sentence(symbolTables); } if (dataFormatInstance != null) { ((DependencyStructure) graph).setDefaultRootEdgeLabels( OptionManager.instance().getOptionValue(getOptionContainerIndex(), "graph", "root_label").toString(), dataFormatInstance.getDependencyEdgeLabelSymbolTables()); } flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, structureName, graph); } return signal; } public int process(int signal) throws MaltChainedException { return signal; } public int postprocess(int signal) throws MaltChainedException { return signal; } public void terminate() throws MaltChainedException { if (graph != null) { graph.clear(); graph = null; } } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } return obj.toString().equals(this.toString()); } @Override public int hashCode() { return 217 + (null == toString() ? 0 : toString().hashCode()); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(" graph "); sb.append("id:"); sb.append(idName); sb.append(' '); sb.append("task:"); sb.append(taskName); sb.append(' '); sb.append("structure:"); sb.append(structureName); return sb.toString(); } }