lucene实现自定义评分与相关性

时间:2014-05-07 03:38:04

标签: java lucene

我正在尝试将潜在的dirichlet分配(LDA)注入评分搜索文档的相关性,并陷入困境。我刚刚开始使用Lucene。我正在使用“Lucene in Action”中的代码来开始。

计划是尝试默认tf-idf模型的权重和查询的主题向量与每个文档之间的余弦相似性的混合。例如0.5 * tfidf + 0.5 * cos(Q,D)

我尝试在索引编制期间使用每个得分索引之间的分隔符存储每个文档的主题向量:

doc.add(new Field("lda score", "0.200|0.111|0.4999",
                  Field.Store.NO,
                  Field.Index.NOT_ANALYZED_NO_NORMS));

然后在搜索期间:

//tfidf 
Query q = new QueryParser(Version.LUCENE_30,
                          "content",
                          new StandardAnalyzer(
                            Version.LUCENE_30))
             .parse("some text here");
FieldScoreQuery qf = new FieldScoreQuery("lda score",
                                         FieldScoreQuery.Type.BYTE);
CustomScoreQuery customQ = new CustomScoreQuery(q, qf) {
  public CustomScoreProvider getCustomScoreProvider(IndexReader r) {
    return new CustomScoreProvider(r) {
      public float customScore(int doc,
                               float tfidfScore,
                               float ldaScore) {
        return 0.5*tfidfScore + 0.5*ldaScore);
} };

显然,我需要帮助的是FieldScoreQuery部分。如何读取查询字符串,运行lda推理(与lucene分开的分析)和余弦相似度t为CustomScoreQuery生成要消耗的分数?

这是正确的方法,还是我需要进入Similarity课程?一些帮助我入门的代码示例将不胜感激。

1 个答案:

答案 0 :(得分:0)

据我所知,你不能将字符串用作FieldScoreQuery。如果您需要3个值,请使用3个字段,并使用FLOAT类型的3个不同的FieldScoreQuery。

我使用NumericFields

luc_doc.add(new NumericField(         FIELD_NAME,Field.Store.NO,true).setFloatValue(x));

然后在CustomScoreProvider实现中覆盖方法

public float customScore(int doc,float subQueryScore,float [] valSrcScores)

您将在valSrcScores数组中获得3个值。