2009-05-27 3 views
2

В нашей поисковой системе для вычисления релевантности используется следующая функция.Могу ли я сделать эту функцию релевантности поиска лучше, не «делая передовые вещи»?

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; 
} 

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

Спасибо.

+0

http://stackoverflow.com/questions/47762/how-to-ranking-search-results – warren

ответ

9

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

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

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

5

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

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

+0

+1. VSM дает намного лучшие результаты для специальных решений. –

+2

Ничего себе, это заставило мою голову вращаться. Мне жаль, что я не был более математически настроен :) – Ace

+1

На самом деле, это выглядит довольно круто. Я сделаю это принятым ответом, если кто-нибудь сможет объяснить это математике, как я. =) – Ace

2

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

0

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

2

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

+0

AKA модель векторного пространства. – erickson

1

Вы могли:

  • отбраковки из шумовых слов (, а, в, и т.д ...)
  • Изменения веса для поиска текста релевантности - если искомое слово встречается в названии копии документа и его тело, название, вероятно, более актуально.
  • В зависимости от вашего результатаВведите текст, добавьте вес для слов раньше или позже в тексте.
  • Сделать уникальные поисковые совпадения стоит больше (вам нужно будет определить, что делает слово уникальным).

 Смежные вопросы

  • Нет связанных вопросов^_^