Pregunta

Estoy tratando de implementar una búsqueda interna de mi sitio web que pueda orientar a los usuarios en la dirección correcta en caso de que escriban mal una palabra, algo como lo que quisiste decir : en la búsqueda de Google.

¿Alguien tiene una idea de cómo se puede hacer esa búsqueda? ¿Cómo podemos establecer la relevancia de la palabra o la frase que suponemos que el usuario pretendía buscar?

  • uso asp.net y sql server 2005 con FTS (fullTextSearch)

Gracias

¿Fue útil?

Solución

Podría usar un algoritmo para determinar la similitud de la cadena y luego sugerir otra cadena de su índice de búsqueda hasta una cierta diferencia.

Uno de estos algoritmos es la distancia de Levenshtein .

Sin embargo, no olvide buscar soluciones existentes. Creo que p. Lucene tiene la capacidad de buscar cadenas similares.

Por cierto, aquí hay una publicación relacionada sobre este tema: Cómo ¿Google & # 8220; quiso decir? & # 8221; ¿Algoritmo de trabajo?

Otros consejos

Esto se realiza consultando a través de expresiones regulares las palabras clave más cercanas que coinciden con la frase.

Aquí es un excelente artículo que podría ayudarlo.

Con T-SQL Puede usar el SOUNDEX función para comparar palabras fonéticamente.

Si toma el aporte de los usuarios y luego lo compara con otras palabras en su base de datos por código soundex, ¿debería poder llegar a una lista de '¿quiere decir?' palabras.

Por ejemplo

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

ambos producirán la misma salida (A536).

Hay mejores algoritmos en estos días, pero soundex está integrado en el servidor sql.

El enfoque más simple que se me ocurre es escribir una función que devuelva el grado de desajuste entre dos palabras, y recorrer todas las palabras y encontrar las mejores.

He hecho esto con un método de bifurcación. Déjame desenterrar el 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 qué no usas google power ?, puedes consumir su servicio de sugerencias

aquí es un ejemplo en c #

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top