package edu.stanford.nlp.dcoref; import edu.stanford.nlp.util.logging.Redwood; import java.util.*; import edu.stanford.nlp.util.Generics; public class ScorerMUC extends CorefScorer { /** A logger for this class */ private static Redwood.RedwoodChannels log = Redwood.channels(ScorerMUC.class); public ScorerMUC() { super(ScoreType.MUC); } @Override protected void calculateRecall(Document doc) { int rDen = 0; int rNum = 0; Map<Integer, Mention> predictedMentions = doc.allPredictedMentions; for(CorefCluster g : doc.goldCorefClusters.values()){ if(g.corefMentions.size()==0) { SieveCoreferenceSystem.logger.warning("NO MENTIONS for cluster " + g.getClusterID()); continue; } rDen += g.corefMentions.size()-1; rNum += g.corefMentions.size(); Set<CorefCluster> partitions = Generics.newHashSet(); for (Mention goldMention : g.corefMentions){ if(!predictedMentions.containsKey(goldMention.mentionID)) { // twinless goldmention rNum--; } else { partitions.add(doc.corefClusters.get(predictedMentions.get(goldMention.mentionID).corefClusterID)); } } rNum -= partitions.size(); } if (rDen != doc.allGoldMentions.size()-doc.goldCorefClusters.values().size()) { log.info("rDen is " + rDen); log.info("doc.allGoldMentions.size() is " + doc.allGoldMentions.size()); log.info("doc.goldCorefClusters.values().size() is " + doc.goldCorefClusters.values().size()); } assert(rDen == (doc.allGoldMentions.size()-doc.goldCorefClusters.values().size())); recallNumSum += rNum; recallDenSum += rDen; } @Override protected void calculatePrecision(Document doc) { int pDen = 0; int pNum = 0; Map<Integer, Mention> goldMentions = doc.allGoldMentions; for(CorefCluster c : doc.corefClusters.values()){ if(c.corefMentions.size()==0) continue; pDen += c.corefMentions.size()-1; pNum += c.corefMentions.size(); Set<CorefCluster> partitions = Generics.newHashSet(); for (Mention predictedMention : c.corefMentions){ if(!goldMentions.containsKey(predictedMention.mentionID)) { // twinless goldmention pNum--; } else { partitions.add(doc.goldCorefClusters.get(goldMentions.get(predictedMention.mentionID).goldCorefClusterID)); } } pNum -= partitions.size(); } assert(pDen == (doc.allPredictedMentions.size()-doc.corefClusters.values().size())); precisionDenSum += pDen; precisionNumSum += pNum; } }