Un approccio per generare suggerimenti che ho usato con successo ma che non ho mai visto descritto da nessuna parte è quello di pre-calcolare i suggerimenti (durante la creazione del dizionario) utilizzando funzioni hash "cattive".
L'idea è di esaminare i tipi di errori di ortografia commessi dalle persone e di progettare funzioni hash che assegnerebbero un'ortografia errata allo stesso bucket della sua ortografia corretta.
Ad esempio, un errore comune è usare la vocale sbagliata, come definire invece di definito . Quindi si progetta una funzione hash che tratta tutte le vocali come la stessa lettera. Un modo semplice per farlo è prima "normalizzare" la parola in ingresso e poi inserire il risultato normalizzato attraverso una normale funzione hash. In questo esempio, la funzione di normalizzazione potrebbe eliminare tutte le vocali, quindi definite
diventa dfnt
. La parola "normalizzata" viene quindi sottoposta a hashing con una tipica funzione hash.
Inserisci tutte le parole del tuo dizionario in un indice ausiliario (tabella hash) usando questa speciale funzione hash. I bucket in questa tabella avranno elenchi di collisioni più lunghi perché la funzione hash è "cattiva", ma questi elenchi di collisioni sono essenzialmente suggerimenti precalcolati.
Ora, quando trovi una parola con errori di ortografia, cerchi negli elenchi di collisioni il bucket a cui è associato l'errore di ortografia negli indici ausiliari. Ta da: Hai un elenco di suggerimenti! Tutto quello che devi fare è classificare le parole su di esso.
In pratica, avrai bisogno di alcuni indici ausiliari con altre funzioni hash per gestire altri tipi di errori, come lettere trasposte, lettere singole / doppie e persino uno semplicistico simile a Soundex per catturare errori di ortografia fonetici. In pratica, ho trovato quelle di pronuncia semplicistiche per fare molto e sostanzialmente obsolete alcune di quelle progettate per trovare errori di battitura banali.
Quindi ora cerchi gli errori di ortografia in ciascuno degli indici ausiliari e concatena le liste di collisione prima della classifica.
Ricorda che le liste di collisione contengono solo parole che sono nel dizionario. Con approcci che provano a generare ortografie alternative (come nell'articolo di Peter Norvig), puoi ottenere (decine di) migliaia di candidati che devi prima filtrare nel dizionario. Con l'approccio precalcolato, ottieni forse un paio di centinaia di candidati e sai che sono tutti scritti correttamente, quindi puoi saltare direttamente alla classifica.
Aggiornamento : da allora ho trovato una descrizione di algoritmo simile a questa, la FAROO Distributed Search . Questa è ancora una ricerca limitata a distanza di modifica, ma è molto veloce perché il passaggio di pre-calcolo funziona come la mia idea di "funzioni hash difettose". FAROO utilizza solo un concetto limitato di una cattiva funzione hash.