package edu.stanford.nlp.dcoref; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.logging.Logger; /** * Wrapper for a coreference resolution score: MUC, B cubed, Pairwise. */ public abstract class CorefScorer { enum SubScoreType {Recall, Precision, F1} enum ScoreType { MUC, BCubed, Pairwise } double precisionNumSum; double precisionDenSum; double recallNumSum; double recallDenSum; private final ScoreType scoreType; CorefScorer(ScoreType st) { scoreType = st; precisionNumSum = 0.0; precisionDenSum = 0.0; recallNumSum = 0.0; recallDenSum = 0.0; } public double getScore(SubScoreType subScoreType) { switch (subScoreType) { case Precision: return getPrecision(); case Recall: return getRecall(); case F1: return getF1(); default: throw new IllegalArgumentException("Unsupported subScoreType: " + subScoreType); } } public double getPrecision() { return precisionDenSum == 0.0 ? 0.0: precisionNumSum/precisionDenSum; } public double getRecall() { return recallDenSum == 0.0 ? 0.0: recallNumSum/recallDenSum; } public double getF1() { double p = getPrecision(); double r = getRecall(); return (p + r == 0.0) ? 0.0: 2.0 * p * r / (p + r); } public void calculateScore(Document doc) { calculatePrecision(doc); calculateRecall(doc); } protected abstract void calculatePrecision(Document doc); protected abstract void calculateRecall(Document doc); public void printF1(Logger logger, boolean printF1First) { NumberFormat nf = new DecimalFormat("0.0000"); double r = getRecall(); double p = getPrecision(); double f1 = getF1(); String R = nf.format(r); String P = nf.format(p); String F1 = nf.format(f1); NumberFormat nf2 = new DecimalFormat("00.0"); String RR = nf2.format(r*100); String PP = nf2.format(p*100); String F1F1 = nf2.format(f1*100); if (printF1First) { String str = "F1 = "+F1+", P = "+P+" ("+(int) precisionNumSum+"/"+(int) precisionDenSum+"), R = "+R+" ("+(int) recallNumSum+"/"+(int) recallDenSum+")"; if(scoreType == ScoreType.Pairwise){ logger.fine("Pairwise "+str); } else if(scoreType == ScoreType.BCubed){ logger.fine("B cubed "+str); } else { logger.fine("MUC "+str); } } else { logger.fine("& "+PP+" & "+RR + " & "+F1F1); } } public void printF1(Logger logger) { printF1(logger, true); } }