001 package org.maltparser.parser.algorithm.covington;
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 CovingtonOracle extends Oracle {
016 public CovingtonOracle(DependencyParserConfig manager, GuideUserHistory history) throws MaltChainedException {
017 super(manager, history);
018 setGuideName("NonProjective");
019 }
020
021 public GuideUserAction predict(DependencyStructure gold, ParserConfiguration config) throws MaltChainedException {
022 CovingtonConfig covingtonConfig = (CovingtonConfig)config;
023 DependencyNode leftTarget = covingtonConfig.getLeftTarget();
024 int leftTargetIndex = leftTarget.getIndex();
025 int rightTargetIndex = covingtonConfig.getRightTarget().getIndex();
026
027 if (!leftTarget.isRoot() && gold.getTokenNode(leftTargetIndex).getHead().getIndex() == rightTargetIndex) {
028 return updateActionContainers(NonProjective.LEFTARC, gold.getTokenNode(leftTargetIndex).getHeadEdge().getLabelSet());
029 } else if (gold.getTokenNode(rightTargetIndex).getHead().getIndex() == leftTargetIndex) {
030 return updateActionContainers(NonProjective.RIGHTARC, gold.getTokenNode(rightTargetIndex).getHeadEdge().getLabelSet());
031 } else if (covingtonConfig.isAllowShift() == true && (!(gold.getTokenNode(rightTargetIndex).hasLeftDependent()
032 && gold.getTokenNode(rightTargetIndex).getLeftmostDependent().getIndex() < leftTargetIndex)
033 && !(gold.getTokenNode(rightTargetIndex).getHead().getIndex() < leftTargetIndex
034 && (!gold.getTokenNode(rightTargetIndex).getHead().isRoot() || covingtonConfig.getLeftstop() == 0)))) {
035 return updateActionContainers(NonProjective.SHIFT, null);
036 } else {
037 return updateActionContainers(NonProjective.NOARC, null);
038 }
039 }
040
041 public void finalizeSentence(DependencyStructure dependencyGraph) throws MaltChainedException {
042
043 }
044
045 public void terminate() throws MaltChainedException {
046
047 }
048 }