package edu.stanford.nlp.coref.misc;
import java.util.Properties;
import edu.stanford.nlp.coref.CorefDocumentProcessor;
import edu.stanford.nlp.coref.CorefProperties;
import edu.stanford.nlp.coref.CorefProperties.Dataset;
import edu.stanford.nlp.coref.data.CorefCluster;
import edu.stanford.nlp.coref.data.Dictionaries;
import edu.stanford.nlp.coref.data.Document;
import edu.stanford.nlp.coref.data.Mention;
import edu.stanford.nlp.util.StringUtils;
import edu.stanford.nlp.util.logging.Redwood;
/**
* Evaluates the accuracy of mention detection.
* @author Kevin Clark
*/
public class MentionDetectionEvaluator implements CorefDocumentProcessor {
private static Redwood.RedwoodChannels log = Redwood.channels(MentionDetectionEvaluator.class);
private int correctSystemMentions = 0;
private int systemMentions = 0;
private int goldMentions = 0;
@Override
public void process(int id, Document document) {
for (CorefCluster gold : document.goldCorefClusters.values()) {
for (Mention m : gold.corefMentions) {
if (document.predictedMentionsByID.containsKey(m.mentionID)) {
correctSystemMentions += 1;
}
goldMentions += 1;
}
}
systemMentions += document.predictedMentionsByID.size();
double precision = correctSystemMentions / (double) systemMentions;
double recall = correctSystemMentions / (double) goldMentions;
log.info("Precision: " + correctSystemMentions + " / " + systemMentions + " = " +
String.format("%.4f", precision));
log.info("Recall: " + correctSystemMentions + " / " + goldMentions + " = " +
String.format("%.4f", recall));
log.info(String.format("F1: %.4f", 2 * precision * recall / (precision + recall)));
}
@Override
public void finish() throws Exception {}
public static void main(String[] args) throws Exception {
Properties props = StringUtils.argsToProperties(new String[] {"-props", args[0]});
Dictionaries dictionaries = new Dictionaries(props);
CorefProperties.setInput(props, Dataset.TRAIN);
new MentionDetectionEvaluator().run(props, dictionaries);
}
}