001 package org.maltparser.parser;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.syntaxgraph.DependencyStructure;
005 import org.maltparser.parser.guide.ClassifierGuide;
006 import org.maltparser.parser.guide.OracleGuide;
007 import org.maltparser.parser.guide.SingleGuide;
008 import org.maltparser.parser.history.GuideHistory;
009 import org.maltparser.parser.history.action.GuideDecision;
010 import org.maltparser.parser.history.action.GuideUserAction;
011 /**
012 * @author Johan Hall
013 *
014 */
015 public class BatchTrainer extends Trainer {
016 private OracleGuide oracleGuide;
017 private int parseCount;
018
019 public BatchTrainer(DependencyParserConfig manager) throws MaltChainedException {
020 super(manager);
021 ((SingleMalt)manager).addRegistry(org.maltparser.parser.Algorithm.class, this);
022 setManager(manager);
023 initParserState(1);
024 setGuide(new SingleGuide(manager, (GuideHistory)parserState.getHistory(), ClassifierGuide.GuideMode.BATCH));
025 oracleGuide = parserState.getFactory().makeOracleGuide(parserState.getHistory());
026 }
027
028 public DependencyStructure parse(DependencyStructure goldDependencyGraph, DependencyStructure parseDependencyGraph) throws MaltChainedException {
029 parserState.clear();
030 parserState.initialize(parseDependencyGraph);
031 currentParserConfiguration = parserState.getConfiguration();
032 parseCount++;
033 if (diagnostics == true) {
034 writeToDiaFile(parseCount + "");
035 }
036 while (!parserState.isTerminalState()) {
037 GuideUserAction action = parserState.getTransitionSystem().getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
038 if (action == null) {
039 action = oracleGuide.predict(goldDependencyGraph, currentParserConfiguration);
040 try {
041 classifierGuide.addInstance((GuideDecision)action);
042 } catch (NullPointerException e) {
043 throw new MaltChainedException("The guide cannot be found. ", e);
044 }
045 } else if (diagnostics == true) {
046 writeToDiaFile(" *");
047 }
048 if (diagnostics == true) {
049 writeToDiaFile(" " + parserState.getTransitionSystem().getActionString(action));
050 }
051 parserState.apply(action);
052 }
053 copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
054 parseDependencyGraph.linkAllTreesToRoot();
055 oracleGuide.finalizeSentence(parseDependencyGraph);
056 if (diagnostics == true) {
057 writeToDiaFile("\n");
058 }
059 return parseDependencyGraph;
060 }
061
062 public OracleGuide getOracleGuide() {
063 return oracleGuide;
064 }
065
066 public void train() throws MaltChainedException { }
067 public void terminate() throws MaltChainedException {
068 if (diagnostics == true) {
069 closeDiaWriter();
070 }
071 }
072 }