package experiments.evaluation; import java.util.HashMap; import java.util.Map; public class M_Accuracy extends StatisticalMeasure { // Accuracy computation needs the true negativ value. Therefore the overall // amount of possible documents is needed // tn + fp + tp + fn public static final int amountOverallDocs = 132; // tp private double relevantDocsinQuery; // tp + fn private HashMap<Integer, Integer> amountCorrectEntries; // fp private HashMap<Integer, Integer> falsePositives; private double queryacc = 0; private double overallAcc; private int amountQueries; public M_Accuracy() { super(); relevantDocsinQuery = 0; amountCorrectEntries = new HashMap<Integer, Integer>(); falsePositives = new HashMap<Integer, Integer>(); overallAcc = 0; queryacc = 0; amountQueries = 0; classname = new String[1]; classname[0] = "Accuracy"; } @Override public void workQuery(CorrectEntry ce, ResultEntry re) { if (ce.getDocName().equalsIgnoreCase(re.getDocName())) { relevantDocsinQuery++; falsePositives.put(re.hashCode(), 1); } else { if (falsePositives.get(re.hashCode()) == null) { falsePositives.put(re.hashCode(), 0); } } amountCorrectEntries.put(ce.hashCode(), 0); } @Override public void finishQuery(int qryN) { double falsePositivesValues = 0; for (Map.Entry<Integer, Integer> item : falsePositives.entrySet()) { if (item.getValue() == 0) { falsePositivesValues++; } } double tn = amountOverallDocs - amountCorrectEntries.size() - falsePositivesValues; queryacc = (relevantDocsinQuery + tn) / (double)(amountOverallDocs); overallAcc += queryacc; amountQueries++; amountCorrectEntries = new HashMap<Integer, Integer>(); falsePositives = new HashMap<Integer, Integer>(); relevantDocsinQuery = 0; } @Override public double[] getResult() { double[] result = new double[1]; result[0] = (overallAcc / (double) amountQueries); return result; } @Override public double[] getQueryResult() { double result[] = new double[1]; result[0] = queryacc; return result; } }