package edu.uncc.cs.watsonsim.researchers;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import edu.uncc.cs.watsonsim.Answer;
import edu.uncc.cs.watsonsim.Passage;
import edu.uncc.cs.watsonsim.Question;
public class MergeByCommonSupport extends Researcher {
@Override
/** Call merge on any two answers, where the answers have more passages in common than different*/
public List<Answer> question(Question q, List<Answer> answers) {
List<List<Answer>> answer_blocks = new ArrayList<>();
each_answer:
for (Answer original : answers) {
HashSet<Passage> o_passages = new HashSet<>();
o_passages.addAll(original.passages);
for (List<Answer> block : answer_blocks) {
for (Answer example : block) {
HashSet<Passage> e_passages = new HashSet<>();
e_passages.addAll(example.passages);
int example_cardinality = e_passages.size();
e_passages.retainAll(o_passages);
double percent_common = e_passages.size() /
(example_cardinality + o_passages.size() - e_passages.size() + 0.01);
if ( percent_common > 0.5 ) {
// If the intersection > half the union, then merge the questions
block.add(original);
continue each_answer;
}
}
}
// Make a new topic for this answer
List<Answer> new_block = new ArrayList<>();
new_block.add(original);
answer_blocks.add(new_block);
}
// Merge the blocks
List<Answer> new_answers = new ArrayList<>();
for (List<Answer> block : answer_blocks) {
if (block.size() > 1) {
new_answers.add(Answer.merge(block));
} else {
new_answers.add(block.get(0));
}
}
log.info("Merged " + answers.size() + " candidates into " + new_answers.size() + " (by common passages).");
return new_answers;
}
}