Ordina le frasi con nuove parole in ognuna

1

Uno strumento di apprendimento molto utile in cui mi sono imbattuto per il cinese era una massiccia lista di frasi che, tranne i primi 10 o 15, differivano solo da quelle precedenti con una o due parole , o almeno il meno possibile: il creatore li ha ordinati per relazione, ovviamente iniziando con poche frasi standard per impedire che i primi fossero casuali e complessi.

Sono un po 'confuso su come andare a scrivere la mia implementazione di tale e algoritmo. Ora tieni con me (a meno che tu non abbia smesso di leggere b / c questa domanda è fuori linea per questo sito) come sono stato definito "stupido" da diversi insegnanti ma stavo pensando a questo algoritmo incredibilmente inefficiente:

  • Prendi la prima frase (frase numero uno)
  • Passa ciclicamente da una frase all'altra e conta il numero di parole diverse (diverse dalla prima frase) (passando da ciascuna parola di ciascuna frase) - assegna un numero in una matrice che lo rappresenta.
  • Esegui nuovamente il ciclo e trova quelli con i numeri associati più bassi
  • Se c'è una frase con il numero più basso di parole diverse - fai che la frase successiva nell'elenco (frase numero due)
  • Se ci sono più frasi, ordinale in base al quale hai più parole nelle prime 1000 parole nella lingua e quindi sono più utili
  • Con le frasi selezionate (con le parole più simili alla frase 1) ordinate per frequenza di parola, scegli quelle o le più frequenti come frasi 2, 3 ecc.
  • Inizia dappertutto controllando la frase successiva nella sequenza con l'ultima combinata con tutte le precedenti per trovare il numero più basso di nuove parole su tutte le frasi

Per un corpus di 100.000 frasi, probabilmente eseguirò un ciclo di milioni di volte per ogni frase. Ci deve essere un modo migliore. Il mio obiettivo generale è il seguente:

Ogni frase nell'array (sequenza, che cosa hai) ha il minor numero possibile di nuove parole, con parole "nuove" definite come quelle non presenti in nessuna frase precedente.

    
posta William Brun 09.04.2015 - 05:20
fonte

2 risposte

0

Potresti considerarlo come un semplice problema di classificazione. Considerare ogni "parola" per essere un simbolo unico in un alfabeto. Per renderlo efficiente, puoi analizzare tutte le tue frasi in token, dove ogni token è un numero univoco che rappresenta una parola unica. L'ordine delle parole è importante? Non hai specificato Se lo fa, ordina le parole (oi token) all'interno di ogni frase. Ora ordina tutte le frasi usando il tuo strumento di ordinamento preferito. Frasi simili saranno naturalmente raggruppate insieme.

D'altra parte, ciò che si può veramente volere non è un singolo elenco ordinato di frasi, ma più elenchi, ognuno dei quali rappresenta un insieme di parole che si trovano comunemente insieme. Ciò è considerevolmente più difficile.

    
risposta data 09.04.2015 - 06:40
fonte
1

Ecco come farei questo in. Net:

pass 1. Crea un dizionario di frasi minuscole con il valore che è l'indice della voce di elenco originale. Puoi utilizzare questa opportunità per eliminare qualsiasi frase duplicata.

pass 2. Crea un dizionario di frequenze di parola. Ordina questo in un elenco.

pass 3. Crea un dizionario di frasi, valore = calcola (posizione parola meno frequente nella lista sopra * lunghezza frase)

pass 4. Crea una lista - Usa Linq per ordinare per calcolo, dal più basso al più alto. - questo potrebbe essere già il tuo elenco

pass 5. Crea un dizionario di primo utilizzo della parola

passaggio 6. Sposta tutte le frasi che contengono più di 2 parole non ancora utilizzate a metà elenco (non spostare i primi 20 o così).

rifai il passaggio 5 e il passaggio 6 fino a quando l'elenco non smette di cambiare o hai fatto abbastanza iterazioni in modo che la lista probabilmente non sarà più migliorata. Forse limitare il numero di iterazioni a 20. Con 100.000 elementi, 20 iterazioni saranno sufficienti per spostare tutto ciò che deve essere lì, alla fine della lista.

Infine, crea un elenco definitivo utilizzando l'elenco e il tuo primo dizionario per fare riferimento all'elenco originale per ripristinare il caso originale.

    
risposta data 13.10.2016 - 18:59
fonte

Leggi altre domande sui tag