[Soci SLIP] contare i digrammi

llcfree llcfree a gmail.com
Sab 14 Lug 2012 19:48:47 CEST


On Sat, 2012-07-14 at 18:18 +0200, Andrea Primiani wrote: 
> per un software di scrittura facilitata, ho bisogno di avere delle liste
> di frequenza delle lettere e dei digrammi (coppie di lettere) che il
> programma usa per predire la prossima lettera in base all'ultima inserita.
> 
> Ho trovato un paio di programmini (uno in C e uno in Perl) che leggono
> un testo in input e sputano le statistiche. Funzionano, ma quando gli do
> in pasto il 'Corpus PAISA' <http://www.corpusitaliano.it/> cioe' una
> raccolta di 1,5 GB di testi presi da giornali libri... si bloccano:
> immagino si tratti di problemi legati alle dimensioni delle variabili.
> 
> Un altro problema e' che avrei bisogno anche di conteggiare la frequenza
> dello spazio considerandolo come una lettera.

Parlo per il programmino perl, lo spazio te lo conta gia', il codice
decimale e' 32 ed e' il piu' frequente in un testo, come uno si
aspetterebbe. Se esegui il programma con il parametro -f dovresti
trovartelo al fondo.

Il programma perl legge una riga per volta e percio' non ha problemi di
memoria perche' riusa sempre la stessa variabile $line. Pero' il
risultato lo sputa fuori solo dopo aver letto TUTTO il file di input. Se
il file di input e' 1.5 GB, un pochino mi sa che ci impiega :)

Se vuoi solo sapere se "eppur si muove", aggiungi una riga di poor man
debug dopo il while:

while ($line = <>) {
    print $line;

che ti stampa la riga che sta analizzando. Il programma, per ogni riga,
conta l'occorrenza dei caratteri e la somma a quella delle righe
precedenti, cosi' via fino all'ultima riga. la tabella complessiva la
stampa solo alla fine, se il file e' enorme te la stampa domani :)

Puoi sempre spezzare il file di input in blocchi. Per ogni blocco, ti
salvi la tabella e poi sommi tu le occorrenze dei caratteri per i vari
blocchi. Oppure ti generi un solo blocco di dimensioni sufficienti per
crearti la statistica che ti serve. Per spezzare un file in blocchi puoi
usare il comando split. Per esempio:
    split -l 10 <filename>
ti spezza <filename> in files di 10 righe l'uno (info split o man spllit
per saperne di piu'). I files che genera li chiama x... e li trovi tutti
facilmente dando, da linea di comando:

ls -ltrc

subito dopo il comando split. Siccome sono gli ultimi files "nati" nella
cartella corrente, li trovi in fondo alla lista.

Spero di esser stata sufficientemente chiara.

Loredana

> Qualcuno ha tempo/voglia di dare un'occhiata e suggerire rimedi? Sono un
> dilettante di C e un ignorante di Perl.
> 
> Grazie AP
> _______________________________________________
> Soci mailing list
> Soci a mail.pinerolo.linux.it
> https://liszt.softwareliberopinerolo.org/vecchiamlsoci/






Maggiori informazioni sulla lista Soci