    001    package org.maltparser.parser.algorithm.nivre;
    002
    003    import org.maltparser.core.exception.MaltChainedException;
    004    import org.maltparser.core.syntaxgraph.DependencyStructure;
    005    import org.maltparser.core.syntaxgraph.node.DependencyNode;
    006    import org.maltparser.parser.DependencyParserConfig;
    007    import org.maltparser.parser.Oracle;
    008    import org.maltparser.parser.ParserConfiguration;
    009    import org.maltparser.parser.history.GuideUserHistory;
    010    import org.maltparser.parser.history.action.GuideUserAction;
    011    /**
    012     * @author Johan Hall
    013     *
    014     */
    015    public class ArcStandardOracle extends Oracle {
    016
    017            public ArcStandardOracle(DependencyParserConfig manager, GuideUserHistory history) throws MaltChainedException {
    018                    super(manager, history);
    019                    setGuideName("ArcStandard");
    020            }
    021
    022            public GuideUserAction predict(DependencyStructure gold, ParserConfiguration config) throws MaltChainedException {
    023                    NivreConfig nivreConfig = (NivreConfig)config;
    024                    DependencyNode stackPeek = nivreConfig.getStack().peek();
    025                    int stackPeekIndex = stackPeek.getIndex();
    026                    int inputPeekIndex = nivreConfig.getInput().peek().getIndex();
    027
    028                    if (nivreConfig.getRootHandling() != NivreConfig.NORMAL && stackPeek.isRoot()) {
    029                            return updateActionContainers(ArcStandard.SHIFT, null);
    030                    }
    031                    if (!stackPeek.isRoot() && gold.getTokenNode(stackPeekIndex).getHead().getIndex() == inputPeekIndex) {
    032                            return updateActionContainers(ArcStandard.LEFTARC, gold.getTokenNode(stackPeekIndex).getHeadEdge().getLabelSet());
    033                    } else if (gold.getTokenNode(inputPeekIndex).getHead().getIndex() == stackPeekIndex && checkRightDependent(gold, nivreConfig.getDependencyGraph(), inputPeekIndex)) {
    034                            return updateActionContainers(ArcStandard.RIGHTARC, gold.getTokenNode(inputPeekIndex).getHeadEdge().getLabelSet());
    035                    } else {
    036                            return updateActionContainers(ArcStandard.SHIFT, null);
    037                    }
    038            }
    039
    040            private boolean checkRightDependent(DependencyStructure gold, DependencyStructure parseDependencyGraph, int inputPeekIndex) throws MaltChainedException {
    041                    if (gold.getTokenNode(inputPeekIndex).getRightmostDependent() == null) {
    042                            return true;
    043                    } else if (parseDependencyGraph.getTokenNode(inputPeekIndex).getRightmostDependent() != null) {
    044                            if (gold.getTokenNode(inputPeekIndex).getRightmostDependent().getIndex() == parseDependencyGraph.getTokenNode(inputPeekIndex).getRightmostDependent().getIndex()) {
    045                                    return true;
    046                            }
    047                    }
    048                    return false;
    049            }
    050
    051            public void finalizeSentence(DependencyStructure dependencyGraph) throws MaltChainedException {
    052
    053            }
    054
    055            public void terminate() throws MaltChainedException {
    056
    057            }
    058    }