1

所以首先我们得到一个包含所有标记的 termVectors 列表,然后我们创建一个map<token, frequency in the document>. 然后方法 createQueue 将通过删除、stopWords 和出现不够的单词来确定分数,计算 idf,然后是给定标记的 idf * doc_frequency等于它的token,那么我们保留25个最好的,但是之后它是如何工作的?它与整个指数相比如何?我阅读了http://cephas.net/blog/2008/03/30/how-morelikethis-works-in-lucene/但这并没有解释它,或者我错过了重点。

4

1 回答 1

1

TermQuery它从这些术语中的每一个中创建一个,并将它们全部放入一个简单BooleanQuery的 中,通过先前计算的 tfidf 分数(boostFactor * myScore / bestScore,其中 boostFactor 可以由用户设置)来提升每个术语。

这是源代码(5.0 版)

private Query createQuery(PriorityQueue<ScoreTerm> q) {
  BooleanQuery query = new BooleanQuery();
  ScoreTerm scoreTerm;
  float bestScore = -1;

  while ((scoreTerm = q.pop()) != null) {
    TermQuery tq = new TermQuery(new Term(scoreTerm.topField, scoreTerm.word));

    if (boost) {
      if (bestScore == -1) {
        bestScore = (scoreTerm.score);
      }
      float myScore = (scoreTerm.score);
      tq.setBoost(boostFactor * myScore / bestScore);
    }

    try {
      query.add(tq, BooleanClause.Occur.SHOULD);
    }
    catch (BooleanQuery.TooManyClauses ignore) {
      break;
    }
  }
  return query;
}
于 2015-06-26T17:41:49.633 回答