package edu.stanford.nlp.semparse.open.dataset; import java.util.*; import edu.stanford.nlp.semparse.open.dataset.entity.TargetEntity; import edu.stanford.nlp.semparse.open.dataset.entity.TargetEntityNearMatch; import edu.stanford.nlp.semparse.open.dataset.library.JSONDataset.JSONDatasetDatum; /** * Must match first, second, and last entities */ public class CriteriaGeneralWeb implements Criteria { public final JSONDatasetDatum datum; public final TargetEntity first, second, last; public CriteriaGeneralWeb(JSONDatasetDatum datum) { this.datum = datum; this.first = new TargetEntityNearMatch(datum.criteria.first); this.second = new TargetEntityNearMatch(datum.criteria.second); this.last = new TargetEntityNearMatch(datum.criteria.last); } @Override public List<TargetEntity> getTargetEntities() { return Arrays.asList(first, second, last); } @Override public int countMatchedCriteria(List<String> predictedEntities) { int n = predictedEntities.size(), answer = 0; String predictedFirst = n > 0 ? predictedEntities.get(0) : "", predictedSecond = n > 1 ? predictedEntities.get(1) : "", predictedLast = n > 0 ? predictedEntities.get(n - 1) : ""; if (first.match(predictedFirst)) answer++; if (second.match(predictedSecond)) answer++; if (last.match(predictedLast)) answer++; return answer; } @Override public int numCriteria() { return 3; } @Override public IRScore getIRScore(List<String> predictedEntities) { return new IRScore(countMatchedCriteria(predictedEntities), numCriteria(), numCriteria()); } @Override public double getCorrectnessScore(List<String> predictedEntities) { // TODO Make this better if (countMatchedCriteria(predictedEntities) != numCriteria()) return 0; return predictedEntities.size(); // Prefer larger set of entities } }