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 }