package ivory.sqe.retrieval;
public class TfDfWeight implements NodeWeight {
private float tf, df;
private int docLen;
private int numDocs;
private float avgDocLen;
public TfDfWeight() {
tf = 0;
df = 0;
}
public TfDfWeight(float tf, float df, int docLen, int numDocs, float avgDocLen) {
this.tf = tf;
this.df = df;
this.numDocs = numDocs;
this.docLen = docLen;
this.avgDocLen = avgDocLen;
}
public float getScore() {
float b = 0.3f;
float k1 = 0.5f;
float idf = (float) Math.log((numDocs - df + 0.5f) / (df+ 0.5f));
float bm25 = ((k1 + 1.0f) * tf) / (k1 * ((1.0f - b) + b * docLen / avgDocLen) + tf) * idf;
return bm25;
}
public void add(NodeWeight o) {
if (o instanceof TfDfWeight) {
TfDfWeight other = (TfDfWeight) o;
tf += other.tf;
df += other.df;
}
}
public TfDfWeight multiply(float weight) {
return new TfDfWeight(tf * weight, df * weight, docLen, numDocs, avgDocLen);
}
public String toString() {
return "tfdf(" + tf + "," + df + "," + numDocs + "," + docLen + "," + avgDocLen + ")" ;
}
}