Search in sources :

Example 1 with structures._Query

use of structures._Query in project IR_Base by Linda-sunshine.

the class LambdaRank method gradientUpdate.

// for lambdaRank
protected int gradientUpdate(_Query query) {
    double diff;
    int i, trainSize = 0;
    // Step 1: calculate the ranking score
    for (_QUPair pair : query.m_docList) pair.score(m_weight);
    m_eval.eval(query);
    // Step 2: accumulate the lambdas for each URL
    for (_QUPair pair : query.m_docList) {
        diff = 0;
        if (pair.m_worseURLs != null) {
            for (_QUPair worseURL : pair.m_worseURLs) {
                // force to moving up
                diff += Utils.logistic(worseURL.m_score - pair.m_score) * m_eval.delta(pair, worseURL);
                trainSize++;
            }
        }
        if (pair.m_betterURLs != null) {
            for (_QUPair betterURL : pair.m_betterURLs) {
                // force to moving down
                diff -= Utils.logistic(pair.m_score - betterURL.m_score) * m_eval.delta(betterURL, pair);
                trainSize++;
            }
        }
        // Step 3: update weight according to this URL
        if (diff != 0) {
            for (i = 0; i < pair.m_rankFv.length; i++) m_g[i] -= diff * pair.m_rankFv[i];
        }
    }
    return trainSize;
}
Also used : structures._QUPair(structures._QUPair)

Example 2 with structures._Query

use of structures._Query in project IR_Base by Linda-sunshine.

the class LambdaRankWorker method gradientUpdate.

protected int gradientUpdate(_Query query) {
    double diff;
    int i, trainSize = 0;
    // Step 1: calculate the ranking score
    for (_QUPair pair : query.m_docList) pair.score(m_weight);
    m_eval.eval(query);
    // Step 2: accumulate the lambdas for each URL
    for (_QUPair pair : query.m_docList) {
        diff = 0;
        if (pair.m_worseURLs != null) {
            for (_QUPair worseURL : pair.m_worseURLs) {
                // force to moving up
                diff += Utils.logistic(worseURL.m_score - pair.m_score) * m_eval.delta(pair, worseURL);
                trainSize++;
            }
        }
        if (pair.m_betterURLs != null) {
            for (_QUPair betterURL : pair.m_betterURLs) {
                // force to moving down
                diff -= Utils.logistic(pair.m_score - betterURL.m_score) * m_eval.delta(betterURL, pair);
                trainSize++;
            }
        }
        // Step 3: update weight according to this URL
        if (diff != 0) {
            for (i = 0; i < pair.m_rankFv.length; i++) m_g[i] -= diff * pair.m_rankFv[i];
        }
    }
    return trainSize;
}
Also used : structures._QUPair(structures._QUPair)

Example 3 with structures._Query

use of structures._Query in project IR_Base by Linda-sunshine.

the class MAP_Evaluator method setQuery.

@Override
public void setQuery(_Query query) {
    super.setQuery(query);
    m_P = 0;
    for (_QUPair d : m_query.m_docList) if (d.m_y > 0)
        m_P++;
    if (m_P > 0)
        updateDeltas();
}
Also used : structures._QUPair(structures._QUPair)

Example 4 with structures._Query

use of structures._Query in project IR_Base by Linda-sunshine.

the class NDCG_Evaluator method setQuery.

@Override
public void setQuery(_Query query) {
    // every time we want to evaluate new queries
    super.setQuery(query);
    ArrayList<Integer> labels = new ArrayList<Integer>(m_size);
    for (_QUPair qu : m_query.m_docList) labels.add(qu.m_y);
    Collections.sort(labels, Collections.reverseOrder());
    // calculate iDCG
    m_iDCG = 0;
    for (int i = 0; i < Math.min(labels.size(), m_k); i++) m_iDCG += m_gain[labels.get(i)] * m_discount[i];
    updateDeltas();
}
Also used : structures._QUPair(structures._QUPair) ArrayList(java.util.ArrayList)

Example 5 with structures._Query

use of structures._Query in project IR_Base by Linda-sunshine.

the class L2RMetricLearning method createTrainingCorpus.

// In this training process, we want to get the weight of all pairs of samples.
protected int createTrainingCorpus() {
    // pre-compute the similarity between labeled documents
    calcLabeledSimilarities();
    MyPriorityQueue<_RankItem> simRanker = new MyPriorityQueue<_RankItem>(m_topK);
    ArrayList<_Doc> neighbors = new ArrayList<_Doc>();
    _Query q;
    _Doc di, dj;
    int posQ = 0, negQ = 0, pairSize = 0;
    int relevant = 0, irrelevant = 0;
    for (int i = 0; i < m_trainSet.size(); i++) {
        // candidate query document
        di = m_trainSet.get(i);
        relevant = 0;
        irrelevant = 0;
        // using content similarity to construct initial ranking
        for (int j = 0; j < m_trainSet.size(); j++) {
            if (i == j)
                continue;
            dj = m_trainSet.get(j);
            simRanker.add(new _RankItem(j, m_LabeledCache[getIndex(i, j)]));
        }
        // find the top K similar documents by default similarity measure
        for (_RankItem it : simRanker) {
            dj = m_trainSet.get(it.m_index);
            neighbors.add(dj);
            if (di.getYLabel() == dj.getYLabel())
                relevant++;
            else
                irrelevant++;
        }
        // inject some random neighbors
        int j = 0;
        while (neighbors.size() < (1.0 + m_noiseRatio) * m_topK) {
            if (i != j) {
                dj = m_trainSet.get(j);
                if (Math.random() < 0.02 && !neighbors.contains(dj)) {
                    neighbors.add(dj);
                    if (di.getYLabel() == dj.getYLabel())
                        relevant++;
                    else
                        irrelevant++;
                }
            }
            // until we use up all the random budget
            j = (j + 1) % m_trainSet.size();
        }
        if (relevant == 0 || irrelevant == 0 || (di.getYLabel() == 1 && negQ < 1.1 * posQ)) {
            // clear the cache for next query
            simRanker.clear();
            neighbors.clear();
            continue;
        } else if (di.getYLabel() == 1)
            posQ++;
        else
            negQ++;
        // accept the query
        q = new _Query();
        m_queries.add(q);
        // construct features for the most similar documents with respect to the query di
        for (_Doc d : neighbors) q.addQUPair(new _QUPair(d.getYLabel() == di.getYLabel() ? 1 : 0, genRankingFV(di, d)));
        pairSize += q.createRankingPairs();
        // clear the cache for next query
        simRanker.clear();
        neighbors.clear();
    }
    // normalize the features by z-score
    normalize();
    System.out.format("Generate %d(%d:%d) ranking pairs for L2R model training...\n", pairSize, posQ, negQ);
    return pairSize;
}
Also used : structures._Query(structures._Query) structures._QUPair(structures._QUPair) structures._RankItem(structures._RankItem) MyPriorityQueue(structures.MyPriorityQueue) structures._Doc(structures._Doc) ArrayList(java.util.ArrayList)

Aggregations

structures._QUPair (structures._QUPair)9 structures._Query (structures._Query)7 ArrayList (java.util.ArrayList)3 Feature (Classifier.supervised.liblinear.Feature)1 Model (Classifier.supervised.liblinear.Model)1 LambdaRank (Ranker.LambdaRank)1 LambdaRankParallel (Ranker.LambdaRankParallel)1 RankNet (Ranker.RankNet)1 Evaluator (Ranker.evaluator.Evaluator)1 MAP_Evaluator (Ranker.evaluator.MAP_Evaluator)1 NDCG_Evaluator (Ranker.evaluator.NDCG_Evaluator)1 Random (java.util.Random)1 MyPriorityQueue (structures.MyPriorityQueue)1 structures._Doc (structures._Doc)1 structures._RankItem (structures._RankItem)1