Hay un buen ensayo de Peter Norvig sobre cómo implementar un corrector ortográfico. Básicamente, es un enfoque de fuerza bruta que prueba cadenas candidatas con una distancia de edición determinada. (A continuación, se ofrecen algunos consejos sobre cómo mejorar el rendimiento del corrector ortográfico mediante un filtro Bloom y un hash candidato más rápido ).
Los requisitos para un corrector ortográfico son más débiles. Solo tienes que descubrir que una palabra no está en el diccionario. Puede utilizar un filtro Bloom para crear un corrector ortográfico que consuma menos memoria. Una versión antigua se describe en Programming Pearls por Jon Bentley usando 64kb para un diccionario de inglés.
Un BK-Tree es un enfoque alternativo. Un buen artículo está aquí .
La distancia de Levenshstein no es exactamente la distancia de edición correcta para un corrector ortográfico. Conoce solo la inserción, la eliminación y la sustitución. Falta la transposición y produce 2 para una transposición de 1 carácter (es 1 eliminación y 1 inserción). La distancia Damerau-Levenshtein es la distancia de edición correcta.
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 endfnt
. 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.
fuente
Algoritmo
Mejoramiento
Puede encontrar la explicación más detallada y el código fuente en el proyecto github .
fuente
No es necesario que sepa la distancia de edición exacta para cada palabra en el diccionario. Puede detener el algoritmo después de alcanzar un valor límite y excluir la palabra. Esto le ahorrará mucho tiempo informático.
fuente
El corrector ortográfico es muy fácil de implementar como en el programa de ortografía Unix. El código fuente está disponible en público. La corrección puede estar involucrada, una técnica es hacer ediciones y nuevamente verificar si esta nueva palabra está en el diccionario. Estas nuevas ediciones se pueden agrupar y mostrar al usuario.
El sistema Unix usa un programa escrito por Mc IllRoy. Una forma alternativa es usar un Trie que puede ser útil en el caso de archivos grandes.
El método Unix necesita menos espacio para un diccionario enorme, ya que utiliza un algoritmo de dispersión hash.
fuente