Я пытаюсь понять, как улучшить оценку результатов поиска по запросу. Мое приложение должно брать оценку из результатов 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,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,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;
}
}
Итак, я полагаю, у меня следующие вопросы:
Как лучше всего нормализовать «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;
}
}
Итак, я полагаю, у меня следующие вопросы:
Как лучше всего нормализовать «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;
}
}
Итак, я полагаю, у меня следующие вопросы:
Как лучше всего нормализовать счет, чтобы я мог понять, как много «звездочек»?
Есть ли другой способ оценки результаты?
Спасибо
Грант