Oppure

Loading
24/02/15 14:19
Tinwor
Lavorando a stretto contatto nel mondo dell'IoT mi è venuta la malsana idea(più che altro è una martellata in testa) di codificare un'applicazione che permette l'input di linguaggio natuale, e.g. Jemma open the door(lingua scelta è l'Inglese per la relativa semplicità della grammatica), e una volta riconosciuto il comando viene inviata una richiesta via API al framework in questione.
E fino a questo punto ci arrivo senza troppi problemi. Visto che l'applicazione è leggera e non consuma troppe risorse mi è venuta un'idea ancora peggiore: "se l'utente sbaglia l'input, ad esempio doorluck anzichè doorlock, perchè non posso implementare qualcosa che gli consiglia la parola che più si avvicina?"
Ho pensato di implementare l'algoritmo di Levenshtein e poi quello di Sift3 ma ho pensato "dal momento che non è farina del mio sacco perché non posso reinventare la ruota?"
E allora ho dato libero sfogo alla mia fantasia, sono andato in memory leak un paio di volte, e dopo parecchio tempo ho concepito questa idea: perchè non fare una matrice con all'interno la disposizione delle lettere nella tastiera(caricata poi da un file, per comodità l'ho pensato in QWERTY) e dare un peso(costante) ad ogni singola cella?
Esempio: mi aspetto in input S e invece mi Arriva Q. Nella matrice S è situato nella cella [1,1] mentre Q nella cella[0,0]. Dopo essermi calcolato la distanza(|Xq-Xs|+|Yq-Ys| = 2) lo moltiplico per C(la costante) e sommo il risultato in una variabile esterna al ciclo di comparazione.
Esempio ancora più pratico:
Input AWERTY
Diionario interno: QWERTY, QWIRTA, QWEFGH
Prima comparazione: solo una differenza, accettabile, salvo parola e risultato della comparazione in un oggetto(parola ideale? String e int)
Seconda comparazione: due differenze, accettabile? si, comparo il risultato int ottenuto con quello salvato in precedenza? E' maggiore? Si, risultato non accettabile.
E via discorrendo fino a che non ho finito il dizionario(naturalmente comprareò solamente le parole di ugual lunghezza). A questo punto prendo la parola che più si avvicina nel mio dizionario ricompongo la frase e gli scrivo: forse non stavi cercanfo QWERTY?
Avete consigli? Volete chiamare un'ambulanza e farmi ricoverare? Scrivetelo qua sotto :rofl:
aaa
24/02/15 21:25
lumo
Potrebbe interessarti questo:
drdobbs.com/database/ternary-search-trees/…

trovi l'implementazione della struttura dati nella prima pagina
aaa
24/02/15 22:12
Tinwor
Già implementato ma è diventa pesante per sistemi embedded :d
aaa
24/02/15 23:23
Roby94
Postato originariamente da Tinwor:sistemi embedded :d

Estremamente generico, un sistema embedded non è per forza un sistema con poche risorse e bassa potenza di calcolo.
aaa
25/02/15 0:36
lollo 97
Se vuoi creare un chatbot o anche un bot con funzionalità più pratiche che non solo conversarci puoi provare AIML, un linguaggio di markup molto semplice da usare e crearne un lettore!

Trovi esempi in C# e vari altri linguaggi..
Qui in C#: sourceforge.net/projects/aimlbot/


aaa
25/02/15 11:50
Ultimo
Postato originariamente da Tinwor:

Lavorando a stretto contatto nel mondo dell'IoT mi è venuta la malsana idea(più che altro è una martellata in testa) di codificare un'applicazione che permette l'input di linguaggio natuale, e.g. Jemma open the door(lingua scelta è l'Inglese per la relativa semplicità della grammatica), e una volta riconosciuto il comando viene inviata una richiesta via API al framework in questione.
E fino a questo punto ci arrivo senza troppi problemi. Visto che l'applicazione è leggera e non consuma troppe risorse mi è venuta un'idea ancora peggiore: "se l'utente sbaglia l'input, ad esempio doorluck anzichè doorlock, perchè non posso implementare qualcosa che gli consiglia la parola che più si avvicina?"
Ho pensato di implementare l'algoritmo di Levenshtein e poi quello di Sift3 ma ho pensato "dal momento che non è farina del mio sacco perché non posso reinventare la ruota?"
E allora ho dato libero sfogo alla mia fantasia, sono andato in memory leak un paio di volte, e dopo parecchio tempo ho concepito questa idea: perchè non fare una matrice con all'interno la disposizione delle lettere nella tastiera(caricata poi da un file, per comodità l'ho pensato in QWERTY) e dare un peso(costante) ad ogni singola cella?
Esempio: mi aspetto in input S e invece mi Arriva Q. Nella matrice S è situato nella cella [1,1] mentre Q nella cella[0,0]. Dopo essermi calcolato la distanza(|Xq-Xs|+|Yq-Ys| = 2) lo moltiplico per C(la costante) e sommo il risultato in una variabile esterna al ciclo di comparazione.
Esempio ancora più pratico:
Input AWERTY
Diionario interno: QWERTY, QWIRTA, QWEFGH
Prima comparazione: solo una differenza, accettabile, salvo parola e risultato della comparazione in un oggetto(parola ideale? String e int)
Seconda comparazione: due differenze, accettabile? si, comparo il risultato int ottenuto con quello salvato in precedenza? E' maggiore? Si, risultato non accettabile.
E via discorrendo fino a che non ho finito il dizionario(naturalmente comprareò solamente le parole di ugual lunghezza). A questo punto prendo la parola che più si avvicina nel mio dizionario ricompongo la frase e gli scrivo: forse non stavi cercanfo QWERTY?
Avete consigli? Volete chiamare un'ambulanza e farmi ricoverare? Scrivetelo qua sotto :rofl:


L'idea mi sembra buona :k:
If ok Then GOTO Avanza else GOTO Inizia