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}