web-dev-qa-db-fra.com

Comment le Google "Vouliez-vous dire?" L'algorithme fonctionne?

J'ai développé un site Web interne pour un outil de gestion de portefeuille. Il y a beaucoup de données textuelles, de noms de sociétés, etc. J'ai été vraiment impressionné par la capacité de certains moteurs de recherche à répondre très rapidement aux requêtes avec "Voulez-vous dire: xxxx".

Je dois être capable de prendre intelligemment une requête d'utilisateur et de répondre non seulement avec des résultats de recherche bruts, mais également avec un "Voulez-vous dire?" réponse quand il y a une réponse alternative très probable, etc.

[Je développe dans ASP.NET (VB - ne m'en veux pas!)]

MISE À JOUR: OK, comment puis-je imiter cela sans les millions d’utilisateurs non rémunérés?

  • Générer des fautes de frappe pour chaque terme "connu" ou "correct" et effectuer des recherches?
  • Une autre méthode plus élégante?
420
Andrew Harry

Voici l'explication directement depuis la source (presque)

Recherche 101!

au min 22:03

La peine de regarder!

Fondamentalement, et selon Douglas Merrill, ancien CTO de Google, cela ressemble à ceci:

1) Vous écrivez un mot (mal orthographié) dans google

2) Vous ne trouvez pas ce que vous vouliez (ne cliquez sur aucun résultat)

3) Vous réalisez que vous avez mal orthographié le mot, vous devez donc le réécrire dans le champ de recherche.

4) Vous trouvez ce que vous voulez (vous cliquez dans les premiers liens)

Ce modèle multiplié des millions de fois, montre quels sont les correctifs les plus courants et les corrections les plus "courantes".

De cette façon, Google peut presque instantanément proposer une correction orthographique dans toutes les langues.

En outre, cela signifie que si tout au long de la nuit, tout le monde commence à épeler la nuit, Google suggérera ce mot à la place.

EDIT

@ThomasRutter: Douglas le décrit comme un "apprentissage statistique".

Ils savent qui corrige la requête, car ils savent quelle requête provient de quel utilisateur (en utilisant des cookies)

Si les utilisateurs effectuent une requête et que seulement 10% d'entre eux cliquent sur un résultat et que 90% reviennent en arrière et tapent une autre requête (avec le mot corrigé), cette fois 90% cliquent sur un résultat, ils savent qu'ils ont trouvé une correction.

Ils peuvent également savoir s'il s'agit de requêtes "liées" de deux personnes différentes, car ils disposent des informations de tous les liens affichés.

De plus, ils incluent maintenant le contexte dans la vérification orthographique, de sorte qu'ils peuvent même suggérer un mot différent en fonction du contexte.

Voir ceci démo de google wave (@ 44m 06s) qui montre comment le contexte est pris en compte pour corriger automatiquement l'orthographe.

Ici il est expliqué comment fonctionne le traitement du langage naturel.

Et enfin, voici une superbe démo de ce qui peut être fait en ajoutant automatique traduction automatique (@ 1h 12m 47s) au mix.

J'ai ajouté des ancres de minute et de seconde aux vidéos pour passer directement au contenu. Si elles ne fonctionnent pas, essayez de recharger la page ou de faire défiler à la main jusqu'à la marque.

358
OscarRyz

J'ai trouvé cet article il y a quelque temps: Comment écrire un correcteur orthographique , écrit par Peter Norvig = (Directeur de la recherche chez Google Inc.).

C'est une lecture intéressante sur le sujet "correction orthographique". Les exemples sont en Python mais c'est clair et simple à comprendre, et je pense que l'algorithme peut être facilement traduit en d'autres langues.

Ci-dessous une brève description de l'algorithme. L'algorithme comprend deux étapes, la préparation et la vérification des mots.

Étape 1: Préparation - Configuration de la base de données Word

Le mieux est que vous puissiez utiliser des mots de recherche réels et leur occurrence. Si vous n'avez pas cela, un grand ensemble de texte peut être utilisé à la place. Comptez l'occurrence (popularité) de chaque mot.

Étape 2. Vérification des mots - recherche de mots similaires à celui vérifié

Similaire signifie que la distance d'édition est faible (généralement 0-1 ou 0-2). La distance d'édition est le nombre minimal d'insertions/suppressions/modifications/permutations nécessaires pour transformer un mot en un autre.

Choisissez le mot le plus populaire de l'étape précédente et suggérez-le comme une correction (si autre que le mot lui-même).

102
Davide Gualano

Pour la théorie de "voulez-vous dire" algorithme, vous pouvez vous référer au Chapitre 3 de Introduction à la recherche d'informations. Il est disponible en ligne gratuitement. Section 3. (page 52) répond exactement à votre question. Et pour répondre spécifiquement à votre mise à jour, vous n'avez besoin que d'un dictionnaire de mots et de rien d'autre (y compris des millions d'utilisateurs).

55
Szere Dyeri

Hmm ... Je pensais que Google utilisait son vaste corpus de données (Internet) pour faire de la PNL (traitement du langage naturel).

Par exemple, ils ont tellement de données sur tout l’Internet qu’ils peuvent compter le nombre de fois qu’une séquence de trois mots se produit (appelée trigramme) Ainsi, s’ils voient une phrase du genre: "concert rose frugr", ils peuvent voir qu’il contient peu de hits, puis trouver le "concert rose *" le plus probable dans leur corpus.

Apparemment, ils ne font qu’une variante de ce que disait Davide Gualano, alors lisez ce lien. Bien entendu, Google utilise toutes les pages Web connues comme corpus, ce qui rend son algorithme particulièrement efficace.

10
Claudiu

Je suppose qu'ils utilisent une combinaison d'un algorithme distance de Levenshtein et de la masse de données qu'ils collectent concernant les recherches exécutées. Ils peuvent extraire un ensemble de recherches qui ont la distance de Levenshtein la plus courte de la chaîne de recherche entrée, puis choisir celle qui donne le plus grand nombre de résultats.

7
Jim Burger

Normalement, un correcteur orthographique de production utilise plusieurs méthodologies pour fournir une suggestion orthographique. Certains sont:

  • Déterminez un moyen de déterminer si une correction orthographique est requise. Ceux-ci peuvent inclure des résultats insuffisants, des résultats qui ne sont pas spécifiques ou suffisamment précis (selon certaines mesures), etc. Ensuite:

  • Utilisez un grand corps de texte ou un dictionnaire, où tous, ou la plupart, sont connus pour être orthographiés correctement. Ceux-ci se trouvent facilement en ligne, dans des endroits tels que LingPipe . Ensuite, pour déterminer la meilleure suggestion, vous recherchez un mot qui correspond le mieux à plusieurs mesures. Le plus intuitif est des personnages similaires. Les recherches et les expériences ont montré que les correspondances de séquences de deux ou trois caractères donnent de meilleurs résultats. (bigrammes et trigrammes). Pour améliorer encore les résultats, pesez un score plus élevé lors d'un match au début ou à la fin du mot. Pour des raisons de performances, indexez tous ces mots en tant que trigrammes ou bigrammes. Ainsi, lorsque vous effectuez une recherche, vous convertissez-le en n-gramme et en effectuant une recherche avec hashtable ou trie.

  • Utilisez des heuristiques liées à des erreurs potentielles au clavier en fonction de l'emplacement du personnage. Donc, "hwllo" devrait être "bonjour" car "w" est proche de "e".

  • Utilisez une clé phonétique (Soundex, Metaphone) pour indexer les mots et rechercher les corrections possibles. En pratique, cela donne normalement des résultats pires que ceux utilisant l'indexation n-grammes, comme décrit ci-dessus.

  • Dans chaque cas, vous devez sélectionner la meilleure correction dans une liste. Cela peut être une métrique de distance telle que levenshtein, la métrique de clavier, etc.

  • Pour une phrase de plusieurs mots, un seul mot peut être mal orthographié. Dans ce cas, vous pouvez utiliser les mots restants comme contexte pour déterminer la meilleure correspondance.

6
eulerfx

Utilisez distance de Levenshtein , puis créez un arbre métrique (ou arbre mince) pour indexer les mots. Ensuite, lancez une requête 1-plus proche voisin, et vous obtenez le résultat.

6
Nicolas Dorier

Apparemment, Google suggère des requêtes avec les meilleurs résultats, pas avec celles qui sont épelées correctement. Mais dans ce cas, un correcteur orthographique serait probablement plus pratique. Bien sûr, vous pouvez stocker une valeur pour chaque requête, en fonction d'une mesure de la qualité des résultats renvoyés.

Alors,

  1. Vous avez besoin d'un dictionnaire (anglais ou basé sur vos données)

  2. Générez un treillis Word et calculez les probabilités des transitions à l'aide de votre dictionnaire.

  3. Ajoutez un décodeur pour calculer la distance d'erreur minimale à l'aide de votre treillis. Bien sûr, vous devez prendre en compte les insertions et les suppressions lors du calcul des distances. Ce qui est amusant, c’est que le clavier QWERTY maximise la distance si vous appuyez sur les touches proches les unes des autres.

  4. Renvoie la Parole qui a la distance minimale.

  5. Ensuite, vous pouvez comparer cela à votre base de données de requêtes et vérifier s’il existe de meilleurs résultats pour les autres correspondances proches.

4
Geee

Voici le meilleure réponse que j'ai trouvée , Correcteur d'orthographe implémenté et décrit par le directeur de la recherche de Google, Peter Norvig.

Si vous voulez en savoir plus sur la théorie derrière cela, vous pouvez lire son chapitre de livre .

L'idée de cet algorithme est basée sur un apprentissage statistique.

4
Aziz Alto

Devinez ... ça pourrait

  1. rechercher des mots
  2. si on ne le trouve pas, utilisez un algorithme pour essayer de "deviner" le mot.

Peut-être quelque chose venant d'IA comme un réseau Hopfield ou un réseau de propagation arrière, ou quelque chose d'autre qui "identifie les empreintes digitales", restaure les données brisées ou corrige l'orthographe, comme Davide l'a déjà mentionné ...

3
badbadboy

en ce qui concerne votre question, comment imiter le comportement sans disposer de tonnes de données - pourquoi ne pas utiliser des tonnes de données collectées par Google? Téléchargez les résultats de Google sarch pour le mot mal orthographié et recherchez "Voulez-vous dire:" dans le code HTML.

Je suppose que cela s'appelle mashup de nos jours :-)

2
Tomas Petricek

J'ai vu quelque chose à ce sujet il y a quelques années. Cela a peut-être changé depuis, mais apparemment, ils ont commencé par analyser leurs journaux pour les mêmes utilisateurs soumettant des requêtes très similaires dans un court laps de temps, et ils ont utilisé l'apprentissage automatique basé sur la manière dont les utilisateurs avaient corrigé. se.

2
seanb

Facile. Ils ont tonnes de données. Ils ont des statistiques pour chaque terme possible, en fonction de la fréquence à laquelle il est interrogé et des variations de celui-ci. Les utilisateurs cliquent dessus. Ainsi, lorsqu'ils vous voient saisir une faute de frappe fréquente pour un terme de recherche, ils vont de l'avant et proposent la réponse plus habituelle.

En fait, si le mot mal orthographié est en réalité le terme recherché le plus fréquemment utilisé, l’algorithme le prendra pour le bon.

2
schonarth

C'est une vieille question, et je suis surpris que personne n'ait suggéré que l'OP utilise Apache Solr.

Apache Solr est un moteur de recherche en texte intégral qui, outre de nombreuses autres fonctionnalités, fournit également des suggestions de vérification orthographique ou d'interrogation. De la documentation :

Par défaut, les vérificateurs d’orthographe Lucene trient les suggestions d’abord en fonction du score obtenu par le calcul de la distance entre les cordes, puis en fonction de la fréquence (si disponible) de la suggestion dans l’index.

1
Josep Valls

Vous voulez dire correcteur orthographique? Si c'est un correcteur orthographique plutôt qu'une phrase entière, alors j'ai un lien sur la vérification orthographique où l'algorithme est développé en python. Vérifiez ce lien

En attendant, je travaille également sur un projet qui inclut la recherche de bases de données en utilisant du texte. Je suppose que cela résoudrait votre problème

1
Jimit Patel

Outre les réponses ci-dessus, si vous souhaitez implémenter rapidement quelque chose vous-même, voici une suggestion -

Algorithme

Vous pouvez trouver l'implémentation et la documentation détaillée de cet algorithme sur GitHub .

  • Créez une file d'attente prioritaire avec un comparateur.
  • Créez un arbre de recherche Ternay et insérez tous les mots anglais (de message de Norvig ) ainsi que leurs fréquences.
  • Commencez à parcourir le TST et pour chaque mot rencontré dans le TST, calculez sa distance de Levenshtein (LD) à partir de input_Word
  • Si LD ≤ 3, placez-le dans une file d'attente prioritaire.
  • Enfin, extrayez 10 mots de la file d’attente prioritaire et affichez-les.
1
amarjeetAnand

Il existe une structure de données spécifique - arbre de recherche ternaire - qui prend naturellement en charge les correspondances partielles et les correspondances quasi voisines.

0
Josef Svoboda