2011-11-29 13 views
5

Sto sviluppando un gestore finanziario nel mio tempo libero con GUI Java e Swing. Quando l'utente aggiunge una nuova voce, viene richiesto di compilare: Moneyamount, Data, Commento e Sezione (ad esempio, Auto, Salario, Computer, Cibo, ...)Analisi e classificazione delle stringhe

Le sezioni vengono create "al volo". Quando l'utente inserisce una nuova sezione, verrà aggiunto alla sezione jcombobox per un'ulteriore selezione. L'altro punto è che i commenti potrebbero essere in diverse lingue. Quindi l'elenco di parole e sinonimi codificati sarebbe enorme.

Quindi, la mia domanda è, è possibile analizzare il commento (ad esempio "Carburante", "Servizio auto", "Pranzo a **") e preselezionare una sezione di raccordo. Il mio primo pensiero è stato, farlo con una rete neurale e imparare dall'input, se l'utente seleziona un'altra sezione.

Ma il mio problema è che non so come iniziare. Ho provato "encog" con Eclipse e ho fatto alcuni tutorial (XOR, ...). Ma tutti usano solo i doppi come in/output.

Chiunque potrebbe darmi un suggerimento su come iniziare o qualsiasi altra soluzione possibile per questo?

Here è un JAR runable (stato di sviluppo attuale, richiede Java7) e il Sourceforge Page

+0

+1 Bella domanda. – gprathour

risposta

1

Dimenticate le reti neurali. Questo è un campo altamente tecnico e specializzato dell'intelligenza artificiale, che probabilmente non è adatto al tuo problema e richiede una solida esperienza. Inoltre, ci sono molte più semplici e migliori soluzioni per il tuo problema.

Prima soluzione ovvia, creare un elenco di parole e sinonimi per tutte le sezioni e analizzare questi sinonimi. È quindi possibile raccogliere commenti online per analisi di sinonimi o utilizzare commenti/sezioni di analisi forniti dai propri utenti per rilevare statisticamente relazioni tra parole, ecc.

Esiste un numero infinito di soluzioni possibili, che vanno dal più semplice al più eccessivo. Ora devi definire se questa caratteristica del tuo sistema è critica (prefillante? Probabilmente no, allora) ... e quali sforzi di sviluppo ti porteranno. Un'ora di lavoro potrebbe portarti una funzionalità soddisfacente all'80%, mentre il 90% del tuo obiettivo costerebbe una settimana di lavoro. Ne vale davvero la pena?

Scegli la soluzione più semplice e affronta la vera sfida di qualsiasi progetto di sviluppo: la consegna. Una volta che la tua app è stata consegnata, puoi sempre tornare indietro e migliorare secondo necessità.

+0

Penso che la lista di parole sarebbe troppo grande, a causa della creazione di sezioni dinamiche e possibile Per una migliore comprensione ci sono collegamenti nel primo post. (JAR + Source) –

+0

Con le nostre macchine moderne, direi che non esiste una lista di parole troppo grande ... Anche un dizionario di sinonimi può facilmente adattarsi alla memoria. – solendil

+0

Sarebbe possibile memorizzare tutte le parole utilizzate nei commenti tranne le parole bloccate (in, e, il, ...) in un DB e quindi assegnare la sezione selezionata ad esso e quando l'utente aggiunge un commento, passare attraverso (il GRANDE DB) e selezionare la sezione in base alle voci per le parole? Penso che le prestazioni sarebbero piuttosto basse, a causa della grande quantità di dati. –

0
String myString = new String(paramInput); 

if(myString.contains("FUEL")){ 
//do the fuel functionality 
} 
+0

Vedere il commento alla risposta di GP Singh –

0

In una semplice applicazione, se vi sarà un solo alcune sezioni specifiche nell'applicazione allora si può ottenere stringa dai commenti e controlla se contiene alcune parole chiave e poi in base a ciò cambia il valore di Sezione.

+0

Grazie per tutte le vostre risposte. Ma il problema è che le sezioni sono create "al volo". Quando l'utente inserisce una nuova sezione, verrà aggiunto alla sezione jcombobox per un'ulteriore selezione. Quindi, non è così facile :(L'altra cosa è che i commenti potrebbero essere in diverse lingue –

0

Se si dispone di un sacco di categorie, vorrei usare qualcosa come Apache Lucene dove si poteva indice tutte le categorie con il loro nome e le parole chiave di potenziali/frasi che potrebbero apparire in una descrizione degli utenti. Quindi è possibile eseguire semplicemente la descrizione tramite Lucene e utilizzare la categoria corrispondente come "migliore ipotesi".

P.S. Gli input e gli output della rete neurale saranno sempre doppi o float con un valore compreso tra 0 e 1. Per quanto riguarda l'implementazione dell'accoppiamento di stringhe, non saprei nemmeno da dove iniziare.

+0

Vedere il commento alla risposta di GP Singh –

0

Mi sembra che segue farà:

  • statistiche parola difficile
  • forse una classe che deriva (inglese/spagnolo), che riducono una parola come "pranzi" al "pranzo".
  • un elenco delle più frequenti non-parole (il, a, un, per, ...)

la misura migliore è un problema lineare, adatta in modo teorico per una rete neurale, ma perché non prendere immediatamente il migliore adattamento numerico.

0

Un algoritmo di apprendimento automatico come una rete neurale artificiale non sembra la soluzione migliore qui. Le RNA possono essere utilizzate per la classificazione multi-classe (cioè "a quale delle classi pre-addestrate fornite l'input rappresenta?" Non solo "l'input rappresenta una X?") Che si adatta al tuo caso d'uso. Il problema è che sono metodi di apprendimento supervisionati e in quanto tali è necessario fornire un elenco di coppie di parole chiave e classi (sezioni) che abbracciano ogni possibile input fornito dagli utenti. Questo è impossibile e in pratica le RNA vengono riqualificate quando sono disponibili più dati per produrre risultati migliori e creare un confine/rappresentazione della decisione più accurato della funzione che mappa gli input in output. Ciò presuppone anche che tu conosca tutte le classi possibili prima di iniziare e ognuna di queste classi ha valori di input di formazione forniti.

Il problema è che l'input della propria RNA (un elenco di caratteri o un hash numerico della stringa) non fornisce alcun contesto in base al quale classificare. Non ci sono informazioni di livello superiore a condizione che descriva il significato della parola. Ciò significa che una parola diversa da hash a un valore numericamente chiuso può essere classificata in modo errato se non ci sono dati di addestramento insufficienti.

(Come maclema detto, l'uscita da un'ANN sarà sempre galleggianti a ciascun valore rappresenta vicinanza a una classe -. O una classe con un livello di incertezza)

Una migliore soluzione sarebbe quella di impiegare un certo genere di parole-relazioni o sinonimi. A Bag of words model potrebbe essere utile qui.

Modifica: Alla luce del tuo commento che non conosci le Sezioni prima mano, una soluzione facile da programmare sarebbe quella di fornire un elenco di parole chiave in un file che viene aggiornato man mano che le persone usano il programma. Semplicemente memorizzando una mappatura dei commenti forniti -> Sezioni, che avrete già nel vostro database, vi permetterebbe di filtrare le parole chiave non-chiave (e, o, il, ...). Un'opzione è quindi trovare un elenco di ogni sezione a cui appartengono le parole chiave digitate e suggerire più sezioni e consentire all'utente di sceglierne una. Il feedback che ottieni dalle selezioni dell'utente consentirebbe di migliorare i suggerimenti in futuro. Un altro sarebbe quello di calcolare un Bayesian probability - la probabilità che questa parola appartenga alla Sezione X dato i precedenti mapping memorizzati - per tutte le parole chiave e le Sezioni e prendere la sezione modale o normalizzare su ogni parola chiave univoca e prendere la media. I calcoli delle probabilità dovranno essere aggiornati man mano che raccogli maggiori informazioni sul corso, forse questo potrebbe essere fatto con ogni nuova aggiunta in un thread in background.

Problemi correlati