Strutture dati efficienti per la creazione di un correttore ortografico veloce


41

Sto cercando di scrivere un correttore ortografico che dovrebbe funzionare con un dizionario abbastanza grande. Voglio davvero un modo efficiente per indicizzare i dati del mio dizionario da utilizzare usando una distanza Damerau-Levenshtein per determinare quali parole sono più vicine alla parola errata.

Sto cercando una struttura di dati che mi darebbe il miglior compromesso tra complessità dello spazio e complessità del runtime.

Sulla base di ciò che ho trovato su Internet, ho alcune indicazioni su quale tipo di struttura di dati utilizzare:

prova

trie-500px

Questo è il mio primo pensiero e sembra abbastanza facile da implementare e dovrebbe fornire una rapida ricerca / inserimento. Anche qui la ricerca approssimativa con Damerau-Levenshtein dovrebbe essere semplice da implementare. Ma non sembra molto efficiente in termini di complessità dello spazio poiché molto probabilmente hai un sacco di sovraccarico con la memorizzazione dei puntatori.

Patricia Trie

trie-500px

Questo sembra consumare meno spazio di un normale Trie poiché stai sostanzialmente evitando il costo di memorizzazione dei puntatori, ma sono un po 'preoccupato per la frammentazione dei dati in caso di dizionari molto grandi come quello che ho.

Suffix Tree

suffisso 500px

Non sono sicuro di questo, sembra che alcune persone lo trovino utile nel text mining, ma non sono davvero sicuro di cosa darebbe in termini di prestazioni per un correttore ortografico.

Albero di ricerca ternaria

tst

Questi sembrano piuttosto belli e in termini di complessità dovrebbero essere vicini (meglio?) A Patricia Tries, ma non sono sicuro riguardo alla frammentazione se sarebbe meglio di peggio di Patricia Tries.

Albero di scoppio

scoppiare

Questo sembra un po 'ibrido e non sono sicuro di quale vantaggio avrebbe rispetto a Tries e simili, ma ho letto diverse volte che è molto efficiente per il text mining.


Vorrei ricevere un feedback su quale struttura di dati sarebbe meglio usare in questo contesto e cosa lo rende migliore degli altri. Se mi mancano alcune strutture di dati che sarebbero ancora più appropriate per un controllo ortografico, sono anche molto interessato.


In che modo un trie patricia evita il costo di memorizzazione dei puntatori? È solo un en.wikipedia.org/wiki/Radix_tree ? In tal caso, penso che memorizzi ancora molti puntatori, ma avrai enormi risparmi di spazio perché i prefissi comuni vengono memorizzati solo una volta
Joe

Senza specifiche il confronto richiesto potrebbe essere impossibile. In particolare, quale densità ha il tuo dizionario? Fino a che distanza vuoi rilevare errori di ortografia (sembra che tu abbia detto senza limiti)? Qual è la densità del dizionario + varianti? (Densità qui significa la frazione di tutte le parole di lunghezza che è contenuta nel set memorizzato.)n
Raffaello

1
@linker: hai provato tutte le varianti del tuo dizionario? Dato un caso d'uso fisso, questo è probabilmente il modo più veloce per scoprire quale struttura dati consuma quanto spazio.
Raffaello

1
È solo un dizionario di base, solo un elenco noto di parole scritte correttamente.
Charles Menguy,

Risposte:


4

Ho riscontrato lo stesso problema, ma ho adottato un approccio diverso. Puoi costruire una sorta di funzione "hash", che per una parola simile darà un numero uguale o prossimo.

Il problema è che quella funzione che darà risultati "buoni" per le parole con inserimento / rimozione, darà "cattivo" per la transizione e viceversa. Esempio: associa lettere a numeri, lettere simili a numeri adiacenti e sommale per ogni lettera in parola. Quindi crea tabelle hash con set per ogni chiave e trova l'intersezione per parola.

Potrebbe essere possibile ottenere alcuni risultati se si guarda allo "spazio" di parole. X per cambiare la lettera, Y per aggiungere / rimuovere, Z per la transizione o qualcosa del genere.

Tuttavia, si tratta solo di idee astratte, non ho abbastanza tempo per attuarle.


Questo è ciò che fa Soundex en.wikipedia.org/wiki/Soundex
rgrig

4

O(log(n))O

Non memorizzare le stringhe nell'albero della metrica. Basta memorizzare un indice e memorizzare le stringhe in un albero Patricia.

Non sono sicuro quale albero dovresti usare. Dipenderà dai tuoi dati e dai tuoi requisiti (hai bisogno di un inserimento veloce?). Aggiorna la tua domanda se scopri che un albero è più efficiente degli altri.

Puoi anche consultare strumenti specializzati, come lucene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.