Estoy tratando de escribir un módulo de corrector ortográfico.Buscando palabras similares
Carga un texto, crea un diccionario a partir de un archivo de 16 mb y luego comprueba si la palabra encontrada es similar a la del diccionario (similar = varía hasta dos caracteres) si es así lo cambia al formulario del diccionario.
En este momento estoy usando un algoritmo de Levenshtein Distancia y el procesamiento de unas 50 palabras configurado tendrá 3 min ...
Estoy bastante seguro de que debe haber una solución más rápida. Profiler me dijo que mi aplicación pasa más del 80% de su tiempo en la función Distancia de Levenshtein.
¿Hay mejores soluciones/algoritmos?
Aquí está el implementarse de versión del algoritmo que utilizo:
def levenshteinDistance(s1, s2):
l_s1 = len(s1)
l_s2 = len(s2)
d = [[a for a in genM(x, l_s2 + 1)] for x in xrange(l_s1 + 1)]
for i in xrange(1, l_s1 + 1):
for j in xrange(1, l_s2 + 1):
d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + decide_of_equality(s1[i - 1],s2[j - 1]))
return d[l_s1][l_s2]
Suena como "Autocorrección" que la corrección ortográfica, ya que los correctores ortográficos generalmente crean opciones y permiten que los usuarios seleccionen entre ellas. La autocorrección es obviamente imposible de hacer bien, un hecho ahora casi universalmente reconocido, incluso en comerciales de televisión. :-) –
Si hace la suposición de que la primera letra de la palabra es siempre correcta, entonces puede verificar en el diccionario las palabras que comienzan con esa letra. Disminuirá su tiempo en más o menos un factor o 26 – Doboy
No sé mucho sobre python, pero su función de distancia usa la solución de programación dinámica estándar. Aquí está mi versión en C++: http://codereview.stackexchange.com/questions/10130/edit-distance-between-two-strings tal vez pueda detectar alguna diferencia. –