001 package org.maltparser.transform.pseudo;
002
003
004 import org.maltparser.core.config.ConfigurationDir;
005 import org.maltparser.core.exception.MaltChainedException;
006 import org.maltparser.core.flow.FlowChartInstance;
007 import org.maltparser.core.flow.item.ChartItem;
008 import org.maltparser.core.flow.spec.ChartItemSpecification;
009 import org.maltparser.core.helper.SystemLogger;
010 import org.maltparser.core.io.dataformat.DataFormatInstance;
011 import org.maltparser.core.options.OptionManager;
012 import org.maltparser.core.syntaxgraph.DependencyStructure;
013 import org.maltparser.core.syntaxgraph.TokenStructure;
014 /**
015 *
016 *
017 * @author Johan Hall
018 */
019 public class PseudoProjChartItem extends ChartItem {
020 private String idName;
021 private String targetName;
022 private String sourceName;
023 private String taskName;
024
025 private String marking_strategy;
026 private String covered_root;
027 private String lifting_order;
028
029 private PseudoProjectivity pproj;
030 private boolean pprojActive = false;
031 private TokenStructure cachedGraph = null;
032
033 public PseudoProjChartItem() {}
034
035 public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException {
036 super.initialize(flowChartinstance, chartItemSpecification);
037
038 for (String key : chartItemSpecification.getChartItemAttributes().keySet()) {
039 if (key.equals("target")) {
040 targetName = chartItemSpecification.getChartItemAttributes().get(key);
041 } else if (key.equals("source")) {
042 sourceName = chartItemSpecification.getChartItemAttributes().get(key);
043 } else if (key.equals("id")) {
044 idName = chartItemSpecification.getChartItemAttributes().get(key);
045 } else if (key.equals("task")) {
046 taskName = chartItemSpecification.getChartItemAttributes().get(key);
047 }
048 }
049
050 if (targetName == null) {
051 targetName = getChartElement("pseudoproj").getAttributes().get("target").getDefaultValue();
052 } else if (sourceName == null) {
053 sourceName = getChartElement("pseudoproj").getAttributes().get("source").getDefaultValue();
054 } else if (idName == null) {
055 idName = getChartElement("pseudoproj").getAttributes().get("id").getDefaultValue();
056 } else if (taskName == null) {
057 taskName = getChartElement("pseudoproj").getAttributes().get("task").getDefaultValue();
058 }
059
060 PseudoProjectivity tmppproj = (PseudoProjectivity)flowChartinstance.getFlowChartRegistry(org.maltparser.transform.pseudo.PseudoProjectivity.class, idName);
061 if (tmppproj == null) {
062 pproj = new PseudoProjectivity();
063 flowChartinstance.addFlowChartRegistry(org.maltparser.transform.pseudo.PseudoProjectivity.class, idName, pproj);
064 } else {
065 pproj = tmppproj;
066 }
067 }
068
069 public int preprocess(int signal) throws MaltChainedException {
070 if (taskName.equals("init")) {
071 ConfigurationDir configDir = (ConfigurationDir)flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName);
072 // SymbolTableHandler symbolTables = configDir.getSymbolTables();
073 DataFormatInstance dataFormatInstance = configDir.getInputDataFormatInstance();
074 marking_strategy = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "marking_strategy").toString().trim();
075 covered_root = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "covered_root").toString().trim();
076 lifting_order = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "lifting_order").toString().trim();
077
078 if (!marking_strategy.equalsIgnoreCase("none") || !covered_root.equalsIgnoreCase("none")) {
079 pproj.initialize(marking_strategy, covered_root, lifting_order, SystemLogger.logger(), dataFormatInstance);
080 }
081 if (!marking_strategy.equalsIgnoreCase("none") || !covered_root.equalsIgnoreCase("none")) {
082 pprojActive = true;
083 }
084 }
085 return signal;
086 }
087
088 public int process(int signal) throws MaltChainedException {
089 if (cachedGraph == null) {
090 marking_strategy = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "marking_strategy").toString().trim();
091 covered_root = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "covered_root").toString().trim();
092 lifting_order = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "pproj", "lifting_order").toString().trim();
093
094 cachedGraph = (TokenStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, sourceName);
095 if (!marking_strategy.equalsIgnoreCase("none") || !covered_root.equalsIgnoreCase("none")) {
096 pprojActive = true;
097 }
098 }
099
100 if (pprojActive && cachedGraph instanceof DependencyStructure) {
101 if (taskName.equals("proj")) {
102 pproj.projectivize((DependencyStructure)cachedGraph);
103 } else if (taskName.equals("merge")) {
104 pproj.mergeArclabels((DependencyStructure)cachedGraph);
105 } else if (taskName.equals("deproj")) {
106 pproj.deprojectivize((DependencyStructure)cachedGraph);
107 } else if (taskName.equals("split")) {
108 pproj.splitArclabels((DependencyStructure)cachedGraph);
109 }
110 }
111 return signal;
112 }
113
114 public int postprocess(int signal) throws MaltChainedException {
115 return signal;
116 }
117
118
119 public void terminate() throws MaltChainedException {
120 pproj = null;
121 pprojActive = false;
122 cachedGraph = null;
123 }
124
125 public boolean equals(Object obj) {
126 if (this == obj)
127 return true;
128 if (obj == null)
129 return false;
130 if (getClass() != obj.getClass())
131 return false;
132 return obj.toString().equals(this.toString());
133 }
134
135 public int hashCode() {
136 return 217 + (null == toString() ? 0 : toString().hashCode());
137 }
138
139 public String toString() {
140 final StringBuilder sb = new StringBuilder();
141 sb.append(" pseudoproj ");
142 sb.append("id:");sb.append(idName);
143 sb.append(' ');
144 sb.append("task:");sb.append(taskName);
145 sb.append(' ');
146 sb.append("source:");sb.append(sourceName);
147 sb.append(' ');
148 sb.append("target:");sb.append(targetName);
149 return sb.toString();
150 }
151 }