Pergunta

Eu estou tentando implementar uma pesquisa interna para o meu site que pode apontar os usuários na direção certa no caso do mistype uma palavra, algo parecido com o que você quis dizer : em busca google

Alguém tem uma idéia de como tal busca um pode ser feito? Como podemos estabelecer a relevância da palavra ou a frase assumimos o utilizador pretende procurar?

  • i usar asp.net e sql server 2005 com STF (texto integral)

Obrigado

Foi útil?

Solução

Você pode usar um algoritmo para determinar similaridade corda e, então, sugerir outra seqüência de sua pesquisa de índice até uma certa diferença.

Um desses algoritmos é a Levenshtein distância .

No entanto, não se esqueça buscando soluções existentes. Eu acho que por exemplo Lucene tem a capacidade de procurar cadeias semelhantes.

Aliás, aqui está um post relacionado sobre este tema: Como é que o Google “você quis dizer?” Algoritmo de trabalho?

Outras dicas

Isto é feito através de consulta expressão regular as palavras-chave mais próximos que correspondem a frase.

Aqui é um ótimo artigo que pode ajudá-lo.

Com T-SQL Você pode usar a função SOUNDEX para comparar as palavras foneticamente.

Se você pegar a entrada de usuários e, em seguida, compará-lo com outras palavras em seu banco de dados por código soundex, você deve ser capaz de chegar a uma lista de 'você quer dizer? palavras.

por exemplo.

select SOUNDEX('andrew')
select SOUNDEX('androo')

será tanto produzir a mesma saída (A536).

Existem melhores algoritmos estes dias, mas soundex é construído em sql server.

A abordagem mais simples que posso pensar é escrever uma função que retorna o grau de incompatibilidade entre duas palavras, e você percorra todas as palavras e encontrar as melhores.

Eu fiz isso com um método vinculado branch-and-. Deixe-me desenterrar o código:

bool matchWithinBound(char* a, char* b, int bound){
  // skip over matching characters
  while(*a && *b && *a == *b){a++; b++;}
  if (*a==0 && *b==0) return true;
  // if bound too low, quit
  if (bound <= 0) return false;
  // try assuming a has an extra character
  if (*a && matchWithinBound(a+1, b, bound-1)) return true;
  // try assuming a had a letter deleted
  if (*b && matchWithinBound(a, b+1, bound-1)) return true;
  // try assuming a had a letter replaced
  if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
  // try assuming a had two adjacent letters swapped
  if (a[0] && a[1]){
    char temp;
    int success;
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    success = matchWithinBounds(a, b, bound-1);
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    if (success) return true;
  }
  // can try other modifications
  return false;
}

int DistanceBetweenWords(char* a, char* b){
  int bound = 0;
  for (bound = 0; bound < 10; bound++){
    if (matchWithinBounds(a, b, bound)) return bound;
  }
  return 1000;
}

Por que você não usa o Google poder ?, você pode consumir a sua sugerem serviço

aqui é um exemplo em c #

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top