Sto provando a scrivere un modulo di controllo ortografico.Alla ricerca di parole simili
Carica un testo, crea un dizionario da 16 file MB e quindi verifica se la parola rilevata è simile alla parola nel dizionario (simile = varia fino a due caratteri), in caso affermativo lo modifica nel modulo dal dizionario.
In questo momento sto utilizzando un algoritmo Levenshtein distanza e l'elaborazione di un 50 parole set prende 3 min ...
Sono abbastanza sicuro che ci deve essere una soluzione più veloce. Profiler mi ha detto che la mia app spende oltre l'80% del tempo nella funzione Levenshtein Distance.
Esistono soluzioni/algoritmi migliori?
Ecco l'implementato della versione dell'algoritmo che uso:
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]
I suoni sono come "Correzione automatica" piuttosto che il controllo ortografico, poiché i correttori ortografici di solito creano opzioni e consentono agli utenti di scegliere tra di loro. La correzione automatica è ovviamente impossibile da fare, un fatto ormai quasi universalmente riconosciuto, anche negli spot televisivi. :-) –
Se si presuppone che la prima lettera della parola sia sempre corretta, è sufficiente controllare il dizionario per le parole che iniziano con quella lettera. Ridurrà il tuo tempo più o meno un fattore o 26 – Doboy
Non so molto su Python, ma la tua funzione di distanza usa la soluzione di programmazione dinamica standard. Ecco la mia versione in C++: http://codereview.stackexchange.com/questions/10130/edit-distance-between-two-strings forse puoi notare qualche differenza. –