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 }