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