// Copyright 2014 Thomas Müller
// This file is part of HMMLA, which is licensed under GPLv3.
package hmmla;
import hmmla.decode.CoarseToFineDecoder;
import hmmla.decode.Decoder;
import hmmla.decode.SupervisedDecoder;
import hmmla.eval.Eval;
import hmmla.eval.Result;
import hmmla.hmm.HmmTrainer;
import hmmla.hmm.HmmTrainerFactory;
import hmmla.hmm.Model;
import hmmla.io.PosReader;
import hmmla.io.PosWriter;
import hmmla.io.Sentence;
import hmmla.util.Mapping;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class Tagger {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
props.setPropertiesFromStrings(args);
props.check(Tagger.class.getSimpleName());
Model model = Model.loadFromFile(props.getModelFile());
model.setProperties(props);
boolean refine = props.getRefine();
boolean toplevel = props.getCoarseDecoder();
Mapping upos = null;
if (props.getUniversalPos()) {
upos = new Mapping(props.getUniversalPosFile());
}
Iterable<Sentence> reader = new PosReader(props.getTestFile(),
upos);
HmmTrainer trainer = HmmTrainerFactory.getTrainer(props);
Decoder decoder;
if (refine) {
decoder = new SupervisedDecoder(model, trainer.train(model));
} else {
decoder = new CoarseToFineDecoder(model, trainer, toplevel, false);
}
Result result = new Result();
PosWriter writer = new PosWriter(new FileWriter(props.getPredFile()));
for (Sentence sentence : reader) {
List<String> tags = decoder.bestPath(sentence);
if (toplevel && ! refine && props.getTest())
result.increment(Eval.eval(tags, sentence, model));
writer.write(sentence, tags);
}
if (toplevel && !refine && props.getTest())
System.err.println(result);
writer.close();
}
}