83 votes

Algorithme pour l'autocomplétion ?

Je fais référence à l'algorithme qui est utilisé pour donner des suggestions de requête lorsqu'un utilisateur tape un terme de recherche dans Google.

Je suis principalement intéressé par la façon dont l'algorithme de Google est capable de montrer : 1. Les résultats les plus importants (les requêtes les plus probables plutôt que tout ce qui correspond) 2. Les sous-chaînes correspondantes 3. Correspondances floues

Je sais que vous pourriez utiliser Trie ou Trie généralisé pour trouver des correspondances, mais cela ne répondrait pas aux exigences ci-dessus...

Questions similaires posées précédemment aquí

1 votes

Ces choses, à l'échelle de Google, comptent parmi les plus grandes réalisations de l'industrie. Je vous suggère de commencer par quelque chose d'un peu plus restreint

0 votes

@Michael : Je ne demande pas un algorithme comme celui de google... mais quelque chose de mieux que trie... aussi pourriez-vous suggérer quelque chose de petit mais mieux que tries...

0 votes

J'ai supprimé la demande d'une solution du type de l'autocomplétion de Google parce que c'est tout simplement ridicule.

69voto

fearlesstost Points 326

Pour des algorithmes de correspondance de chaînes de caractères flous/partiels (heh) géniaux, consultez Damn Cool Algorithms :

Ils ne remplacent pas les essais, mais empêchent plutôt les recherches par force brute dans les essais, ce qui est tout de même une grande victoire. Ensuite, vous voulez probablement trouver un moyen de limiter la taille de la trie :

  • tenez une liste des mots les plus récents/les plus utilisés dans le monde ;
  • pour chaque utilisateur, conserver une trie des mots récents ou des N premiers mots pour cet utilisateur.

Enfin, vous voulez éviter les consultations lorsque c'est possible...

  • mise en cache des résultats de la recherche : si l'utilisateur clique sur les résultats de la recherche, vous pouvez les servir très rapidement, puis récupérer de manière asynchrone la recherche complète, partielle ou floue.
  • précalculer les résultats de la recherche : si l'utilisateur a tapé "appl", il est probable qu'il continue avec "apple", "apply".
  • Prélivrer les données : par exemple, une application web peut envoyer un ensemble de résultats plus petit au navigateur, suffisamment petit pour rendre viable la recherche par force brute en JS.

1 votes

Je ne sais pas pourquoi il n'y a pas eu de votes positifs. C'est une réponse vraiment, vraiment géniale.

0 votes

Sniff, les liens sont cassés ... si quelqu'un sait où trouver de la bonne documentation sur les Automates de Levenshtein et les Arbres de Burkhard-Keller ...

1 votes

@Benibur : je viens de cliquer sur les liens, les deux fonctionnent.

11voto

Ben DeMott Points 852

Je voudrais juste dire... Une bonne solution à ce problème va incorporer plus qu'un arbre de recherche ternaire. Des Ngrams et des Shingles (phrases) sont nécessaires. Les erreurs de frontières entre les mots doivent également être détectées. "hell o" devrait être "hello" ... et "whitesocks" devrait être "white socks" - ce sont des étapes de prétraitement. Si vous ne pré-traitez pas les données correctement, vous n'obtiendrez pas de résultats de recherche valables. Les arbres de recherche ternaires sont un élément utile pour déterminer ce qu'est un mot, et aussi pour mettre en œuvre la supposition de mots apparentés lorsqu'un mot tapé n'est pas un mot valide dans l'index.

L'algorithme de Google suggère et corrige les phrases. L'algorithme de Google a également une certaine notion du contexte... si le premier mot que vous recherchez est lié à la météo et que vous les combinez "weatherforcst" vs "monsoonfrcst" vs "deskfrcst" - je suppose que, dans les coulisses, les classements sont modifiés dans la suggestion en fonction du premier mot rencontré - la prévision et la météo sont des mots liés, donc la prévision obtient un rang élevé dans la suggestion "Did-You-Mean".

mots-partiels (ngrams), phrases-termes (shingles), mots-proximité (word-clustering-index), arbre de recherche ternaire (word lookup).

9voto

Miguel Fonseca Points 2947

L'algorithme exact de Google est inconnu, mais il est dit de travailler par analyse statistique des données des utilisateurs. Une approche qui ne convient pas à la plupart des cas. Plus souvent, la complétion automatique est mise en œuvre en utilisant l'une des méthodes suivantes :

  • Arbres . En indexant le texte à rechercher dans une structure arborescente (arbre préfixe, arbre suffixe, dawg, etc.) on peut exécuter des recherches très rapides au détriment du stockage en mémoire. La traversée de l'arbre peut être adaptée pour la correspondance approximative.
  • Partitionnement des motifs . En partitionnant le texte en tokens (ngrammes), il est possible d'exécuter des recherches d'occurrences de motifs en utilisant un simple schéma de hachage.
  • Filtrage . Trouvez un ensemble de correspondances potentielles, puis appliquez un algorithme séquentiel pour vérifier chaque candidat.

Jetez un coup d'œil à complètement une bibliothèque de complétion automatique en Java.

4voto

Dekel Points 179

Jetez un coup d'œil à L'algorithme de la barre Awesome de Firefox

Google suggest est utile, car il prend en compte les millions de requêtes populaires + vos requêtes antérieures liées.

Il n'a cependant pas un bon algorithme de complétion / interface utilisateur :

  1. Ne fait pas de sous-chaînes
  2. Cela semble être un algorithme relativement simple de préfixation des limites des mots.
    Par exemple : Essayez tomcat tut --> suggère correctement "tomcat tutorial". Essayez maintenant tomcat rial --> aucune suggestion )- :
  3. Ne supporte pas le "vous voulez dire ?" - comme dans les résultats de recherche de Google.

15 votes

À en juger par mes propres habitudes de recherche, Google a l'intelligence de ne pas utiliser la saisie semi-automatique pour les sous-chaînes. Il ne me viendrait pas à l'esprit de taper "rial" si je cherchais un tutoriel - alors ne me le montrez pas. D'un autre côté, la saisie semi-automatique de Google semble correspondre à des choses qui pourraient raisonnablement être des fautes de frappe ou d'orthographe. Cela ne me dérange pas.

4voto

Ólafur Waage Points 40104

Il existe des outils comme soundex y distance de levenshtein qui peut être utilisé pour trouver des correspondances floues qui se situent dans une certaine fourchette.

Soundex trouve les mots qui se ressemblent et la distance levenshtein trouve les mots qui se trouvent à une certaine distance d'édition d'un autre mot.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X