Domanda

Sto cercando di implementare una ricerca interna per il mio sito Web in grado di indirizzare gli utenti nella giusta direzione nel caso in cui una parola venga digitata male, qualcosa del genere intendevi : nella ricerca di Google.

Qualcuno ha idea di come si possa fare una simile ricerca? Come possiamo stabilire la pertinenza della parola o della frase che assumiamo che l'utente intenda cercare?

  • utilizzo asp.net e sql server 2005 con FTS (fullTextSearch)

Grazie

È stato utile?

Soluzione

È possibile utilizzare un algoritmo per determinare la somiglianza delle stringhe e quindi suggerire altre stringhe dall'indice di ricerca fino a una certa differenza.

Uno di questi algoritmi è la Levenshtein distance .

Tuttavia, non dimenticare di cercare soluzioni esistenti. Penso ad es. Lucene ha la capacità di cercare stringhe simili.

A proposito, ecco un post correlato su questo argomento: How significa Google & # 8220; Intendi? & # 8221; L'algoritmo funziona?

Altri suggerimenti

Questo viene fatto interrogando attraverso l'espressione regolare le parole chiave più vicine che corrispondono alla frase.

Qui è un ottimo articolo che potrebbe aiutarti.

Con T-SQL È possibile utilizzare SOUNDEX funzione per confrontare le parole foneticamente.

Se prendi l'input degli utenti e poi lo confronti con altre parole nel tuo database con il codice soundex, dovresti essere in grado di trovare un elenco di 'vuoi dire'? parole.

per es.

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

produrrà entrambi lo stesso output (A536).

Al giorno d'oggi ci sono algoritmi migliori, ma soundex è integrato nel server sql.

L'approccio più semplice a cui riesco a pensare è quello di scrivere una funzione che restituisca il grado di discrepanza tra due parole, e tu fai scorrere tutte le parole e trovi le migliori.

L'ho fatto con un metodo branch-and-bound. Vorrei scavare il codice:

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

perché non usi google power? puoi utilizzare il loro servizio di suggerimento

qui è un esempio su c #

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top