package edu.uncc.cs.watsonsim.scorers; import java.util.Arrays; import java.util.List; import edu.uncc.cs.watsonsim.Answer; import edu.uncc.cs.watsonsim.Passage; import edu.uncc.cs.watsonsim.Phrase; import edu.uncc.cs.watsonsim.Question; import edu.uncc.cs.watsonsim.Score; /** Scorers apply scores in parallel to: * - Answers * - Passages * By default, a score is NaN. * Scorers are expected to run in parallel. Try to avoid side effects. * Otherwise use "synchronized". */ public abstract class PassageScorer implements Scorer { // This is a constructor-less hack to give Researchers a convenient name // It is used for assigning scores. String name; private String max_name, min_name, median_name, mean_name; { name = this.getClass().getSimpleName().replaceAll("([a-z])([A-Z]+)", "$1_$2").toUpperCase(); max_name = name+"_MAX"; min_name = name+"_MIN"; mean_name = name+"_MEAN"; median_name = name+"_MEDIAN"; Score.register(max_name, -1, Merge.Mean); Score.register(min_name, -1, Merge.Mean); Score.register(mean_name, -1, Merge.Mean); Score.register(median_name, -1, Merge.Mean); } /** Default implementation of research for a question. * Calls research_answer for every Answer, collecting the mean, median, max * and min of the results. * Override this if you need more power. * @param q Question */ public void scoreQuestion(Question q, List<Answer> answers) { for (Answer a : answers) { double sum = 0.0; final int p_count = a.passages.size(); if (p_count > 0) { double[] scores = new double[p_count]; for (int pi=0; pi<p_count; pi++) { Passage p = a.passages.get(pi); scores[pi] = scorePassage(q, a, p); sum += scores[pi]; p.score(name, scores[pi]); } Arrays.sort(scores); a.score(max_name, scores[0]); a.score(min_name, scores[p_count - 1]); a.score(mean_name, sum/p_count); a.score(median_name, scores[p_count / 2]); } } } /** Default implementation for researching a passage. * Does nothing by default. You don't need to override this if you don't * use it. * * @param q Input Question, varies slowest * @param a Input Answer, varies medium * @param p Input Passage, varies fastest */ public double scorePassage(Phrase q, Answer a, Passage p) { return Double.NaN; } }