package edu.stanford.nlp.parser.ensemble; import edu.stanford.nlp.parser.ensemble.utils.DeprojectivizeCorpus; import edu.stanford.nlp.parser.ensemble.utils.Now; import edu.stanford.nlp.parser.ensemble.utils.ReverseCorpus; import edu.stanford.nlp.parser.ensemble.utils.Scorer; import edu.stanford.nlp.parser.ensemble.utils.Scorer.Score; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import org.apache.commons.io.FileUtils; import org.maltparser.core.helper.SystemLogger; public class RunnableTestJob extends BaseModelRunnableJob implements Runnable { public RunnableTestJob(Ensemble ensemble, int index) { super(ensemble, index); } @Override public void run() { try { SystemLogger.logger().info("Starting job " + ensemble.baseModels[baseModelIndex] + " at " + new Now() + "...\n"); createWorkingDirectory(); // args for malt String params = makeMaltEngineParameters(); // run malt Process p = Runtime.getRuntime().exec("java -Xmx2048m -jar lib" + File.separator + "maltParser.jar " + params); BufferedReader stdError = new BufferedReader(new InputStreamReader( p.getErrorStream())); String str; if (ensemble.multiThreadEval == true) { while ((str = stdError.readLine()) != null) { System.out.println(ensemble.baseModels[baseModelIndex] + ") " + str); } } else { while ((str = stdError.readLine()) != null) { System.out.println(str); } } // reverse output if right-to-left if (!leftToRight) { File origFile; File reversedFile; if (pseudo_projective) { origFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel + ".pp.reversed"); reversedFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel + ".pp"); } else { origFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel + ".reversed"); reversedFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel); } try { ReverseCorpus.reverseCorpus(origFile.getAbsolutePath(), reversedFile.getAbsolutePath()); origFile.delete(); } catch (IOException e) { SystemLogger.logger().error("Failed to reverse file " + origFile.getAbsolutePath() + " to " + reversedFile + "!\n"); e.printStackTrace(); throw new RuntimeException(e); } if (pseudo_projective) { origFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel + ".pp"); reversedFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel); String modelName = "pp-reverse"; try { DeprojectivizeCorpus.Deprojectivize(ensemble.workingDirectory, origFile.getName(), reversedFile.getName(), modelName); origFile.delete(); } catch (Exception e) { SystemLogger.logger().error("Failed to deprojectivize file " + origFile.getAbsolutePath() + " to " + reversedFile + "!\n"); e.printStackTrace(); throw new RuntimeException(e); } } } else if (pseudo_projective) { File origFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel + ".pp"); File destFile = new File(ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel); String modelName = "pp"; try { DeprojectivizeCorpus.Deprojectivize(ensemble.workingDirectory, origFile.getName(), destFile.getName(), modelName); origFile.delete(); } catch (Exception e) { SystemLogger.logger().error("Failed to deprojectivize file " + origFile.getAbsolutePath() + " to " + destFile + "!\n"); e.printStackTrace(); throw new RuntimeException(e); } } // score this model String sysFile = ensemble.workingDirectory + File.separator + ensemble.outputPrefix + "." + ensemble.modelName + "-" + baseModel; Score s = null; try { s = Scorer.evaluate(ensemble.testCorpus, sysFile); } catch (IOException e) { e.printStackTrace(); System.err.println("WARNING: Cannot open files generated by model " + baseModel); } if (s != null) { SystemLogger.logger().info(String.format(baseModel + " LAS: %.2f %d/%d\n", s.las, s.lcorrect, s.total)); SystemLogger.logger().info(String.format(baseModel + " UAS: %.2f %d/%d\n", s.uas, s.ucorrect, s.total)); } ensemble.threadFinished(); SystemLogger.logger().info("Ended job " + baseModel + " at " + new Now() + ".\n"); SystemLogger.logger().info("-----------------------------------------------------------------------------\n"); } catch (IOException e) { e.printStackTrace(); } } private String makeMaltEngineParameters() { StringBuilder pars = new StringBuilder(); // flowchart: Flow chart // -parse [Parse with a Single MaltParser configuration] pars.append("-m "); pars.append("parse"); // name: Configuration name pars.append(" -c "); pars.append(ensemble.modelName).append("-").append(baseModel); // learner: Learner // - libsvm [LIBSVM learner] // - liblinear [LIBLINEAR learner] pars.append(" -l "); pars.append("liblinear"); // verbosity: Verbosity of the liblinear or the libsvm package // - silent [No output from the liblinear or the libsvm package is logged.] // - error [Only the error stream of the liblinear or the libsvm package is logged.] // - all [All output of the liblinear or the libsvm package is logged.] pars.append(" -lv "); pars.append(ensemble.libLinearLogLevel); // verbosity: Verbosity level // - off [Logging turned off] // - fatal [Logging of very severe error events] // - error [Logging of error events] // - warn [Logging of harmful situations] // - info [Logging of informational messages] // - debug [Logging of debugging messages] pars.append(" -v "); pars.append(ensemble.logLevel); // workingdir: Working directory pars.append(" -w "); pars.append(workingDirectory.getAbsolutePath()); File from = new File(ensemble.modelDirectory + File.separator + ensemble.modelName + "-" + baseModel + ".mco"); File to = new File(workingDirectory.getAbsolutePath() + File.separator + ensemble.modelName + "-" + baseModel + ".mco"); try { FileUtils.copyFile(from, to); } catch(Exception e){ e.printStackTrace(); System.err.println("WARNING: Cannot find trained model: " + baseModel); } // infile: Path to input file pars.append(" -i "); if (leftToRight) { pars.append(ensemble.testCorpus); } else { File origFile = new File(ensemble.testCorpus); File reversedFile = new File(ensemble.workingDirectory + File.separator + origFile.getName() + ".reversed"); pars.append(reversedFile.getAbsolutePath()); } // outfile: Path to output file pars.append(" -o "); if (leftToRight) { if (pseudo_projective) pars.append(ensemble.workingDirectory).append(File.separator).append(ensemble.outputPrefix).append(".").append(ensemble.modelName).append("-").append(baseModel).append(".pp"); else pars.append(ensemble.workingDirectory).append(File.separator).append(ensemble.outputPrefix).append(".").append(ensemble.modelName).append("-").append(baseModel); } else { if (pseudo_projective) pars.append(ensemble.workingDirectory).append(File.separator).append(ensemble.outputPrefix).append(".").append(ensemble.modelName).append("-").append(baseModel).append(".pp.reversed"); else pars.append(ensemble.workingDirectory).append(File.separator).append(ensemble.outputPrefix).append(".").append(ensemble.modelName).append("-").append(baseModel).append(".reversed"); } return pars.toString(); } }