001 package org.maltparser.parser; 002 003 import java.util.Set; 004 import java.util.regex.Pattern; 005 006 import org.maltparser.core.config.ConfigurationDir; 007 import org.maltparser.core.exception.MaltChainedException; 008 import org.maltparser.core.flow.FlowChartInstance; 009 import org.maltparser.core.flow.item.ChartItem; 010 import org.maltparser.core.flow.spec.ChartItemSpecification; 011 import org.maltparser.core.io.dataformat.DataFormatInstance; 012 import org.maltparser.core.io.dataformat.DataFormatManager; 013 import org.maltparser.core.io.dataformat.DataFormatSpecification.DataStructure; 014 import org.maltparser.core.io.dataformat.DataFormatSpecification.Dependency; 015 import org.maltparser.core.options.OptionManager; 016 import org.maltparser.core.syntaxgraph.DependencyStructure; 017 import org.maltparser.core.syntaxgraph.MappablePhraseStructureGraph; 018 /** 019 * @author Johan Hall 020 * 021 */ 022 public class SingleMaltChartItem extends ChartItem { 023 private SingleMalt singleMalt; 024 private String idName; 025 private String targetName; 026 private String sourceName; 027 private String modeName; 028 private String taskName; 029 private DependencyStructure cachedSourceGraph = null; 030 private DependencyStructure cachedTargetGraph = null; 031 032 033 034 public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException { 035 super.initialize(flowChartinstance, chartItemSpecification); 036 037 for (String key : chartItemSpecification.getChartItemAttributes().keySet()) { 038 if (key.equals("target")) { 039 targetName = chartItemSpecification.getChartItemAttributes().get(key); 040 } else if (key.equals("source")) { 041 sourceName = chartItemSpecification.getChartItemAttributes().get(key); 042 } else if (key.equals("mode")) { 043 modeName = chartItemSpecification.getChartItemAttributes().get(key); 044 } else if (key.equals("task")) { 045 taskName = chartItemSpecification.getChartItemAttributes().get(key); 046 } else if (key.equals("id")) { 047 idName = chartItemSpecification.getChartItemAttributes().get(key); 048 } 049 } 050 if (targetName == null) { 051 targetName = getChartElement("singlemalt").getAttributes().get("target").getDefaultValue(); 052 } else if (sourceName == null) { 053 sourceName = getChartElement("singlemalt").getAttributes().get("source").getDefaultValue(); 054 } else if (modeName == null) { 055 modeName = getChartElement("singlemalt").getAttributes().get("mode").getDefaultValue(); 056 } else if (taskName == null) { 057 taskName = getChartElement("singlemalt").getAttributes().get("task").getDefaultValue(); 058 } else if (idName == null) { 059 idName = getChartElement("singlemalt").getAttributes().get("id").getDefaultValue(); 060 } 061 062 singleMalt = (SingleMalt)flowChartinstance.getFlowChartRegistry(org.maltparser.parser.SingleMalt.class, idName); 063 if (singleMalt == null) { 064 singleMalt = new SingleMalt(); 065 flowChartinstance.addFlowChartRegistry(org.maltparser.parser.SingleMalt.class, idName, singleMalt); 066 flowChartinstance.addFlowChartRegistry(org.maltparser.core.config.Configuration.class, idName, singleMalt); 067 068 } 069 } 070 071 072 public int preprocess(int signal) throws MaltChainedException { 073 if (taskName.equals("init")) { 074 if (modeName.equals("learn") || modeName.equals("parse")) { 075 OptionManager.instance().overloadOptionValue(getOptionContainerIndex(), "singlemalt", "mode", modeName); 076 ConfigurationDir configDir = (ConfigurationDir)flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName); 077 DataFormatManager dataFormatManager = configDir.getDataFormatManager(); 078 079 if (modeName.equals("learn")) { 080 DataFormatInstance dataFormatInstance = null; 081 if (dataFormatManager.getInputDataFormatSpec().getDataStructure() == DataStructure.PHRASE) { 082 Set<Dependency> deps = dataFormatManager.getInputDataFormatSpec().getDependencies(); 083 String nullValueStrategy = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "singlemalt", "null_value").toString(); 084 085 for (Dependency dep : dataFormatManager.getInputDataFormatSpec().getDependencies()) { 086 dataFormatInstance = dataFormatManager.getDataFormatSpec(dep.getDependentOn()).createDataFormatInstance(configDir.getSymbolTables(), nullValueStrategy); 087 configDir.addDataFormatInstance(dataFormatManager.getOutputDataFormatSpec().getDataFormatName(), dataFormatInstance); 088 } 089 090 String decisionSettings = OptionManager.instance().getOptionValue(getOptionContainerIndex(),"guide", "decision_settings").toString().trim(); 091 StringBuilder newDecisionSettings = new StringBuilder(); 092 if (!Pattern.matches(".*A\\.HEADREL.*", decisionSettings)) { 093 newDecisionSettings.append("+A.HEADREL"); 094 } 095 if (!Pattern.matches(".*A\\.PHRASE.*", decisionSettings)) { 096 newDecisionSettings.append("+A.PHRASE"); 097 } 098 if (!Pattern.matches(".*A\\.ATTACH.*", decisionSettings)) { 099 newDecisionSettings.append("+A.ATTACH"); 100 } 101 if (newDecisionSettings.length() > 0) { 102 OptionManager.instance().overloadOptionValue(getOptionContainerIndex(), "guide", "decision_settings", decisionSettings+newDecisionSettings.toString()); 103 } 104 } else { 105 dataFormatInstance = configDir.getDataFormatInstance(dataFormatManager.getInputDataFormatSpec().getDataFormatName()); 106 } 107 singleMalt.initialize(getOptionContainerIndex(), dataFormatInstance, configDir, SingleMalt.LEARN); 108 } else if (modeName.equals("parse")) { 109 singleMalt.initialize(getOptionContainerIndex(), 110 configDir.getDataFormatInstance(dataFormatManager.getInputDataFormatSpec().getDataFormatName()), configDir, SingleMalt.PARSE); 111 } else { 112 return ChartItem.TERMINATE; 113 } 114 } else { 115 return ChartItem.TERMINATE; 116 } 117 } 118 return signal; 119 } 120 121 public int process(int signal) throws MaltChainedException { 122 if (taskName.equals("process")) { 123 if (cachedSourceGraph == null) { 124 cachedSourceGraph = (DependencyStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, sourceName); 125 } 126 if (cachedTargetGraph == null) { 127 cachedTargetGraph = (DependencyStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, targetName); 128 } 129 if (modeName.equals("learn")) { 130 singleMalt.oracleParse(cachedSourceGraph, cachedTargetGraph); 131 } else if (modeName.equals("parse")) { 132 singleMalt.parse(cachedSourceGraph); 133 134 if (cachedSourceGraph instanceof MappablePhraseStructureGraph) { 135 System.out.println("MappablePhraseStructureGraph"); 136 ((MappablePhraseStructureGraph)cachedSourceGraph).getMapping().connectUnattachedSpines((MappablePhraseStructureGraph)cachedSourceGraph); 137 } 138 139 } 140 } 141 return signal; 142 } 143 144 public int postprocess(int signal) throws MaltChainedException { 145 if (taskName.equals("train") && singleMalt.getGuide() != null) { 146 singleMalt.getGuide().noMoreInstances(); 147 } else if (taskName.equals("train") && singleMalt.getGuide() == null) { 148 singleMalt.train(); 149 } 150 return signal; 151 } 152 153 public void terminate() throws MaltChainedException { 154 if (flowChartinstance.getFlowChartRegistry(org.maltparser.parser.SingleMalt.class, idName) != null) { 155 singleMalt.terminate(null); 156 flowChartinstance.removeFlowChartRegistry(org.maltparser.parser.SingleMalt.class, idName); 157 flowChartinstance.removeFlowChartRegistry(org.maltparser.core.config.Configuration.class, idName); 158 singleMalt = null; 159 } else { 160 singleMalt = null; 161 } 162 cachedSourceGraph = null; 163 cachedTargetGraph = null; 164 } 165 166 public SingleMalt getSingleMalt() { 167 return singleMalt; 168 } 169 170 public void setSingleMalt(SingleMalt singleMalt) { 171 this.singleMalt = singleMalt; 172 } 173 174 public String getTargetName() { 175 return targetName; 176 } 177 178 public void setTargetName(String targetName) { 179 this.targetName = targetName; 180 } 181 182 public String getSourceName() { 183 return sourceName; 184 } 185 186 public void setSourceName(String sourceName) { 187 this.sourceName = sourceName; 188 } 189 190 public boolean equals(Object obj) { 191 if (this == obj) 192 return true; 193 if (obj == null) 194 return false; 195 if (getClass() != obj.getClass()) 196 return false; 197 return obj.toString().equals(this.toString()); 198 } 199 200 public int hashCode() { 201 return 217 + (null == toString() ? 0 : toString().hashCode()); 202 } 203 204 public String toString() { 205 StringBuilder sb = new StringBuilder(); 206 sb.append(" singlemalt "); 207 sb.append("id:");sb.append(idName); 208 sb.append(' '); 209 sb.append("mode:");sb.append(modeName); 210 sb.append(' '); 211 sb.append("task:");sb.append(taskName); 212 sb.append(' '); 213 sb.append("source:");sb.append(sourceName); 214 sb.append(' '); 215 sb.append("target:");sb.append(targetName); 216 return sb.toString(); 217 } 218 }