TL; DR
Esiste una struttura dati che mi consenta di sincronizzare rapidamente le parole in qualsiasi momento (ad esempio, "foo" corrisponde a "foobar" e "zoofoo") e, idealmente, restituisce un elenco di "caratteri che vengono visualizzati dopo il ago "(es., 'foo' dovrebbe restituire ['b', $]).
Sto implementando un algoritmo che genera parole casuali da un set di allenamento di altre parole.
In termini semplici, è fondamentalmente così:
- Scegli un punto di partenza arbitrario.
- Scegli il suffisso più lungo della parola corrente che è contenuto in almeno altre 2 parole
- Scegli una di quelle parole a caso e aggiungi il prossimo carattere al lavoro corrente
- GOTO 2 fino a "prossimo carattere" è EOW
per esempio, se la parola corrente è "tat", alcune opzioni valide sarebbero "potato" e "tattoo"; se la parola corrente è "ophtalmi", l'unica opzione è "ophtalmic", quindi cerchiamo se alcune parole contengono "phtalmi", "htalmi", "talmi" e così via.
Ho provato un paio di implementazioni: in uno, ho usato un trie popolato con ogni suffisso di ogni parola. Questo è molto veloce nel generare parole, ma il popolamento del trie è MOLTO lento (~ 4 milioni di parole non sono terminate in oltre 10 ore).
In un altro, ho generato un hash di:
for word in words:
for suffix in tails(words):
for prefix, suffix in prefixes(words): # prefixes("foo") = [("f","oo"),("fo","o"),("foo","")]
ngrams[prefix].add(suffix) # this is a set
ed è molto più veloce nella lettura del set di allenamento, e molto veloce nel generare, ma richiede molta RAM.
E, infine, l'opzione stupida, della semplice ricerca
candidates = [word for word in words if string in words]
che richiede pochissima memoria, ma è molto più lento.
Esiste una struttura dati con il comportamento di cui ho bisogno?