Comment Google "Vouliez-vous dire?" Travail d'algorithme?

436

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 d'entreprises, etc. J'ai été vraiment impressionné par la capacité de certains moteurs de recherche à répondre très rapidement aux questions avec "Vouliez-vous dire: xxxx".

Je dois être en mesure de répondre intelligemment à une requête utilisateur et d'y répondre non seulement avec des résultats de recherche bruts, mais aussi avec un "Vouliez-vous dire?" réponse lorsqu'il existe une réponse alternative très probable, etc.

[Je développe en ASP.NET (VB - ne m'en voulez 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?
Andrew Harry
la source
1
Voici la version VB.NET du correcteur orthographique Norvig. Vous pouvez trouver cela utile s'il n'est pas trop tard!
Ralph Wiggum
7
doublon possible de Comment implémentez-vous un "Vouliez-vous dire"?
Kurt McKee
Je tape sur un clavier non qwerty (Colemak) et la fonctionnalité n'est pas à moitié aussi intelligente. Il apprend sûrement des paires de correction d'erreur enregistrées et est donc réglé sur qwerty. Les correcteurs orthographiques ordinaires fonctionnent bien pour mon clavier, comme prévu - la distance de modification des chaînes est invariante par rapport à la disposition.
Colonel Panic

Réponses:

366

Voici l'explication directement de la source (presque)

Recherche 101!

au min 22:03

La peine de regarder!

Fondamentalement et selon Douglas Merrill, ancien CTO de Google, c'est comme 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 et vous le réécrivez dans la zone de recherche.

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

Ce modèle s'est multiplié des millions de fois, montre quelles sont les fautes d'orthographe les plus courantes et quelles sont les corrections les plus "courantes".

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

Cela signifie également que si du jour au lendemain, tout le monde commence à épeler la nuit car "nigth" google suggérera ce mot à la place.

ÉDITER

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

Ils savent qui corrige la requête, car ils savent quelle requête provient de quel utilisateur (à l'aide de cookies)

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

Ils peuvent également savoir s'il s'agit de requêtes "liées" de deux différents, car ils ont des informations sur tous les liens qu'ils affichent.

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

Voir cette 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 ce traitement du langage naturel.

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

J'ai ajouté des ancres de minutes et de secondes 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.

OscarRyz
la source
Comment fonctionne l'algorithme? Comment Google passe-t-il de "Nous recevons des milliards de recherches avec différents termes, et ce sont ces recherches" à "ce terme doit donc être une faute d'orthographe courante de ce terme"? Ils ont résolu ce problème, mais je suis curieux de savoir comment. Comment déterminent-ils que deux recherches proviennent du même utilisateur, et quel mot est une «correction» d'un autre, et comment les agréger sur des milliards de recherches?
thomasrutter
51
Si tout le monde commençait à mal orthographier "nuit" ... je crois qu'ils ont déjà rencontré ça avec des gens qui recherchaient "Flickr".
Max Lybbert
42
le problème avec tout le monde a mal orthographié quelque chose s'est déjà produit dans un sens beaucoup plus grave: essayez de taper "fuscia" dans Google. Google dit "Vouliez-vous dire fuschia?" L'orthographe correcte, en fait, est "fuchsia", mais personne ne peut l'orthographier correctement pour une raison quelconque. Le problème est encore pire sur Dictionary.com; si vous tapez "fuschia" dans leur recherche, cela vous donnera "Aucun résultat pour fuschia. Vouliez-vous dire 'fuschia'?" (c.-à-d., vouliez-vous dire ce que vous venez de taper?)
Daisy Sophia Hollman
8
Je ne crois pas qu'ils n'utilisent que des données d'orthographe - il y a certainement une certaine distance Levenshtein ou similaire en cours - recherchez `` Plack '' (et un ou plusieurs autres mots) et il est toujours corrigé en `` noir '', ce qui est une orthographe très peu probable / typo
plusplus
4
@Jakub Je pense qu'ils ont résolu le problème depuis que j'ai fait ce commentaire il y a 4+ ans. En effet, Google a également résolu le problème. Une recherche de fuschia inclut automatiquement des résultats pour fuchsia.
Daisy Sophia Hollman
104

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 dans d'autres langues.

Ci-dessous suit 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 de mots

Le mieux est si vous pouvez utiliser des mots de recherche réels et leur occurrence. Si vous n'en avez pas, 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 minimum d'insertions / suppressions / modifications / échanges nécessaires pour transformer un mot en un autre.

Choisissez le mot le plus populaire de l'étape précédente et proposez-le comme correction (s'il est différent du mot lui-même).

Davide Gualano
la source
6
@Davide: "" "les exemples sont en python mais c'est clair et simple à comprendre" "": je ne comprends pas votre utilisation de "mais" ... je dirais étant donné le style d'écriture de Python + Norvig, "clair et simple à comprendre "est le résultat escompté.
John Machin
20
Le "mais" était là parce que Harry a dit dans sa question qu'il était un développeur VB.NET, donc j'ai supposé qu'il n'était pas confiant avec le langage python.
Davide Gualano
56

Pour la théorie de l'algorithme "vouliez-vous dire", vous pouvez vous référer au chapitre 3 de l'introduction à la recherche d'informations. Il est disponible en ligne gratuitement. La section 3.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 rien d'autre (y compris des millions d'utilisateurs).

Szere Dyeri
la source
10

Hmm ... Je pensais que Google utilisait son vaste corpus de données (Internet) pour faire du NLP (Natural Language Processing) sérieux.

Par exemple, ils ont tellement de données de l'ensemble d'Internet qu'ils peuvent compter le nombre de fois qu'une séquence de trois mots se produit (connue sous le nom de trigramme ). Donc, s'ils voient une phrase comme: "concert rose frugr", ils pourraient voir qu'elle a peu de succès, puis trouver le "concert rose *" le plus probable dans leur corpus.

Apparemment, ils font juste une variation de ce que Davide Gualano disait, alors lisez certainement ce lien. Bien sûr, Google utilise toutes les pages Web qu'il connaît comme un corpus, ce qui rend son algorithme particulièrement efficace.

Claudiu
la source
7

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

Jim Burger
la source
6
Disons que vous avez un total de milliards de pages de mots stockées. Il n'y a pas de moyen facile d'indexer la distance de Levenshtein pour une récupération rapide des correspondances proches sans calculer la distance de Levenshtein quelques milliards de fois pour chaque mot interrogé. La distance de Levenshtein n'est donc pas d'une grande utilité dans cette situation, du moins pas dans la première étape, où Google doit réduire de milliards de mots existants à ceux qui sont susceptibles d'être des fautes d'orthographe du mot actuel. Il peut certainement appliquer Levenshtein comme étape ultérieure une fois qu'il a déjà récupéré les correspondances probables.
thomasrutter
6

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

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

  • Utilisez un grand corps de texte ou un dictionnaire, où tout ou la plupart sont connus pour être correctement orthographiés. Ceux-ci sont faciles à trouver 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 celui de personnages similaires. Ce qui a été démontré par la recherche et l'expérimentation, c'est que les correspondances de séquences de deux ou trois caractères fonctionnent mieux. (bigrammes et trigrammes). Pour améliorer encore les résultats, pesez un score plus élevé lors d'une correspondance au début ou à la fin du mot. Pour des raisons de performances, indexez tous ces mots sous forme de trigrammes ou de bigrammes, de sorte que lorsque vous effectuez une recherche, vous convertissez en n-gramme et recherchez via une table de hachage ou un trie.

  • Utilisez des heuristiques liées aux erreurs de clavier potentielles basées sur l'emplacement du personnage. Alors que "hwllo" devrait être "bonjour" car 'w' est proche de 'e'.

  • Utilisez une clé phonétique (Soundex, Metaphone) pour indexer les mots et rechercher d'éventuelles corrections. En pratique, cela donne normalement des résultats pires que l'utilisation de l'indexation en 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 du clavier, etc.

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

eulerfx
la source
6

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

Nicolas Dorier
la source
4

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

Donc,

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

  2. Générez un treillis de mots 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 soin des insertions et des suppressions lors du calcul des distances. Ce qui est amusant, c'est que le clavier QWERTY maximise la distance si vous appuyez sur des touches proches les unes des autres (cae tournerait la voiture, cay tournerait le chat)

  4. Renvoie le mot 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 d'autres correspondances proches.

Geee
la source
4

Voici la meilleure réponse que j'ai trouvée , correcteur orthographique mis en œuvre 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 l'apprentissage automatique statistique.

Aziz Alto
la source
3

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

seanb
la source
3

Comme une supposition ... cela pourrait

  1. rechercher des mots
  2. s'il n'est pas trouvé, utilisez un algorithme pour essayer de "deviner" le mot.

Cela pourrait être quelque chose de l'IA comme le réseau Hopfield ou le réseau de propagation arrière, ou quelque chose d'autre "identifier les empreintes digitales", restaurer des données cassées ou corriger des corrections d'orthographe comme Davide l'a déjà mentionné ...

Paul Kapustin
la source
2

Facile. Ils ont des tonnes de données. Ils ont des statistiques pour chaque terme possible, basées sur la fréquence à laquelle il est interrogé et sur les variations de celui-ci qui génèrent généralement des résultats sur lesquels les utilisateurs cliquent ... la réponse la plus habituelle.

En fait, si l'orthographe est en fait le terme recherché le plus fréquemment, l'algorithme le prendra pour le bon.

schonarth
la source
1
Personne n'a douté que Google dispose de toutes les données nécessaires pour le faire, mais la question demandait des détails sur la façon dont Google a élaboré un algorithme pour le faire, avec autant de données, dans un délai raisonnable. Ils auraient des millions de recherches par jour - comment identifier facilement si un terme de recherche est une «correction orthographique» d'un autre, récent? Quels facteurs font que Google décide qu'un terme est mal orthographié? Ce sont des détails de mise en œuvre qui seraient intéressants.
thomasrutter
2

concernant votre question comment imiter le comportement sans avoir des 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 «Vouliez-vous dire:» dans le code HTML.

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

Tomas Petricek
la source
combien de temps jusqu'à ce que google arrête votre robot de gratter? - ou google ne remarquerait-il même pas ces jours-ci?
Andrew Harry
Je ne pense pas qu'ils remarqueront si les exigences / sec ne sont pas trop élevées.
Mauricio Scheffer
2

Outre les réponses ci-dessus, au cas où vous souhaiteriez mettre en œuvre rapidement quelque chose par 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 (du post 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, mettez-le dans une file d'attente prioritaire.
  • Enfin, extrayez 10 mots de la file d'attente prioritaire et affichez-les.
amarjeetAnand
la source
1

Vous voulez dire le correcteur orthographique? S'il s'agit d'un correcteur orthographique plutôt que d'une phrase entière, j'ai un lien sur la vérification orthographique où l'algorithme est développé en python. Vérifiez ce lien

Pendant ce temps, je travaille également sur un projet qui comprend la recherche de bases de données à l'aide de texte. Je suppose que cela résoudrait votre problème

Jimit Patel
la source
1

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

Apache Solr est un moteur de recherche en texte intégral qui, en plus de nombreuses autres fonctionnalités, fournit également des suggestions de vérification orthographique ou de requête. De la documentation :

Par défaut, les vérificateurs orthographiques de Lucene trient les suggestions d'abord par le score du calcul de la distance de la chaîne et ensuite par la fréquence (si disponible) de la suggestion dans l'index.

Josep Valls
la source
0

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


la source
-1

Le moyen le plus simple de le comprendre est la programmation dynamique de Google.

C'est un algorithme qui a été emprunté à la recherche d'informations et qui est largement utilisé en bioinformatique moderne pour voir à quel point deux séquences de gènes sont similaires.

La solution optimale utilise la programmation dynamique et la récursivité.

Il s'agit d'un problème très résolu avec de nombreuses solutions. Faites simplement un tour de Google jusqu'à ce que vous trouviez du code open source.

éveillé
la source