Question

J'essaie de mettre en œuvre une recherche interne sur mon site Web qui puisse orienter les utilisateurs dans la bonne direction au cas où le mot de frappe entrerait un mot, quelque chose comme le veux-tu dire : dans la recherche google.

Quelqu'un at-il une idée de la manière dont une telle recherche peut être effectuée? Comment pouvons-nous établir la pertinence du mot ou de la phrase que nous supposons que l'utilisateur a l'intention de rechercher?

  • J'utilise asp.net et SQL Server 2005 avec FTS (fullTextSearch)

Merci

Était-ce utile?

La solution

Vous pouvez utiliser un algorithme pour déterminer la similarité des chaînes, puis suggérer une autre chaîne à partir de votre index de recherche, jusqu'à une certaine différence.

L'un de ces algorithmes est la distance de Levenshtein .

Cependant, n'oubliez pas de rechercher des solutions existantes. Je pense par exemple Lucene permet de rechercher des chaînes similaires.

Btw, voici un article sur ce sujet: Comment Google? Vouliez-vous dire? L'algorithme fonctionne-t-il?

Autres conseils

Ceci consiste à interroger par expression régulière les mots-clés les plus proches correspondant à la phrase.

Voici un excellent article qui pourrait vous aider.

Avec T-SQL Vous pouvez utiliser le SOUNDEX fonction permettant de comparer les mots phonétiquement.

Si vous prenez les entrées des utilisateurs et que vous les comparez ensuite avec d'autres mots de votre base de données à l'aide du code soundex, vous devriez être capable de créer une liste de "voulez-vous dire"? mots.

ex.

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

produira tous les deux la même sortie (A536).

Il existe de meilleurs algorithmes de nos jours, mais soundex est intégré au serveur SQL.

L’approche la plus simple à laquelle je puisse penser est d’écrire une fonction qui renvoie le degré de discordance entre deux mots et vous permet de parcourir tous les mots et de trouver les meilleurs.

Je l'ai fait avec une méthode de branchement et de liaison. Laissez-moi déterrer le code:

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

pourquoi n'utilisez-vous pas google power?, vous pouvez utiliser leur service de suggestion

voici un exemple sur c #

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top