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