package org.maltparser.parser.algorithm.stack; import java.util.Stack; import org.maltparser.core.exception.MaltChainedException; import org.maltparser.core.syntaxgraph.DependencyStructure; import org.maltparser.core.syntaxgraph.node.DependencyNode; import org.maltparser.parser.DependencyParserConfig; import org.maltparser.parser.Oracle; import org.maltparser.parser.ParserConfiguration; import org.maltparser.parser.history.GuideUserHistory; import org.maltparser.parser.history.action.GuideUserAction; /** * @author Johan Hall * */ public class ProjectiveOracle extends Oracle { public ProjectiveOracle(DependencyParserConfig manager, GuideUserHistory history) throws MaltChainedException { super(manager, history); setGuideName("projective"); } public GuideUserAction predict(DependencyStructure gold, ParserConfiguration configuration) throws MaltChainedException { StackConfig config = (StackConfig) configuration; Stack<DependencyNode> stack = config.getStack(); if (stack.size() < 2) { return updateActionContainers(Projective.SHIFT, null); } else { DependencyNode left = stack.get(stack.size() - 2); int leftIndex = left.getIndex(); int rightIndex = stack.get(stack.size() - 1).getIndex(); if (!left.isRoot() && gold.getTokenNode(leftIndex).getHead().getIndex() == rightIndex) { return updateActionContainers(Projective.LEFTARC, gold.getTokenNode(leftIndex).getHeadEdge().getLabelSet()); } else if (gold.getTokenNode(rightIndex).getHead().getIndex() == leftIndex && checkRightDependent(gold, config.getDependencyGraph(), rightIndex)) { return updateActionContainers(Projective.RIGHTARC, gold.getTokenNode(rightIndex).getHeadEdge().getLabelSet()); } else { return updateActionContainers(Projective.SHIFT, null); } // Solve the problem with non-projective input. } } private boolean checkRightDependent(DependencyStructure gold, DependencyStructure parseDependencyGraph, int index) throws MaltChainedException { if (gold.getTokenNode(index).getRightmostDependent() == null) { return true; } else if (parseDependencyGraph.getTokenNode(index).getRightmostDependent() != null) { if (gold.getTokenNode(index).getRightmostDependent().getIndex() == parseDependencyGraph.getTokenNode(index).getRightmostDependent().getIndex()) { return true; } } return false; } public void finalizeSentence(DependencyStructure dependencyGraph) throws MaltChainedException { } public void terminate() throws MaltChainedException { } }