    001    package org.maltparser.parser.algorithm.stack;
    002
    003    import java.util.Stack;
    004
    005    import org.maltparser.core.exception.MaltChainedException;
    006    import org.maltparser.core.syntaxgraph.DependencyStructure;
    007    import org.maltparser.core.syntaxgraph.node.DependencyNode;
    008    import org.maltparser.parser.DependencyParserConfig;
    009    import org.maltparser.parser.Oracle;
    010    import org.maltparser.parser.ParserConfiguration;
    011    import org.maltparser.parser.history.GuideUserHistory;
    012    import org.maltparser.parser.history.action.GuideUserAction;
    013    /**
    014     * @author Johan Hall
    015     *
    016     */
    017    public 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    }