package edu.illinois.lis.feedback;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import cc.twittertools.thrift.gen.TResult;
import edu.illinois.lis.document.FeatureVector;
import edu.illinois.lis.utils.Stopper;
import edu.illinois.lis.utils.KeyValuePair;
public class FeedbackRelevanceModel extends FeedbackModel {
private boolean stripNumbers = false;
private double[] docWeights = null;
@Override
public void build(Stopper stopper) {
this.stopper = stopper;
try {
Set<String> vocab = new HashSet<String>();
List<FeatureVector> fbDocVectors = new LinkedList<FeatureVector>();
double[] rsvs = new double[relDocs.size()];
int k=0;
Iterator<TResult> hitIterator = relDocs.iterator();
while(hitIterator.hasNext()) {
TResult hit = hitIterator.next();
rsvs[k++] = hit.getRsv();
}
hitIterator = relDocs.iterator();
while(hitIterator.hasNext()) {
TResult hit = hitIterator.next();
String text = hit.getText().toLowerCase();
FeatureVector docVector = new FeatureVector(text, stopper);
vocab.addAll(docVector.getFeatures());
fbDocVectors.add(docVector);
}
features = new LinkedList<KeyValuePair>();
Iterator<String> it = vocab.iterator();
while(it.hasNext()) {
String term = it.next();
double fbWeight = 0.0;
Iterator<FeatureVector> docIT = fbDocVectors.iterator();
k=0;
while(docIT.hasNext()) {
double docWeight = 1.0;
if(docWeights != null)
docWeight = docWeights[k];
FeatureVector docVector = docIT.next();
double docProb = docVector.getFeaturetWeight(term) / docVector.getLength();
docProb *= rsvs[k++] * docWeight;
fbWeight += docProb;
}
fbWeight /= (double)fbDocVectors.size();
KeyValuePair tuple = new KeyValuePair(term, fbWeight);
features.add(tuple);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setDocWeights(double[] docWeights) {
this.docWeights = docWeights;
}
}