001 package org.maltparser.core.propagation; 002 003 import java.util.SortedSet; 004 import java.util.TreeSet; 005 import java.util.regex.Pattern; 006 007 import org.maltparser.core.exception.MaltChainedException; 008 import org.maltparser.core.propagation.spec.PropagationSpec; 009 import org.maltparser.core.symbol.SymbolTable; 010 import org.maltparser.core.symbol.SymbolTableHandler; 011 import org.maltparser.core.syntaxgraph.edge.Edge; 012 import org.maltparser.core.syntaxgraph.node.DependencyNode; 013 014 /** 015 * A propagation object propagate a column value from one node to a column in another node based on the propagation specification. 016 * 017 * @author Johan Hall 018 * 019 */ 020 public class Propagation { 021 /** 022 * 023 */ 024 private SymbolTable fromTable; 025 private SymbolTable toTable; 026 private SymbolTable deprelTable; 027 private SortedSet<String> forSet; 028 private SortedSet<String> overSet; 029 030 private Pattern symbolSeparator; 031 032 /** 033 * Creates a propagation object based on the propagation specification 034 * 035 * @param spec a propagation specification 036 * @param symbolTables a symbol table 037 * @throws MaltChainedException 038 */ 039 public Propagation(PropagationSpec spec, SymbolTableHandler symbolTables) throws MaltChainedException { 040 fromTable = symbolTables.getSymbolTable(spec.getFrom()); 041 if (fromTable == null) { 042 throw new PropagationException("The symbol table '"+spec.getFrom()+" does not exists."); 043 } 044 toTable = symbolTables.getSymbolTable(spec.getTo()); 045 if (toTable == null) { 046 toTable = symbolTables.addSymbolTable(spec.getTo(), fromTable); 047 } 048 049 forSet = new TreeSet<String>(); 050 if (spec.getFor() != null && spec.getFor().length() > 0) { 051 String[] items = spec.getFor().split("\\|"); 052 053 for (String item : items) { 054 forSet.add(item); 055 } 056 } 057 058 overSet = new TreeSet<String>(); 059 if (spec.getOver() != null && spec.getOver().length() > 0) { 060 String[] items = spec.getOver().split("\\|"); 061 062 for (String item : items) { 063 overSet.add(item); 064 } 065 } 066 067 deprelTable = symbolTables.getSymbolTable("DEPREL"); 068 symbolSeparator = Pattern.compile("\\|"); 069 } 070 071 /** 072 * Propagate columns according to the propagation specification 073 * 074 * @param e an edge 075 * @throws MaltChainedException 076 */ 077 public void propagate(Edge e) throws MaltChainedException { 078 if (e != null && e.hasLabel(deprelTable) && !e.getSource().isRoot()) { 079 if (overSet.size() == 0 || overSet.contains(e.getLabelSymbol(deprelTable))) { 080 DependencyNode to = (DependencyNode)e.getSource(); 081 DependencyNode from = (DependencyNode)e.getTarget(); 082 String fromSymbol = null; 083 if (e.hasLabel(fromTable)) { 084 fromSymbol = e.getLabelSymbol(fromTable); 085 } else if (from.hasLabel(fromTable)) { 086 fromSymbol = from.getLabelSymbol(fromTable); 087 } 088 089 String propSymbol = null; 090 if (to.hasLabel(toTable)) { 091 propSymbol = union(fromSymbol, to.getLabelSymbol(toTable)); 092 } else { 093 if (forSet.size() == 0 || forSet.contains(fromSymbol)) { 094 propSymbol = fromSymbol; 095 } 096 } 097 if (propSymbol != null) { 098 to.addLabel(toTable, propSymbol); 099 } 100 } 101 } 102 } 103 104 private String union(String fromSymbol, String toSymbol) { 105 SortedSet<String> symbolSet = new TreeSet<String>(); 106 107 if (fromSymbol != null && fromSymbol.length() != 0) { 108 String[] fromSymbols = symbolSeparator.split(fromSymbol); 109 for (int i = 0; i < fromSymbols.length; i++) { 110 if (forSet.size() == 0 || forSet.contains(fromSymbols[i])) { 111 symbolSet.add(fromSymbols[i]); 112 } 113 } 114 } 115 if (toSymbol != null && toSymbol.length() != 0) { 116 String[] toSymbols = symbolSeparator.split(toSymbol); 117 for (int i = 0; i < toSymbols.length; i++) { 118 symbolSet.add(toSymbols[i]); 119 } 120 } 121 122 if (symbolSet.size() > 0) { 123 StringBuilder sb = new StringBuilder(); 124 for (String symbol : symbolSet) { 125 sb.append(symbol); 126 sb.append('|'); 127 } 128 sb.setLength(sb.length()-1); 129 return sb.toString(); 130 } 131 132 133 return ""; 134 } 135 @Override 136 public String toString() { 137 return "Propagation [forSet=" + forSet + ", fromTable=" + fromTable 138 + ", overSet=" + overSet + ", toTable=" + toTable + "]"; 139 } 140 }