Оптимизация простого алгоритма поиска - PullRequest
8 голосов
/ 14 мая 2009

Я немного поигрался с довольно простой, самодельной поисковой системой, и сейчас я вертлюсь с некоторым кодом сортировки по релевантности.

Это не очень красиво, но я не очень хорош, когда дело доходит до умных алгоритмов, поэтому я надеялся, что смогу получить какой-нибудь совет:)

По сути, я хочу, чтобы каждый результат поиска получал оценку в зависимости от того, сколько слов соответствует критериям поиска. 3 балла за точное слово и 1 балл за частичное совпадение

Например, если я ищу "зимний снег", это будет результат:

  • зима снег => 6 баллов
  • зима снег ing => 4 балла
  • зима земля снег => 4 балла
  • зима солнце => 3 балла
  • зима земля снег ing => 2 балла

Вот код:

String[] resultWords = result.split(" ");
String[] searchWords = searchStr.split(" ");
int score = 0;
for (String resultWord : resultWords) {
    for (String searchWord : searchWords) {
        if (resultWord.equalsIgnoreCase(searchWord))
            score += 3;
        else if (resultWord.toLowerCase().contains(searchWord.toLowerCase()))
            score++;
    }
}

Ответы [ 5 ]

3 голосов
/ 14 мая 2009

Ваш код мне подходит. Я предлагаю небольшие изменения:

Поскольку вы проходите все возможные комбинации, вы можете получить toLowerCase() спины в начале.

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

    result = result.toLowerCase();
    searchStr = searchStr.toLowerCase();

    String[] resultWords = result.split(" ");
    String[] searchWords = searchStr.split(" ");
    int score = 0;
    for (String resultWord : resultWords) {
        boolean exactMatch = false;
        for (String searchWord : searchWords) {
            if (!exactMatch && resultWord.equals(searchWord)) {
                exactMatch = true;
                score += 3;
            } else if (resultWord.contains(searchWord))
                score++;
        }
    }

Конечно, это очень базовый уровень. Если вы действительно заинтересованы в этой области компьютерных наук и хотите узнать больше о внедрении поисковых систем, начните с следующих терминов:

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

Например, рассмотрим модель наивного счета:

interface ScoreModel {
     int startingScore();
     int partialMatch();
     int exactMatch();
}

...

int search(String result, String searchStr, ScoreModel model) {
    String[] resultWords = result.split(" ");
    String[] searchWords = searchStr.split(" ");
    int score = model.startingScore();

    for (String resultWord : resultWords) {
        for (String searchWord : searchWords) {
            if (resultWord.equalsIgnoreCase(searchWord)) {
                score += model.exactMatch();
            } else if (resultWord.toLowerCase().contains(searchWord.toLowerCase())) {
                score += model.partialMatch();
            }
        }
    }

    return score;
}
0 голосов
/ 14 мая 2009

Вы можете использовать регулярные выражения для поиска шаблонов и длин сопоставленных шаблонов (для последней классификации / оценки).

0 голосов
/ 14 мая 2009

1) Вы можете сначала отсортировать searchWords. Вы можете выйти из цикла, когда ваше слово результата будет в алфавитном порядке после текущего слова поиска.

2) Еще лучше отсортировать оба, а затем пройтись по обоим спискам одновременно, чтобы найти совпадения.

0 голосов
/ 14 мая 2009

Базовая оптимизация может быть выполнена путем предварительной обработки базы данных: не разбивайте записи на слова каждый раз.

Создайте список слов (предпочитайте хэш или двоичное дерево для ускорения поиска в списке) для каждой записи во время добавления ее в БД, удаляйте слишком короткие слова, строчные буквы и сохраняйте эти данные для дальнейшего использования.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...