Per un progetto completamente divertente, desidero scrivere un bot di chat della catena di Markov .
L'algoritmo utilizzato è abbastanza semplice: suddividere le frasi in entrata in token, memorizzando quali parole tendono a venire dopo ogni token (con forse un "peso" quando viene introdotto più uso). Ciò significherebbe che, in media, una frase occuperebbe il doppio della lunghezza in quanto è suddivisa in coppie.
Esempio:
The quick brown fox jumps over the lazy dog =>
The: quick,
quick: brown,
brown: fox,
fox: jumps,
...etc
Se una parola in entrata corrisponde a qualcosa che ho già, allora la parola successiva viene aggiunta a quella chiave, e continuiamo da un valore casuale con quella chiave.
Ho bisogno di memorizzare questi set K / V in qualche modo dove posso cercare molte parole molto velocemente. Per la nostra frase di prova di cui sopra, ho bisogno di guardare attraverso il mio corpo intero da qualche parte nel quartiere di nove volte. Cioè, faccio scorrere la frase in arrivo, la tokenize e la memorizzo, quindi cerco ogni parola in ordine, recupero un valore casuale dalla chiave corrispondente e proseguo fino a qualche limite di lunghezza arbitrario.
Principali sfide in ordine di importanza:
-
Velocità di ricerca : l'umorismo nelle chat testuali è spesso basato sui tempi, quindi ho bisogno della capacità di eseguire rapide ricerche su potenzialmente centinaia di megabyte di dati in testo semplice.
-
Resilienza dei dati : avendo eseguito prima uno di questi bot, posso dirti che le community tendono a innamorarsi della "personalità" del loro bot. Dovendo asportare grandi parti del corpus a causa della corruzione è qualcosa che vorrei evitare se possibile. Ciò sembrerebbe eliminare la maggior parte dei metodi di archiviazione o compressione binari ingenui.
-
Utilizzo della memoria : mentre potrei, per esempio, in Python, tenere un enorme oggetto dizionario annidato in memoria e metterlo sottocosto / depistilo all'arresto / avvio, questo sembra il tipo di soluzione ingenua che risulterebbe in esilarante utilizzo della memoria in breve tempo. Anche se non ho un limite difficile qui, mi piacerebbe essere in grado di eseguirlo su, ad esempio, un AWS T2.micro o nei dintorni.
L'accuratezza non è un problema enorme. Se sto esaurendo una quantità arbitraria di tempo, e ho bisogno di terminare una ricerca in anticipo e prendere semplicemente la "cosa migliore", ad esempio il mio iteratore è in piedi nel momento in cui scade il tempo, è accettabile (e probabilmente sarebbe anche un po 'divertente)
L'uso di un database esterno di qualche tipo come Redis o Elasticsearch non è completamente fuori discussione, ma vorrei evitarlo se non è assolutamente lo strumento migliore per il lavoro.
Come potrei strutturare e affrontare al meglio questo elenco di parole chiave / valore in continua crescita in modo che soddisfi i requisiti?