001package org.maltparser.parser.algorithm.stack; 002 003import java.util.Stack; 004 005import org.maltparser.core.exception.MaltChainedException; 006import org.maltparser.core.syntaxgraph.DependencyStructure; 007import org.maltparser.core.syntaxgraph.node.DependencyNode; 008import org.maltparser.parser.DependencyParserConfig; 009import org.maltparser.parser.Oracle; 010import org.maltparser.parser.ParserConfiguration; 011import org.maltparser.parser.history.GuideUserHistory; 012import org.maltparser.parser.history.action.GuideUserAction; 013/** 014 * @author Johan Hall 015 * 016 */ 017public class ProjectiveOracle extends Oracle { 018 public ProjectiveOracle(DependencyParserConfig manager, GuideUserHistory history) throws MaltChainedException { 019 super(manager, history); 020 setGuideName("projective"); 021 } 022 023 public GuideUserAction predict(DependencyStructure gold, ParserConfiguration configuration) throws MaltChainedException { 024 StackConfig config = (StackConfig)configuration; 025 Stack<DependencyNode> stack = config.getStack(); 026 027 if (stack.size() < 2) { 028 return updateActionContainers(Projective.SHIFT, null); 029 } else { 030 DependencyNode left = stack.get(stack.size()-2); 031 int leftIndex = left.getIndex(); 032 int rightIndex = stack.get(stack.size()-1).getIndex(); 033 if (!left.isRoot() && gold.getTokenNode(leftIndex).getHead().getIndex() == rightIndex) { 034 return updateActionContainers(Projective.LEFTARC, gold.getTokenNode(leftIndex).getHeadEdge().getLabelSet()); 035 } else if (gold.getTokenNode(rightIndex).getHead().getIndex() == leftIndex && checkRightDependent(gold, config.getDependencyGraph(), rightIndex)) { 036 return updateActionContainers(Projective.RIGHTARC, gold.getTokenNode(rightIndex).getHeadEdge().getLabelSet()); 037 } else { 038 return updateActionContainers(Projective.SHIFT, null); 039 } // Solve the problem with non-projective input. 040 } 041 } 042 043 private boolean checkRightDependent(DependencyStructure gold, DependencyStructure parseDependencyGraph, int index) throws MaltChainedException { 044 if (gold.getTokenNode(index).getRightmostDependent() == null) { 045 return true; 046 } else if (parseDependencyGraph.getTokenNode(index).getRightmostDependent() != null) { 047 if (gold.getTokenNode(index).getRightmostDependent().getIndex() == parseDependencyGraph.getTokenNode(index).getRightmostDependent().getIndex()) { 048 return true; 049 } 050 } 051 return false; 052 } 053 054 public void finalizeSentence(DependencyStructure dependencyGraph) throws MaltChainedException { 055 056 } 057 058 public void terminate() throws MaltChainedException { 059 060 } 061}