5

Sto cercando di implementare la previsione analizzando le frasi. Si consideri il seguente [piuttosto noioso] frasiStruttura dati per la memorizzazione delle associazioni di parole

Call ABC 
Call ABC again 
Call DEF 

Mi piacerebbe avere una struttura dati per le frasi di cui sopra come segue:

Call: (ABC, 2), (again, 1), (DEF, 1) 
ABC: (Call, 2), (again, 1) 
again: (Call, 1), (ABC, 1) 
DEF: (Call, 1) 

In generale, Word: (Word_it_appears_with, Frequency), ....

Si prega di notare l'intrinseca ridondanza in questo tipo di dati. Ovviamente, se la frequenza di ABC è 2 su Call, la frequenza di Call è 2 su ABC. Come ottimizzo questo?

L'idea è di utilizzare questi dati quando si digita una nuova frase. Ad esempio, se è stato digitato Call, dai dati, è facile dire che ABC è più probabile che sia presente nella frase e offrirlo come primo suggerimento, seguito da nuovo e DEF.

Mi rendo conto che questo è uno dei milioni di possibili modi di implementare la previsione, e attendo con impazienza suggerimenti su altri modi per farlo.

Grazie

+0

Sono abbastanza sicuro che non ci sia una risposta ben stabilita perché il tuo obiettivo non è abbastanza tangibile. Fondamentalmente, si tratta di un problema di intelligenza artificiale, e le soluzioni di intelligenza artificiale di solito hanno i loro capricci che le persone possono convivere con; tuttavia, senza conoscere il tuo contesto esatto, è difficile dire quali stranezze sarebbero accettabili. Per questo motivo, sto votando per chiudere la tua domanda. (È molto interessante, a mio parere non è adatto per Stack Overflow.) – zneak

+0

Detto questo, puoi usare una rappresentazione ad albero per le tue parole e avere ogni ramo dell'albero una probabilità. Questo potrebbe funzionare bene se l'input è ripetitivo e la sintassi relativamente fissa, ma avrai problemi ad abbinare il linguaggio naturale in questo modo. – zneak

+0

Potrei usare un albero, sì, ma vorrei eliminare la ridondanza nei dati: la frequenza di word1 che si verifica con word2 sarà ovviamente la stessa di word2 che si verifica con word1. Inoltre, l'input è continuo, quindi le probabilità sono fuori questione. – WeNeigh

risposta

1

Forse utilizzando un grafico bidirezionale. È possibile memorizzare le parole come nodi, con i bordi come frequenze.

0

È possibile utilizzare la seguente struttura di dati troppo:

Map<String, Map<String, Long>> 
+0

Guava lo ha implementato nella classe Table. http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/collect/Table.html –

+0

@JohnB, questo è bello sapere. Grazie per le informazioni. –

0

vorrei prendere in considerazione una delle due opzioni:

Opzione 1:

class Freq { 
    String otherWord; 
    int freq; 
} 

Multimap<String, Freq> mymap; 

o forse un tavolo

Table<String, String, int> 

Alla luce di quanto sopra Freq: si potrebbe desiderare di fare la mappatura bidirezionale:

class Freq{ 
    String thisWord; 
    int otherFreq; 
    Freq otherWord; 
} 

Ciò consentirebbe di molto rapido aggiornamento dei coppie di dati.