package edu.stanford.nlp.patterns.surface;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import edu.stanford.nlp.patterns.CandidatePhrase;
import edu.stanford.nlp.patterns.ConstantsAndVariables;
import edu.stanford.nlp.patterns.GetPatternsFromDataMultiClass.PatternScoring;
import edu.stanford.nlp.patterns.ScorePatterns;
import edu.stanford.nlp.stats.ClassicCounter;
import edu.stanford.nlp.stats.Counter;
import edu.stanford.nlp.stats.Counters;
import edu.stanford.nlp.stats.TwoDimensionalCounter;
import edu.stanford.nlp.util.CollectionUtils;
/**
* Used if patternScoring flag is set to F1 with the seed pattern. See {@link PatternScoring} enum.
*
* @author Sonal Gupta (sonalg@stanford.edu)
*
*/
public class ScorePatternsF1<E> extends ScorePatterns<E> {
Counter<CandidatePhrase> p0Set = null;
E p0;
public ScorePatternsF1(ConstantsAndVariables constVars,
PatternScoring patternScoring,
String label, Set<CandidatePhrase> allCandidatePhrases,
TwoDimensionalCounter<E, CandidatePhrase> patternsandWords4Label,
TwoDimensionalCounter<E, CandidatePhrase> negPatternsandWords4Label,
TwoDimensionalCounter<E, CandidatePhrase> unLabeledPatternsandWords4Label,
Properties props, Counter<CandidatePhrase> p0Set, E p0){
super(constVars,
patternScoring, label, allCandidatePhrases, patternsandWords4Label,
negPatternsandWords4Label, unLabeledPatternsandWords4Label,
props);
this.p0 = p0;
this.p0Set =p0Set;
}
@Override
public void setUp(Properties props){}
@Override
public Counter<E> score() {
Counter<E> specificity = new ClassicCounter<>();
Counter<E> sensitivity = new ClassicCounter<>();
if (p0Set.keySet().size() == 0)
throw new RuntimeException("how come p0set size is empty for " + p0
+ "?");
for (Entry<E, ClassicCounter<CandidatePhrase>> en : patternsandWords4Label
.entrySet()) {
int common = CollectionUtils.intersection(en.getValue().keySet(),
p0Set.keySet()).size();
if (common == 0)
continue;
if (en.getValue().keySet().size() == 0)
throw new RuntimeException("how come counter for " + en.getKey()
+ " is empty?");
specificity.setCount(en.getKey(), common
/ (double) en.getValue().keySet().size());
sensitivity.setCount(en.getKey(), common / (double) p0Set.size());
}
Counters.retainNonZeros(specificity);
Counters.retainNonZeros(sensitivity);
Counter<E> add = Counters.add(sensitivity, specificity);
Counter<E> product = Counters.product(sensitivity,
specificity);
Counters.retainNonZeros(product);
Counters.retainKeys(product, add.keySet());
Counter<E> finalPat = Counters.scale(
Counters.division(product, add), 2);
return finalPat;
}
}