¿Cómo dice Google "¿Quiso decir?" Algoritmo de trabajo?

436

He estado desarrollando un sitio web interno para una herramienta de gestión de cartera. Hay muchos datos de texto, nombres de compañías, etc. Me ha impresionado mucho la capacidad de algunos motores de búsqueda para responder rápidamente a las consultas con "¿Quiso decir: xxxx"?

Necesito poder tomar de forma inteligente una consulta del usuario y responder no solo con resultados de búsqueda sin formato, sino también con un "¿Quiso decir?" respuesta cuando hay una respuesta alternativa muy probable, etc.

[Estoy desarrollando en ASP.NET (VB - ¡no lo tengas en mi contra!)]

ACTUALIZACIÓN: OK, ¿cómo puedo imitar esto sin los millones de 'usuarios no remunerados'?

  • ¿Generar errores tipográficos para cada término 'conocido' o 'correcto' y realizar búsquedas?
  • ¿Algún otro método más elegante?
Andrew Harry
fuente
1
Aquí está la versión VB.NET del Corrector ortográfico Norvig. ¡Esto puede resultarle útil si no es demasiado tarde!
Ralph Wiggum
77
posible duplicado de ¿Cómo implementas un "Quiso decir"?
Kurt McKee
Escribo en un teclado que no es qwerty (Colemak) y la función no es ni la mitad de inteligente. Seguramente aprende de los pares de corrección de errores registrados y, por lo tanto, está sintonizado a qwerty. Los correctores ortográficos normales funcionan bien para mi teclado, como se esperaba: la distancia de edición de la cadena es invariable en el diseño.
Coronel Panic

Respuestas:

366

Aquí está la explicación directamente de la fuente (casi)

Buscar 101!

al mínimo 22:03

¡Vale la pena ver!

Básicamente y de acuerdo con Douglas Merrill, ex director de tecnología de Google, es así:

1) Escribe una palabra (mal escrita) en google

2) No encuentras lo que buscabas (no hagas clic en ningún resultado)

3) Te das cuenta de que escribiste mal la palabra y reescribes la palabra en el cuadro de búsqueda.

4) Encuentra lo que buscas (haces clic en los primeros enlaces)

Este patrón multiplicado millones de veces, muestra cuáles son los errores ortográficos más comunes y cuáles son las correcciones más "comunes".

De esta forma, Google puede, casi instantáneamente, ofrecer corrección ortográfica en todos los idiomas.

Esto también significa que si de la noche a la mañana todos comienzan a deletrear la noche como "noche", Google sugeriría esa palabra.

EDITAR

@ThomasRutter: Douglas lo describe como "aprendizaje automático de estadística".

Saben quién corrige la consulta, porque saben qué consulta proviene de qué usuario (usando cookies)

Si los usuarios realizan una consulta, y solo el 10% de los usuarios hacen clic en un resultado y el 90% regresa y escribe otra consulta (con la palabra corregida) y esta vez ese 90% hace clic en un resultado, entonces saben que han encontrado Una corrección.

También pueden saber si esas son consultas "relacionadas" de dos diferentes, porque tienen información de todos los enlaces que muestran.

Además, ahora están incluyendo el contexto en el corrector ortográfico, por lo que incluso pueden sugerir palabras diferentes según el contexto.

Vea esta demostración de google wave (@ 44m 06s) que muestra cómo se tiene en cuenta el contexto para corregir automáticamente la ortografía.

Aquí se explica cómo funciona el procesamiento del lenguaje natural.

Y finalmente, aquí hay una demostración impresionante de lo que se puede hacer agregando traducción automática (@ 1h 12m 47s) a la mezcla.

Agregué anclas de minutos y segundos a los videos para saltar directamente al contenido; si no funcionan, intente volver a cargar la página o desplazarse manualmente hasta la marca.

OscarRyz
fuente
¿Cómo funciona el algoritmo? ¿Cómo pasa Google de "Recibimos miles de millones de búsquedas con varios términos, y estas son esas búsquedas" a "este término, por lo tanto, debe ser un error ortográfico común de este término"? Han resuelto este problema, pero estoy interesado en cómo. ¿Cómo calculan que dos búsquedas son del mismo usuario, y qué palabra es una 'corrección' de otra, y cómo suman esto en miles de millones de búsquedas?
thomasrutter
51
Si todos comenzaran a escribir mal "noche" ... creo que ya se encontraron con personas que buscaban "Flickr".
Max Lybbert
42
El problema de que todos escribieron mal algo ya ha sucedido en un sentido mucho más severo: intente escribir 'fuscia' en Google. Google dice "¿Te refieres a fuschia?" La ortografía correcta, de hecho, es "fucsia", pero nadie puede deletrearla correctamente por alguna razón. El problema es aún peor en Dictionary.com; si escribe "fuschia" en su búsqueda, aparece "No hay resultados para fuschia. ¿Quiso decir 'fuschia'?" (es decir, ¿quisiste decir lo que acabas de escribir?)
Daisy Sophia Hollman
8
No creo que solo utilicen datos de ortografía incorrecta; definitivamente hay cierta distancia de Levenshtein o similar en curso, busque 'Plack' (y una o más palabras) y siempre se corrige a 'negro', lo cual es un error ortográfico muy poco probable / typo
plusplus
44
@Jakub Creo que han solucionado el problema desde que hice ese comentario hace más de 4 años. De hecho, Google también ha solucionado el problema. Una búsqueda de fuschia incluye resultados para fucsia automáticamente.
Daisy Sophia Hollman
104

Encontré este artículo hace algún tiempo: Cómo escribir un corrector ortográfico , escrito por Peter Norvig (Director de investigación de Google Inc.).

Es una lectura interesante sobre el tema "corrección ortográfica". Los ejemplos están en Python, pero es claro y simple de entender, y creo que el algoritmo se puede traducir fácilmente a otros idiomas.

A continuación sigue una breve descripción del algoritmo. El algoritmo consta de dos pasos, preparación y verificación de palabras.

Paso 1: preparación: configuración de la base de datos de Word

Lo mejor es si puede usar palabras de búsqueda reales y su aparición. Si no tiene eso, puede usar un gran conjunto de texto en su lugar. Cuente la ocurrencia (popularidad) de cada palabra.

Paso 2. Verificación de palabras: encontrar palabras similares a la marcada

Similar significa que la distancia de edición es baja (típicamente 0-1 o 0-2). La distancia de edición es el número mínimo de inserciones / eliminaciones / cambios / intercambios necesarios para transformar una palabra en otra.

Elija la palabra más popular del paso anterior y sugiérala como una corrección (si no es la palabra en sí).

Davide Gualano
fuente
66
@Davide: "" "los ejemplos están en Python pero es claro y simple de entender" "": No entiendo tu uso de "pero" ... Diría que dado el estilo de escritura de Python + Norvig, "claro y simple de entender "es el resultado esperado.
John Machin
20
El "pero" estaba allí porque Harry dijo en su pregunta que él es un desarrollador de VB.NET, así que asumí que no estaba seguro con el lenguaje python.
Davide Gualano
56

Para la teoría del algoritmo "quiso decir", puede consultar el Capítulo 3 de Introducción a la recuperación de información. Está disponible en línea de forma gratuita. La sección 3.3 (página 52) responde exactamente a su pregunta. Y para responder específicamente a su actualización, solo necesita un diccionario de palabras y nada más (incluidos millones de usuarios).

Szere Dyeri
fuente
10

Hmm ... pensé que Google usaba su gran conjunto de datos (Internet) para hacer un serio PNL (procesamiento del lenguaje natural).

Por ejemplo, tienen tantos datos de Internet que pueden contar la cantidad de veces que ocurre una secuencia de tres palabras (conocida como trigrama ). Entonces, si ven una oración como: "concierto rosa frugr", podrían ver que tiene pocos éxitos, y luego encontrarán el "concierto rosa *" más probable en su corpus.

Sin embargo, aparentemente solo hacen una variación de lo que Davide Gualano estaba diciendo, así que definitivamente lean ese enlace. Por supuesto, Google usa todas las páginas web que conoce como un corpus, por lo que su algoritmo es particularmente efectivo.

Claudiu
fuente
7

Supongo que usan una combinación de un algoritmo de distancia de Levenshtein y la gran cantidad de datos que recopilan sobre las búsquedas que se ejecutan. Podrían extraer un conjunto de búsquedas que tengan la distancia de Levenshtein más corta desde la cadena de búsqueda ingresada, luego elegir la que tenga más resultados.

Jim Burger
fuente
66
Supongamos que tiene un total de miles de millones de páginas de palabras almacenadas. No hay una manera fácil de indexar la distancia de Levenshtein para la recuperación rápida de coincidencias cercanas sin calcular la distancia de Levenshtein unos miles de millones de veces por cada palabra consultada. La distancia de Levenshtein, por lo tanto, no es de mucha utilidad en esta situación, al menos no en la primera etapa, donde Google necesita reducir de miles de millones de palabras existentes a solo aquellas palabras que probablemente sean errores ortográficos de la palabra actual. Definitivamente puede aplicar Levenshtein como un paso posterior una vez que ya ha obtenido coincidencias probables.
thomasrutter
6

Normalmente, un corrector ortográfico de producción utiliza varias metodologías para proporcionar una sugerencia ortográfica. Algunos son:

  • Decida una forma de determinar si se requiere corrección ortográfica. Estos pueden incluir resultados insuficientes, resultados que no son lo suficientemente específicos o precisos (según alguna medida), etc. Luego:

  • Use un gran cuerpo de texto o un diccionario, donde se sepa que todos o la mayoría están escritos correctamente. Estos se encuentran fácilmente en línea, en lugares como LingPipe . Luego, para determinar la mejor sugerencia, busque una palabra que sea la coincidencia más cercana en función de varias medidas. El más intuitivo son los personajes similares. Lo que se ha demostrado a través de la investigación y la experimentación es que las coincidencias de secuencia de dos o tres caracteres funcionan mejor. (bigrams y trigrams). Para mejorar aún más los resultados, evalúe una puntuación más alta en un partido al principio o al final de la palabra. Por razones de rendimiento, indexe todas estas palabras como trigramas o bigramas, de modo que cuando realice una búsqueda, se convierta a n-gramo y busque mediante tabla hash o trie.

  • Utilice la heurística relacionada con posibles errores de teclado en función de la ubicación del personaje. De modo que "hwllo" debería ser "hola" porque 'w' está cerca de 'e'.

  • Use una tecla fonética (Soundex, Metaphone) para indexar las palabras y buscar posibles correcciones. En la práctica, esto normalmente arroja peores resultados que el uso de la indexación de n-gram, como se describió anteriormente.

  • En cada caso, debe seleccionar la mejor corrección de una lista. Esta puede ser una métrica de distancia, como levenshtein, la métrica del teclado, etc.

  • Para una frase de varias palabras, solo una palabra puede estar mal escrita, en cuyo caso puede usar las palabras restantes como contexto para determinar una mejor coincidencia.

eulerfx
fuente
6

Use la distancia de Levenshtein , luego cree un árbol métrico (o árbol delgado) para indexar palabras. Luego ejecute una consulta de 1 vecino más cercano y obtendrá el resultado.

Nicolas Dorier
fuente
4

Al parecer, Google sugiere consultas con mejores resultados, no con las que están escritas correctamente. Pero en este caso, probablemente un corrector ortográfico sería más factible. Por supuesto, podría almacenar algún valor para cada consulta, en función de alguna métrica de los buenos resultados que devuelve.

Entonces,

  1. Necesita un diccionario (inglés o basado en sus datos)

  2. Genere una palabra enrejada y calcule las probabilidades para las transiciones usando su diccionario.

  3. Agregue un decodificador para calcular la distancia mínima de error usando su enrejado. Por supuesto, debe tener cuidado con las inserciones y eliminaciones al calcular distancias. Lo divertido es que el teclado QWERTY maximiza la distancia si presionas las teclas una cerca de la otra (cae cae al carro, cay gira al gato)

  4. Devuelve la palabra que tiene la distancia mínima.

  5. Luego, podría compararlo con su base de datos de consultas y verificar si hay mejores resultados para otras coincidencias cercanas.

Geee
fuente
4

Aquí está la mejor respuesta que encontré , el corrector ortográfico implementado y descrito por el Director de Investigación de Google, Peter Norvig.

Si quieres leer más sobre la teoría detrás de esto, puedes leer el capítulo de su libro .

La idea de este algoritmo se basa en el aprendizaje automático estadístico.

Aziz Alto
fuente
3

Vi algo sobre esto hace unos años, por lo que puede haber cambiado desde entonces, pero aparentemente lo comenzaron analizando sus registros para los mismos usuarios que enviaron consultas muy similares en un corto espacio de tiempo, y utilizaron el aprendizaje automático en función de cómo los usuarios habían corregido sí mismos.

seanb
fuente
3

Como una suposición ... podría

  1. buscar palabras
  2. Si no se encuentra, utilice algún algoritmo para intentar "adivinar" la palabra.

Podría ser algo de AI como la red Hopfield o la red de propagación inversa, o algo más que "identifique huellas digitales", restaure datos rotos o corrija la ortografía como ya mencionó Davide ...

Paul Kapustin
fuente
2

Simple. Tienen toneladas de datos. Tienen estadísticas para cada término posible, en función de la frecuencia con la que se consulta, y qué variaciones de la misma generalmente producen resultados en los que los usuarios hacen clic ... así que, cuando ven que escribiste un error ortográfico frecuente para un término de búsqueda, continúan y proponen La respuesta más habitual.

En realidad, si el error ortográfico es el término buscado más frecuente, el algoritmo lo tomará como el correcto.

Schonarth
fuente
1
Nadie ha dudado de que Google tiene todos los datos necesarios para hacer esto, pero la pregunta era pedir detalles sobre cómo Google ha creado un algoritmo para hacer esto, con tanta información, en un período de tiempo razonable. Tendrían miles de millones de búsquedas por día: ¿cómo identifican fácilmente si un término de búsqueda es una 'corrección ortográfica' de otro reciente? ¿Qué factores hacen que Google decida que un término es un error ortográfico de otro? Estos son detalles de implementación que serían de interés.
thomasrutter
2

con respecto a su pregunta sobre cómo imitar el comportamiento sin tener toneladas de datos, ¿por qué no usar toneladas de datos recopilados por google? Descargue los resultados de Google Sarch para la palabra mal escrita y busque "Quiso decir:" en el HTML.

Supongo que eso se llama mashup hoy en día :-)

Tomás Petricek
fuente
¿cuánto tiempo hasta que google detiene su bot de raspar? ¿O Google no se daría cuenta en estos días?
Andrew Harry
No creo que se den cuenta si los requisitos / seg no son demasiado altos.
Mauricio Scheffer
2

Además de las respuestas anteriores, en caso de que desee implementar algo usted mismo rápidamente, aquí hay una sugerencia:

Algoritmo

Puede encontrar la implementación y la documentación detallada de este algoritmo en GitHub .

  • Crea una cola prioritaria con un comparador.
  • Cree un Árbol de búsqueda de Ternay e inserte todas las palabras en inglés (de la publicación de Norvig ) junto con sus frecuencias.
  • Comience a recorrer el TST y por cada palabra encontrada en el TST, calcule su Distancia de Levenshtein ( LD ) desde input_word
  • Si LD ≤ 3, póngalo en una cola de prioridad.
  • Por fin extraer 10 palabras de la cola de prioridad y mostrar.
amarjeetAnand
fuente
1

¿Quieres decir corrector ortográfico? Si se trata de un corrector ortográfico en lugar de una frase completa, entonces tengo un enlace sobre la corrección ortográfica donde se desarrolla el algoritmo en Python. Mira este enlace

Mientras tanto, también estoy trabajando en un proyecto que incluye la búsqueda de bases de datos utilizando texto. Supongo que esto resolvería tu problema

Jimit Patel
fuente
1

Esta es una vieja pregunta, y me sorprende que nadie sugirió el OP usando Apache Solr.

Apache Solr es un motor de búsqueda de texto completo que, además de muchas otras funciones, también proporciona correcciones ortográficas o sugerencias de consulta. De la documentación :

De forma predeterminada, los correctores ortográficos de Lucene clasifican las sugerencias primero por la puntuación del cálculo de la distancia de la cadena y luego por la frecuencia (si está disponible) de la sugerencia en el índice.

Josep Valls
fuente
0

Existe una estructura de datos específica, el árbol de búsqueda ternario , que naturalmente admite coincidencias parciales y coincidencias cercanas al vecino.


fuente
-1

La forma más fácil de resolverlo es mediante la programación dinámica de Google.

Es un algoritmo que se ha tomado prestado de Recuperación de información y se usa mucho en la bioinformática moderna para ver cuán similares son dos secuencias de genes.

La solución óptima utiliza programación dinámica y recursividad.

Este es un problema muy resuelto con muchas soluciones. Simplemente busque en Google hasta que encuentre algún código fuente abierto.

despertado
fuente