Algorithme pour la saisie semi-automatique?
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 surtout intéressé par:
1. La plupart des résultats importants (plus probable des requêtes plutôt que quelque chose qui correspond)
2. Correspondance des sous-chaînes
3. Correspondances floues
Je sais que vous pouvez utiliser Trie ou généralisée trie de trouver des correspondances, mais il ne serait pas répondre aux exigences ci-dessus...
Des questions similaires posées précédemment ici
- ces choses, à google échelle, sont parmi l'industrie des plus grandes réalisations. Je vous suggère de commencer avec quelque chose d'un peu plus étroit
- Je ne suis pas demandant comme algorithme de google... mais quelque chose de mieux que de trie.. aussi pourriez-vous suggérer quelque chose de petit, mais mieux que la tente..
- J'ai enlevé le demander pour une solution le long de la lignes de saisie semi-automatique de Google parce que c'est tout simplement ridicule.
Vous devez vous connecter pour publier un commentaire.
Pour (heh) génial floue ou partielle de la chaîne des algorithmes d'appariement, découvrez Sacrément Cool Algorithmes:
Ce n'est pas le remplacer tente, mais plutôt de prévenir force brute des recherches dans les essais - qui est encore une grande victoire. Ensuite, vous voudrez probablement un moyen de limiter la taille de la trie:
Enfin, si vous souhaitez empêcher les recherches dès que possible...
Je voudrais juste dire...
Une bonne solution à ce problème est d'aller à incorporer plus d'un Ternaire Arbre de Recherche.
Ngrams, et les Bardeaux (Expressions) sont nécessaires. Mot-limite les erreurs doivent également être détecté. "l'enfer o" doit être "bonjour" ... et "whitesocks" doit être "chaussettes blanches" - ce sont des pré-étapes de traitement. Si vous n'avez pas prétraiter les données correctement, vous n'allez pas obtenir de précieux résultats de la recherche.
Ternaire arbres de recherche sont un élément utile dans la compréhension de ce qu'est un mot, et également pour la mise en œuvre connexes-parole de deviner quand un mot saisi n'est pas valide d'un mot dans l'index.
L'algorithme de google effectue une expression de la suggestion et de la correction.
L'algorithme de google a aussi la notion de contexte... si le premier mot que vous recherchez est liée aux conditions météorologiques et que vous les combinez "weatherforcst" vs "monsoonfrcst" vs "deskfrcst" - je suppose que derrière les scènes les classements sont en train d'être changé dans la suggestion basée sur le premier mot rencontrés - les prévisions et les conditions météorologiques sont liées mots devrait donc obtenir un rang élevé dans le Saviez-Vous-Dire deviner.
mot-partiels (ngrams), de la phrase, les termes (zona), mot de proximité (mot-clustering-index), ternaire-recherche-arbre (mot de recherche).
Google algorithme exact est inconnu, mais il est dit de travail par l'analyse statistique des utilisateurs d'entrée. Une approche ne convient pas pour la plupart des cas. Plus communément, la saisie semi-automatique est mis en œuvre à l'aide de l'une des opérations suivantes:
Prendre un coup d'oeil à complètement, un Java de saisie semi-automatique de la bibliothèque qui implémente certaines de ces notions.
Il existe des outils comme soundex et levenshtein qui peuvent être utilisés pour trouver des correspondances floues qui sont dans une certaine plage.
Soundex trouve des mots que son semblable et de levenshtein trouve des mots qui sont à une certaine distance d'édition à partir d'un autre mot.
Prendre un coup d'oeil à Firefox barre d'algorithme
Google suggère, c'est utile, car il les millions de populaire requêtes + vos dernières requêtes associées en compte.
Il n'a pas une bonne exécution de l'algorithme /UI si:
Par exemple: Essayez de
tomcat tut
--> correctement suggèrent "tomcat tutoriel". Maintenant, essayeztomcat rial
--> pas de suggestions )-:Pour les sous-chaînes et flous, l'algorithme de Levenshtein a fonctionné assez bien pour moi. Même si je dois admettre, il ne semble pas être aussi parfait que l'industrie des implémentations de saisie semi-automatique/suggérer. Google et Microsoft Intellisense faire un meilleur travail, je pense, parce qu'ils ont affiné cette algorithme de base de peser le genre d'opérations d'édition il faut pour correspondre aux différentes chaînes. E. g. la transposition de deux personnages devraient probablement seulement compter comme 1, pas 2 (un insert & supprimer).
Mais même si je trouve que c'est assez proche. Ici, c'est que c'est la mise en œuvre en C#...
Si vous êtes à la recherche d'une conception globale du problème, essayez de lire le contenu à https://www.interviewbit.com/problems/search-typeahead/.
Ils commencent par la construction de la saisie semi-automatique par le biais d'une approche naïve de l'aide d'un trie et puis s'en inspirer. Ils expliquent également les techniques d'optimisation comme l'échantillonnage et les mises à jour hors ligne pour répondre à des cas d'utilisation spécifiques.
De garder la solution évolutive, vous devez éclat de votre trie les données de manière intelligente.
Je pense que l'on pourrait être mieux de construction spécialisés trie, plutôt que la poursuite de complètement différent de la structure de données.
J'ai pu voir que la fonctionnalité se manifeste dans un trie dans lequel chaque feuille était un domaine qui reflète la fréquence des recherches de son mot correspondant.
La requête de recherche de la méthode d'affichage, le descendant les nœuds feuilles avec la plus grande des valeurs calculées à partir de la multiplication de la distance de chaque descendant nœud feuille par la fréquence de recherche associés à chaque descendant nœud feuille.
La structure des données (et, par conséquent, l'algorithme) utilisations de Google sont probablement beaucoup plus compliqué, potentiellement en tenant un grand nombre d'autres facteurs, tels que la recherche des fréquences à partir de votre propre compte (et à l'heure de la journée... et de la météo... la saison... et phase lunaire... et... ).
Cependant, je crois que la base trie de la structure de données peut être étendu à tout type de recherche spécialisé préférence en incluant des champs supplémentaires à chacun des nœuds et à l'aide de ces champs dans la requête de recherche de la méthode.