Могу ли я улучшить эту функцию релевантности поиска, не занимаясь продвинутыми вещами? - PullRequest
2 голосов
/ 27 мая 2009

Моя поисковая система использует следующую функцию для расчета релевантности.

private static int calculateScore(String result, String searchStr, int modifier) 
{
    String[] resultWords = result.split(" ");
    String[] searchWords = searchStr.split(" ");

    int score = 0;
    for (String searchWord : searchWords) 
    {
        for (String resultWord : resultWords) 
        {
            if (resultWord.equals(searchWord))
                score += 10;
            else if (resultWord.startsWith(searchWord))
                score += 4;
            else if (resultWord.endsWith(searchWord))
                score += 3;
            else if (resultWord.contains(searchWord))
                score += 1;
        }

    }
    return score;
}

Ничего особенного, и мне тоже не дали достаточно времени, чтобы сделать что-нибудь причудливое, но есть ли какие-то простые улучшения, которые я могу сделать, чтобы сделать функцию лучше, увеличивая соответствующие вещи и подавляя ненужные вещи? Не нужно замечать оптимизацию скорости, это всего лишь «функциональная часть» функции:)

Спасибо.

Ответы [ 7 ]

9 голосов
/ 27 мая 2009

Не уверен, что это считается необычным, но сравнение soundex , предположительно заработавшее +1 балл по вашей шкале, даст небольшое отношение к типографским промахам и гомофонам.

Я бы предложил использовать список стоп-слов , чтобы либо предотвратить, либо радикально уменьшить релевантность, присущую распространенным словам. Если кто-то ищет слово «лошадь на крыше», вы хотите придать релевантность «лошади» и «крыше», а не подчеркивать все, что содержит «the».

Еще одним простым стимулом является предоставление целого ряда релевантности для результата, который содержит всю строку поиска в порядке (без учета регистра и пунктуации).

5 голосов
/ 27 мая 2009

Классическая модель векторного пространства на самом деле является стандартным хорошим и довольно простым (в реализации) решением.

http://www.miislita.com/term-vector/term-vector-3.html

2 голосов
/ 27 мая 2009

Если вы хотите сделать свой алгоритм поиска немного более сложным, посмотрите на косинус сходства . Это довольно легко реализовать и работает довольно хорошо на практике.

2 голосов
/ 27 мая 2009

Вы можете добавить +1 к счету, если Расстояние Левенштейна ниже некоторого порога.

2 голосов
/ 27 мая 2009

Вам также, вероятно, следует нормализовать регистр, прежде чем делать равные.

1 голос
/ 27 мая 2009

Вы могли бы:

  • Выделите шумовые слова (a, at, etc ...)
  • Изменение веса для релевантности текста для поиска - если искомое слово встречается в заголовке документа и его теле, заголовок, вероятно, будет более релевантным.
  • В зависимости от вашего результатаWordWord, попробуйте добавить вес для слов раньше или позже в тексте.
  • Создайте уникальные слова для поиска, которые стоят больше (вам нужно определить, что делает слово уникальным).
0 голосов
/ 27 мая 2009

Очевидно, но вы бы хотели все в нижнем регистре.

...