org.maltparserx.parser.algorithm.covington.CovingtonConfig Maven / Gradle / Ivy
package org.maltparserx.parser.algorithm.covington;
import java.util.ArrayList;
import org.maltparserx.core.exception.MaltChainedException;
import org.maltparserx.core.symbol.SymbolTable;
import org.maltparserx.core.symbol.SymbolTableHandler;
import org.maltparserx.core.syntaxgraph.DependencyGraph;
import org.maltparserx.core.syntaxgraph.DependencyStructure;
import org.maltparserx.core.syntaxgraph.edge.Edge;
import org.maltparserx.core.syntaxgraph.node.DependencyNode;
import org.maltparserx.parser.ParserConfiguration;
import org.maltparserx.parser.ParsingException;
/**
* @author Johan Hall
*
*/
public class CovingtonConfig extends ParserConfiguration {
private ArrayList input;
private int right;
private int left;
private int leftstop;
private int rightstop;
private DependencyStructure dependencyGraph;
private boolean allowRoot;
private boolean allowShift;
public CovingtonConfig(SymbolTableHandler symbolTableHandler, boolean cr, boolean cs) throws MaltChainedException {
super();
input = new ArrayList();
dependencyGraph = new DependencyGraph(symbolTableHandler);
setAllowRoot(cr);
setAllowShift(cs);
}
public DependencyStructure getDependencyStructure() {
return dependencyGraph;
}
public ArrayList getInput() {
return input;
}
public boolean isTerminalState() {
return right > rightstop;
}
public int getRight() {
return right;
}
public void setRight(int right) {
this.right = right;
}
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getLeftstop() {
return leftstop;
}
public int getRightstop() {
return rightstop;
}
public boolean isAllowRoot() {
return allowRoot;
}
public void setAllowRoot(boolean allowRoot) {
this.allowRoot = allowRoot;
}
public boolean isAllowShift() {
return allowShift;
}
public void setAllowShift(boolean allowShift) {
this.allowShift = allowShift;
}
public DependencyNode getLeftNode(int index) throws MaltChainedException {
if (index < 0) {
throw new ParsingException("Left index must be non-negative in feature specification. ");
}
if (left-index >= 0) {
return input.get(left-index);
}
return null;
}
public DependencyNode getRightNode(int index) throws MaltChainedException {
if (index < 0) {
throw new ParsingException("Right index must be non-negative in feature specification. ");
}
if (right+index < input.size()) {
return input.get(right+index);
}
return null;
}
public DependencyNode getLeftContextNode(int index) throws MaltChainedException {
if (index < 0) {
throw new ParsingException("LeftContext index must be non-negative in feature specification. ");
}
int tmpindex = 0;
for (int i = left+1; i < right; i++) {
if (!input.get(i).hasAncestorInside(left, right)) {
if (tmpindex == index) {
return input.get(i);
} else {
tmpindex++;
}
}
}
return null;
}
public DependencyNode getRightContextNode(int index) throws MaltChainedException {
if (index < 0) {
throw new ParsingException("RightContext index must be non-negative in feature specification. ");
}
int tmpindex = 0;
for (int i = right-1; i > left; i--) {
if (!input.get(i).hasAncestorInside(left, right)) {
if (tmpindex == index) {
return input.get(i);
} else {
tmpindex++;
}
}
}
return null;
}
public DependencyNode getLeftTarget() {
return input.get(left);
}
public DependencyNode getRightTarget() {
return input.get(right);
}
public void setDependencyGraph(DependencyStructure source) throws MaltChainedException {
dependencyGraph.clear();
for (int index : source.getTokenIndices()) {
DependencyNode gnode = source.getTokenNode(index);
DependencyNode pnode = dependencyGraph.addTokenNode(gnode.getIndex());
for (SymbolTable table : gnode.getLabelTypes()) {
pnode.addLabel(table, gnode.getLabelSymbol(table));
}
if (gnode.hasHead()) {
Edge s = gnode.getHeadEdge();
Edge t = dependencyGraph.addDependencyEdge(s.getSource().getIndex(), s.getTarget().getIndex());
for (SymbolTable table : s.getLabelTypes()) {
t.addLabel(table, s.getLabelSymbol(table));
}
}
}
for (SymbolTable table : source.getDefaultRootEdgeLabels().keySet()) {
dependencyGraph.setDefaultRootEdgeLabel(table, source.getDefaultRootEdgeLabelSymbol(table));
}
}
public DependencyStructure getDependencyGraph() {
return dependencyGraph;
}
// public void initAllowRoot(boolean allowRoot) throws MaltChainedException {
// if (allowRoot == true) {
// leftstop = 0;
// } else {
// leftstop = 1;
// }
// }
public void initialize(ParserConfiguration parserConfiguration) throws MaltChainedException {
if (parserConfiguration != null) {
CovingtonConfig covingtonConfig = (CovingtonConfig)parserConfiguration;
ArrayList sourceInput = covingtonConfig.getInput();
setDependencyGraph(covingtonConfig.getDependencyGraph());
for (int i = 0, n = sourceInput.size(); i < n; i++) {
input.add(dependencyGraph.getDependencyNode(sourceInput.get(i).getIndex()));
}
left = covingtonConfig.getLeft();
right = covingtonConfig.getRight();
rightstop = covingtonConfig.getRightstop();
leftstop = covingtonConfig.getLeftstop();
} else {
for (int i = 0, n = dependencyGraph.getHighestTokenIndex(); i <= n; i++) {
DependencyNode node = dependencyGraph.getDependencyNode(i);
if (node != null) {
input.add(node);
}
}
if (allowRoot == true) {
leftstop = 0;
} else {
leftstop = 1;
}
rightstop = dependencyGraph.getHighestTokenIndex();
left = leftstop;
right = left + 1;
}
}
public void clear() throws MaltChainedException {
dependencyGraph.clear();
input.clear();
historyNode = null;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CovingtonConfig that = (CovingtonConfig)obj;
if (input.size() != that.getInput().size())
return false;
if (dependencyGraph.nEdges() != that.getDependencyGraph().nEdges())
return false;
for (int i = 0; i < input.size(); i++) {
if (input.get(i).getIndex() != that.getInput().get(i).getIndex()) {
return false;
}
}
return dependencyGraph.getEdges().equals(that.getDependencyGraph().getEdges());
}
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(input.size());
sb.append(", ");
sb.append(dependencyGraph.nEdges());
return sb.toString();
}
}