«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo

martedì 10 febbraio 2015

La tragedia R

È da sabato che non sto più riguardando la tragedia: mi serviva una pausa per poterla rileggere in maniera un po' distaccata.
Non è stato facile: la tentazione di pubblicarla sabato 14 era (è) forte...
Allora per ingannare l'attesa mi sono “divertito” a fare un programmino col linguaggio R il cui scopo è quello di contare le occorrenze di ogni singolo vocabolo. Lo scopo era verificare quali fossero le parole usate più spesso ed, eventualmente, inserire qualche sinonimo...

Fino a poche settimane fa non conoscevo il linguaggio R: l'ho notato fra i corsi gratuiti che seguo su Coursera.org e mi sono incuriosito.
Si tratta di un linguaggio orientato alla statistica i cui scopi principali sono (oltre all'analisi statistica!) la ricerca dei dati da più fonti e la produzione di grafici: con un solo comando è possibile connettersi a pagine in rete, caricare un archivio in formato cvs, etc... Analogamente per i grafici, con un solo comando, si ottengono risultati spettacolari.

Così mi sono iscritto al corso di “Programmazione in Linguaggio R” dell'università John Hopkins.
Di solito non ho nessun problema a imparare un nuovo linguaggio di programmazione e per questo ero convinto che, seguendo addirittura un corso, sarebbe stata una passeggiata.
E invece no!
Il linguaggio R mi sta dando delle grane inaspettate e sono molto tentato di lasciarlo perdere....

I motivi sono due, forse tre (c'è un po' di sovrapposizione!).
1. Il linguaggio stesso. Da una parte (per facilitare il lavoro degli statistici) funzioni e operazioni si possono applicare direttamente a matrici e vettori: probabilmente per chi ha confidenza col linguaggio è una comodità ma io mi ritrovo costantemente con i dati nel formato sbagliato e ho grossi problemi a manipolarli per ottenere quello che voglio.
2. Il linguaggio stesso. È uno di quei linguaggi con migliaia di funzioni che fanno qualsiasi cosa. Il problema è trovare la funzione giusta e capire come funziona.
3. Il corso. Non era un corso per informatici e l'approccio al linguaggio era di tipo pratico. Ovvero si procedeva più per esempi che in maniera strutturata. Probabilmente per la maggioranza degli studenti questa era la maniera più facile per procedere ma io, abituato a leggermi un manuale dall'inizio alla fine (tipi primitivi, operazione, struttura, scooping, etc) facevo fatica a inserire nel giusto contesto informatico le varie nozioni.
4. Il corso. Essendo un corso video non potevo fare copia e incolla dei vari esempi: in genere quando imparo un nuovo linguaggio mi tengo in un archivio tutti gli esempi che incontro (con eventuali miei esperimenti) e da lì, quando ne ho la necessità, ritrovo rapidamente il comando o la funzione che mi servono. In questo caso invece, pur capendo i concetti, perdo un sacco di tempo a ritrovare i dettagli che mi interessano...

C'è da aggiungere che ho seguito solo la prima lezione e poi, stufo del metodo, ho iniziato a fare programmi per mio conto.
Prima ho provato a fare l'esercitazione della prima lezione: a forza di insulti sono riuscito a far funzionare tutto ma è stata una battaglia!
Poi ho provato a realizzare il programma per contare le occorrenze di ogni singola parola nel testo della mia tragedia: per scrivere una quarantina di linee di codice mi ci è voluto due giorni (direi quindi sulle 4-5 ore...)
Per ogni operazione che volevo fare dovevo effettuare una ricerca su Google; copiavo il codice e provavo a lanciarlo con risultati sempre imprevedibili; correzioni o aggiustamenti del tipo di dati e nuova ricerca su Google per il passo successivo: un vero tormento...

Chi è interessato può scaricare il mio codice qui (LeggiTesto.R) (*1)...
Comunque alla fine ho ottenuto quello che volevo.

Le dieci parole più usate sono:
[1,] "485" "e"
[2,] "396" "di"
[3,] "360" "il"
[4,] "327" "la"
[5,] "319" "Andros"
[6,] "304" "che"
[7,] "274" "non"
[8,] "218" "è"
[9,] "197" "a"
[10,] "180" "mi"

Piuttosto prevedibilmente!
Risultati più interessanti si trovano oltre la settantesima posizione; qualche esempio:
[74,] "030" "morte"
[79,] "027" "cuore"
[83,] "027" "uomini"
[87,] "025" "uomo"
[93,] "023" "parole"
[94,] "023" "vita"
[97,] "022" "amore"
[99,] "022" "sangue"
[100,] "022" "voce"
[106,] "021" "tempo"

Però prima di usare i dati ottenuti dovrei fare una piccola correzione al codice che considera le parole in maiuscolo diverse da quelle in minuscolo.

Conclusione: ho ottenuto quello che volevo ma il programma è lentissimo (*2) (non ho preso il tempo ma siamo sull'ordine dei 10 minuti!) e non mi sono divertito a farlo, anzi...
La tentazione è sempre quella di lasciar perdere e, contemporaneamente, sono curioso di riscrivere lo stesso programma in Java (non particolarmente veloce) per vedere quanto ci mette a fare lo stesso lavoro!

Nota (*1): il codice fa schifo ed è inefficiente: lo so già! Molte linee commentate (e non!) sono inutili, il nome dell'archivio di testo (e il suo percorso) sono hard-coded, etc... Comunque, nonostante questi limiti, chi ha pratica di programmazione può dargli un'occhiata e farsi un'idea del linguaggio...
Nota (*2): sicuramente io non ho scritto del buon codice ma comunque il tempo complessivo mi pare lo stesso un'enormità...

Nessun commento:

Posta un commento