package uk.ac.shef.dcs.jate.feature; import uk.ac.shef.dcs.jate.JATERecursiveTaskWorker; import java.util.List; import java.util.Map; import java.util.Set; class ChiSquareFrequentTermsFBWorker extends JATERecursiveTaskWorker<String, Integer> { private static final long serialVersionUID = -1208424489000405973L; private final Map<ContextWindow, Integer> ctx2TTF; private final Map<String, Set<ContextWindow>> term2Ctx; private final ChiSquareFrequentTerms feature; private final int ttfInCorpus; ChiSquareFrequentTermsFBWorker(List<String> tasks, int maxTasksPerWorker, Map<ContextWindow, Integer> ctx2TTF, Map<String, Set<ContextWindow>> term2Ctx, ChiSquareFrequentTerms feature, int ttfInCorpus) { super(tasks, maxTasksPerWorker); this.ctx2TTF = ctx2TTF; this.term2Ctx = term2Ctx; this.feature = feature; this.ttfInCorpus = ttfInCorpus; } @Override protected JATERecursiveTaskWorker<String, Integer> createInstance(List<String> splitTasks) { return new ChiSquareFrequentTermsFBWorker(splitTasks, maxTasksPerThread, ctx2TTF, term2Ctx, feature, ttfInCorpus ); } @Override protected Integer mergeResult(List<JATERecursiveTaskWorker<String, Integer>> jateRecursiveTaskWorkers) { int totalSuccess = 0; for (JATERecursiveTaskWorker<String, Integer> worker : jateRecursiveTaskWorkers) { int rs = worker.join(); totalSuccess += rs; } return totalSuccess; } @Override protected Integer computeSingleWorker(List<String> tasks) { int count=0; for (String refTerm : tasks) { Set<ContextWindow> ctx_g = term2Ctx.get(refTerm); if (ctx_g == null) { continue;//this is possible if during co-occurrence computing this term is skipped //because it did not satisfy minimum thresholds } int g_w = 0; for (ContextWindow ctx : ctx_g) g_w += ctx2TTF.get(ctx); double p_g = (double) g_w / ttfInCorpus; feature.add(refTerm, p_g); count++; } return count; } }