001 package org.maltparser.core.syntaxgraph; 002 003 import org.maltparser.core.exception.MaltChainedException; 004 import org.maltparser.core.flow.FlowChartInstance; 005 import org.maltparser.core.flow.item.ChartItem; 006 import org.maltparser.core.flow.spec.ChartItemSpecification; 007 import org.maltparser.core.options.OptionManager; 008 import org.maltparser.core.symbol.SymbolTable; 009 import org.maltparser.core.syntaxgraph.edge.Edge; 010 import org.maltparser.core.syntaxgraph.node.DependencyNode; 011 /** 012 * 013 * 014 * @author Johan Hall 015 */ 016 public class CopyChartItem extends ChartItem { 017 private String idName; 018 private String targetName; 019 private String sourceName; 020 private String taskName; 021 private boolean usePartialTree; 022 023 private TokenStructure cachedSource = null; 024 private TokenStructure cachedTarget = null; 025 026 public CopyChartItem() {} 027 028 public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException { 029 super.initialize(flowChartinstance, chartItemSpecification); 030 for (String key : chartItemSpecification.getChartItemAttributes().keySet()) { 031 if (key.equals("id")) { 032 idName = chartItemSpecification.getChartItemAttributes().get(key); 033 } else if (key.equals("target")) { 034 targetName = chartItemSpecification.getChartItemAttributes().get(key); 035 } else if (key.equals("source")) { 036 sourceName = chartItemSpecification.getChartItemAttributes().get(key); 037 } else if (key.equals("task")) { 038 taskName = chartItemSpecification.getChartItemAttributes().get(key); 039 } 040 } 041 if (idName == null) { 042 idName = getChartElement("copy").getAttributes().get("id").getDefaultValue(); 043 } else if (targetName == null) { 044 targetName = getChartElement("copy").getAttributes().get("target").getDefaultValue(); 045 } else if (sourceName == null) { 046 sourceName = getChartElement("copy").getAttributes().get("source").getDefaultValue(); 047 } else if (taskName == null) { 048 taskName = getChartElement("copy").getAttributes().get("task").getDefaultValue(); 049 } 050 usePartialTree = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "singlemalt", "use_partial_tree").toString().equals("true"); 051 } 052 053 public int preprocess(int signal) throws MaltChainedException { 054 return signal; 055 } 056 057 public int process(int signal) throws MaltChainedException { 058 if (taskName.equals("terminals")) { 059 if (cachedSource == null) { 060 cachedSource = (TokenStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, sourceName); 061 } 062 if (cachedTarget == null) { 063 cachedTarget = (TokenStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, targetName); 064 } 065 copyTerminalStructure(cachedSource, cachedTarget); 066 // SystemLogger.logger().info("usePartialTree:" + usePartialTree); 067 if (usePartialTree && cachedSource instanceof DependencyStructure && cachedTarget instanceof DependencyStructure) { 068 copyPartialDependencyStructure((DependencyStructure)cachedSource, (DependencyStructure)cachedTarget); 069 } 070 } 071 return signal; 072 } 073 074 public int postprocess(int signal) throws MaltChainedException { 075 return signal; 076 } 077 078 079 public void terminate() throws MaltChainedException { 080 cachedSource = null; 081 cachedTarget = null; 082 } 083 084 public void copyTerminalStructure(TokenStructure sourceGraph, TokenStructure targetGraph) throws MaltChainedException { 085 targetGraph.clear(); 086 for (int index : sourceGraph.getTokenIndices()) { 087 DependencyNode gnode = sourceGraph.getTokenNode(index); 088 DependencyNode pnode = targetGraph.addTokenNode(gnode.getIndex()); 089 for (SymbolTable table : gnode.getLabelTypes()) { 090 pnode.addLabel(table, gnode.getLabelSymbol(table)); 091 } 092 } 093 } 094 095 public void copyPartialDependencyStructure(DependencyStructure sourceGraph, DependencyStructure targetGraph) throws MaltChainedException { 096 SymbolTable partHead = cachedSource.getSymbolTables().getSymbolTable("PARTHEAD"); 097 SymbolTable partDeprel = cachedSource.getSymbolTables().getSymbolTable("PARTDEPREL"); 098 if (partHead == null || partDeprel == null) { 099 return; 100 } 101 SymbolTable deprel = cachedTarget.getSymbolTables().getSymbolTable("DEPREL"); 102 for (int index : sourceGraph.getTokenIndices()) { 103 DependencyNode snode = sourceGraph.getTokenNode(index); 104 DependencyNode tnode = targetGraph.getTokenNode(index); 105 if (snode != null && tnode != null) { 106 int spartheadindex = Integer.parseInt(snode.getLabelSymbol(partHead)); 107 String spartdeprel = snode.getLabelSymbol(partDeprel); 108 if (spartheadindex > 0) { 109 Edge tedge = targetGraph.addDependencyEdge(spartheadindex, snode.getIndex()); 110 tedge.addLabel(deprel, spartdeprel); 111 } 112 } 113 } 114 } 115 116 public boolean equals(Object obj) { 117 if (this == obj) 118 return true; 119 if (obj == null) 120 return false; 121 if (getClass() != obj.getClass()) 122 return false; 123 return obj.toString().equals(this.toString()); 124 } 125 126 public int hashCode() { 127 return 217 + (null == toString() ? 0 : toString().hashCode()); 128 } 129 130 public String toString() { 131 final StringBuilder sb = new StringBuilder(); 132 sb.append(" copy "); 133 sb.append("id:");sb.append(idName); 134 sb.append(' '); 135 sb.append("task:"); 136 sb.append(taskName); 137 sb.append(' '); 138 sb.append("source:"); 139 sb.append(sourceName); 140 sb.append(' '); 141 sb.append("target:"); 142 sb.append(targetName); 143 return sb.toString(); 144 } 145 }