Realizará bastantes búsquedas de palabras en un diccionario fijo. Por lo tanto, debes preparar tu diccionario. Lógicamente, puede eliminar rápidamente candidatos que son "simplemente demasiado diferentes".
Por ejemplo, las palabras car
y dissimilar
puede compartir un sufijo, pero son obviamente no faltas de ortografía de uno al otro. Ahora, ¿por qué es tan obvio para nosotros los humanos? Para empezar, la duración es completamente diferente.Eso es una descalificación inmediata (pero con una excepción, más abajo). Por lo tanto, su diccionario debe ordenarse por longitud de palabra. Haga coincidir su palabra de entrada con palabras de longitud similar. Para palabras cortas que significa +/- 1 carácter; las palabras más largas deben tener un margen más alto (¿exactamente qué tan bien puede su hechizo demográfico?)
Una vez que se haya restringido a palabras candidatas de longitud similar, le gustaría quitar palabras que son completamente diferentes. Con esto quiero decir que usan letras completamente diferentes. Esto es más fácil de comparar si ordena las letras alfabéticamente en una palabra. P.ej. car
se convierte en "acr"
; rack
se convierte en "ackr"
. Lo hará en preprocesamiento para su diccionario y para cada palabra de entrada. La razón es que es barato determinar el (tamaño de una) diferencia de dos conjuntos ordenados. (Agregue un comentario si necesita una explicación). car
y rack
tienen una diferencia de tamaño 1, car
y hat
tienen una diferencia de tamaño 2. Esto reduce aún más su conjunto de candidatos. Tenga en cuenta que para palabras más largas, puede rescatar temprano cuando haya encontrado demasiadas diferencias. P.ej. dissimilar
y biography
tienen una diferencia total de 13, pero teniendo en cuenta la duración (8/9) probablemente pueda rescatar una vez que haya encontrado 5 diferencias.
Esto te deja con un conjunto de palabras candidatas que usan casi las mismas letras, y también tienen casi la misma longitud. En este punto puede comenzar a usar algoritmos más refinados; ya no necesita ejecutar 150,000 comparaciones por palabra de entrada.
Ahora, para la excepción de longitud mencionada anteriormente: El problema está en "words" como greencar
. Realmente no coincide con una palabra de longitud 8, y sin embargo, para los humanos es bastante obvio lo que se quiso decir. En este caso, no puede realmente romper la palabra de entrada en cualquier límite aleatorio y ejecutar coincidencias N-1 inexactas adicionales contra ambas mitades. Sin embargo, es factible verificar solo por un espacio faltante. Solo haga una búsqueda de todos los prefijos posibles. Esto es eficiente porque usará la misma parte del diccionario una y otra vez, p. g
gr
, gre
, gree
, etc. Para cada prefijo que haya encontrado, verifique si el sufijo restante también está en la dicción, p. reencar
, eencar
. Si las dos mitades de la palabra de entrada están en el diccionario, pero la palabra en sí no es así, puede suponer que falta un espacio.
Ver http://stackoverflow.com/questions/49263/approximate-string-matching-algorithms –