как мне нормализовать оценку solr / lucene?

Я пытаюсь понять, как улучшить оценку результатов поиска по запросу. Мое приложение должно брать оценку из результатов solr и отображать количество «звездочек» в зависимости от того, насколько хороши результаты для запроса. 5 звезд = почти / точно до 0 звезд, что означает не очень хорошее соответствие поиску, например, только один элемент попадает. Однако я получаю оценки от 1,4 до 0,8660254, оба возвращают результаты, которым я бы дал 5 звезд. Что мне нужно сделать, так это как-то преобразовать эти результаты в проценты, чтобы я мог отметить эти результаты правильным количеством звездочек.

Выполняемый мной запрос, который дает мне оценку 1,4, следующий:

разрешено: истина И (оценка: «2: 1»)

Запрос, который дает мне оценку 0,8660254:

euallowed: истина И (оценка: «2: 1» ИЛИ оценка: «1-й»)

I Я уже обновил подобие, так что tf и idf возвращают 1.0, поскольку меня интересует только то, есть ли в документе термин, а не номер этого термина в документе. Вот как выглядит мой код подобия:

import org.apache.lucene.search.Similarity;

public class StudentSearchSimilarity extends Similarity {

    @Override
    public float lengthNorm(String fieldName, int numTerms) {
        return (float) (1.0 / Math.sqrt(numTerms));
    }

    @Override
    public float queryNorm(float sumOfSquaredWeights) {

        return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));

    }

    @Override
    public float sloppyFreq(int distance) {
        return 1.0f / (distance + 1);
    }

    @Override
    public float tf(float freq) {
        return (float) 1.0;
    }

    @Override
    public float idf(int docFreq, int numDocs) {

        //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
        return (float)1.0;

    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        return overlap / (float) maxOverlap;
    }
}

Итак, я полагаю, у меня следующие вопросы:

  1. Как лучше всего нормализовать Что мне нужно сделать, так это как-то преобразовать эти результаты в проценты, чтобы я мог отметить эти результаты правильным количеством звездочек.

    Выполняемый мной запрос, который дает мне оценку 1,4, следующий:

    разрешено: истина И (оценка: «2: 1»)

    Запрос, который дает мне оценку 0,8660254:

    euallowed: истина И (оценка: «2: 1» ИЛИ оценка: «1-й»)

    I Я уже обновил подобие, так что tf и idf возвращают 1.0, поскольку меня интересует только то, есть ли в документе термин, а не номер этого термина в документе. Вот как выглядит мой код подобия:

    import org.apache.lucene.search.Similarity;
    
    public class StudentSearchSimilarity extends Similarity {
    
        @Override
        public float lengthNorm(String fieldName, int numTerms) {
            return (float) (1.0 / Math.sqrt(numTerms));
        }
    
        @Override
        public float queryNorm(float sumOfSquaredWeights) {
    
            return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));
    
        }
    
        @Override
        public float sloppyFreq(int distance) {
            return 1.0f / (distance + 1);
        }
    
        @Override
        public float tf(float freq) {
            return (float) 1.0;
        }
    
        @Override
        public float idf(int docFreq, int numDocs) {
    
            //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
            return (float)1.0;
    
        }
    
        @Override
        public float coord(int overlap, int maxOverlap) {
            return overlap / (float) maxOverlap;
        }
    }
    

    Итак, я полагаю, у меня следующие вопросы:

    1. Как лучше всего нормализовать Что мне нужно сделать, так это как-то преобразовать эти результаты в проценты, чтобы я мог отметить эти результаты правильным количеством звездочек.

      Выполняемый мной запрос, который дает мне оценку 1,4, следующий:

      разрешено: истина И (оценка: «2: 1»)

      Запрос, который дает мне оценку 0,8660254:

      euallowed: истина И (оценка: «2: 1» ИЛИ оценка: «1-й»)

      I Я уже обновил подобие, так что tf и idf возвращают 1.0, поскольку меня интересует только то, есть ли в документе термин, а не номер этого термина в документе. Вот как выглядит мой код подобия:

      import org.apache.lucene.search.Similarity;
      
      public class StudentSearchSimilarity extends Similarity {
      
          @Override
          public float lengthNorm(String fieldName, int numTerms) {
              return (float) (1.0 / Math.sqrt(numTerms));
          }
      
          @Override
          public float queryNorm(float sumOfSquaredWeights) {
      
              return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));
      
          }
      
          @Override
          public float sloppyFreq(int distance) {
              return 1.0f / (distance + 1);
          }
      
          @Override
          public float tf(float freq) {
              return (float) 1.0;
          }
      
          @Override
          public float idf(int docFreq, int numDocs) {
      
              //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
              return (float)1.0;
      
          }
      
          @Override
          public float coord(int overlap, int maxOverlap) {
              return overlap / (float) maxOverlap;
          }
      }
      

      Итак, я полагаю, у меня следующие вопросы:

      1. Как лучше всего нормализовать «2: 1»)

        Запрос, который дает мне оценку 0,8660254:

        euallowed: true И (оценка: «2: 1» ИЛИ оценка: «1st»)

        Я уже обновил Сходство в том, что tf и idf возвращают 1.0, поскольку меня интересует только наличие в документе термина, а не номер этого термина в документе. Вот как выглядит мой код подобия:

        import org.apache.lucene.search.Similarity;
        
        public class StudentSearchSimilarity extends Similarity {
        
            @Override
            public float lengthNorm(String fieldName, int numTerms) {
                return (float) (1.0 / Math.sqrt(numTerms));
            }
        
            @Override
            public float queryNorm(float sumOfSquaredWeights) {
        
                return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));
        
            }
        
            @Override
            public float sloppyFreq(int distance) {
                return 1.0f / (distance + 1);
            }
        
            @Override
            public float tf(float freq) {
                return (float) 1.0;
            }
        
            @Override
            public float idf(int docFreq, int numDocs) {
        
                //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
                return (float)1.0;
        
            }
        
            @Override
            public float coord(int overlap, int maxOverlap) {
                return overlap / (float) maxOverlap;
            }
        }
        

        Итак, я полагаю, у меня следующие вопросы:

        1. Как лучше всего нормализовать «2: 1»)

          Запрос, который дает мне оценку 0,8660254:

          euallowed: true И (оценка: «2: 1» ИЛИ оценка: «1st»)

          Я уже обновил Сходство в том, что tf и idf возвращают 1.0, поскольку меня интересует только наличие в документе термина, а не номер этого термина в документе. Вот как выглядит мой код подобия:

          import org.apache.lucene.search.Similarity;
          
          public class StudentSearchSimilarity extends Similarity {
          
              @Override
              public float lengthNorm(String fieldName, int numTerms) {
                  return (float) (1.0 / Math.sqrt(numTerms));
              }
          
              @Override
              public float queryNorm(float sumOfSquaredWeights) {
          
                  return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));
          
              }
          
              @Override
              public float sloppyFreq(int distance) {
                  return 1.0f / (distance + 1);
              }
          
              @Override
              public float tf(float freq) {
                  return (float) 1.0;
              }
          
              @Override
              public float idf(int docFreq, int numDocs) {
          
                  //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
                  return (float)1.0;
          
              }
          
              @Override
              public float coord(int overlap, int maxOverlap) {
                  return overlap / (float) maxOverlap;
              }
          }
          

          Итак, я полагаю, у меня следующие вопросы:

          1. Как лучше всего нормализовать счет, чтобы я мог понять, как много «звездочек»?

          2. Есть ли другой способ оценки результаты?

          Спасибо

          Грант

15
задан Fred Foo 21 October 2010 в 09:56
поделиться