Un enfoque para generar sugerencias que he usado con éxito pero que nunca he visto descrito en ninguna parte es calcular previamente las sugerencias (al construir el diccionario) usando funciones hash "malas".
La idea es observar los tipos de errores ortográficos que cometen las personas y diseñar funciones hash que asignarían una ortografía incorrecta al mismo grupo que su ortografía correcta.
Por ejemplo, un error común es usar la vocal incorrecta, como definir en lugar de definido . Así que diseña una función hash que trata todas las vocales como la misma letra. Una forma fácil de hacerlo es primero "normalizar" la palabra de entrada y luego poner el resultado normalizado a través de una función hash regular. En este ejemplo, la función de normalización podría eliminar todas las vocales, por lo que se definite
convierte en dfnt
. La palabra "normalizada" se codifica con una función hash típica.
Inserte todas las palabras del diccionario en un índice auxiliar (tabla hash) usando esta función hash especial. Los depósitos de esta tabla tendrán listas de colisiones más largas porque la función hash es "mala", pero esas listas de colisiones son esencialmente sugerencias precalculadas.
Ahora, cuando encuentre una palabra mal escrita, busque las listas de colisiones para el depósito al que se asigna el error ortográfico en los índices auxiliares. Ta da: ¡Tienes una lista de sugerencias! Todo lo que tienes que hacer es clasificar las palabras en él.
En la práctica, necesitará algunos índices auxiliares con otras funciones hash para manejar otros tipos de errores, como letras transpuestas, letras simples / dobles e incluso uno simplista similar a Soundex para detectar errores ortográficos fonéticos. En la práctica, encontré que la pronunciación simplista es muy útil y esencialmente obsoleta algunas de las diseñadas para encontrar errores tipográficos triviales.
Así que ahora busca errores ortográficos en cada uno de los índices auxiliares y concatena las listas de colisiones antes de clasificar.
Recuerde que las listas de colisiones contienen solo palabras que están en el diccionario. Con enfoques que intentan generar ortografías alternativas (como en el artículo de Peter Norvig), puede obtener (decenas de) miles de candidatos que primero debe filtrar en el diccionario. Con el enfoque precalculado, puede obtener tal vez un par de cientos de candidatos, y sabe que todos están escritos correctamente, por lo que puede pasar directamente a la clasificación.
Actualización : desde entonces encontré una descripción de algoritmo similar a esta, la búsqueda distribuida de FAROO . Esta sigue siendo una búsqueda limitada a la distancia de edición, pero es muy rápida porque el paso previo al cálculo funciona como mi idea de "funciones de hash incorrectas". FAROO solo usa un concepto limitado de una mala función hash.