Syllabus laboratorio programmazione

Laboratorio di programmazione “Analisi del testo con Python”

Paolo Monella

Modalità


In assetto laboratoriale, gli studenti partiranno dal testo marcato da loro stessi in TEI XML nel laboratorio di markup, e scriveranno uno script in Python “intorno” a quello specifico markup e agli obiettivi specifici che si prefiggono. Nella prima lezione partiremo dalla programmazione visuale del tutorial Anna ed Elsa di Code.org. Passeremo poi a scrivere codice con l’aiuto dell’ambiente di programmazione IDLE e del modulo lxml di Python. Il testo di riferimento sarà “Il tutorial di Python” di Guido Van Rossum, il creatore del linguaggio, in traduzione italiana (versione 2.3.4, http://docs.python.it/paper-a4/tut.pdf) cui, per le attività relative al modulo lxml, si affiancherà il Tutorial lxml.

Obiettivi

Il software che i corsisti creeranno analizzerà i dati contenuti nel markup. Ad esempio, si potranno calcolare dati quantitativi come il numero di varianti (quante varianti per verso/paragrafo), la distribuzione statistica dei tipi di variante, la lunghezza media dei versi, o realizzare automaticamente elenchi di titoli, varianti o altri fenomeni testuali.

Il trattamento automatico dei testi, infatti, non può limitarsi alla sola impaginazione, per cui il digitale non offre un vero valore aggiunto rispetto alla stampa: a questo fine torna utile la flessibilità di Python, cresciuto molto negli ultimi anni anche perché è diventato “a go-to language for data analysis” (http://news.codecademy.com/why-learn-python/).

Syllabus

ModuloObiettiviAttivitàParagrafi Tutorial
Lunedì 4 marzo, 17:30-19:00 (1h 30')
  • Familiarizzare con l’esecuzione di script
  • Variabili e tipi di dati
  • Perché un laboratorio di programmazione?
  • Introduzione a Anaconda
  • Programmazione visuale: tutorial Programma con Anna ed Elsa (Code.org), esercizi 1-4
  • Scrivere script di poche righe con comandi base e visualizzarne l’output sulla riga di comando
  • Funzioni built-in e argomenti delle funzioni: print()
  • Variabili e tipi di dati: interi, stringhe, liste
3.1
Martedì 5 marzo, 17:00-18:00 (1h)
  • Stringhe e liste
  • Controllo del flusso: i cicli (for)
  • Operazioni sulle stringhe: print(), len(), split(), indicizzazione e concatenazione
  • Operazioni sulle liste: len(), append(), indicizzazione
  • Tokenizzazione e creazione di un dizionario macchina con split() e set()
  • Cicli con for
  • L'indentazione
  • Iterazione sulle liste
3.1; 3.2; 4.2; (5.1); 5.4
Martedì 5 marzo, 18:00-19:00 (1h)
  • Estrarre dati da XML col modulo lxml
  • Introduzione ai moduli in Python: il comando import
  • Importare il modulo lxml
  • Trovare elementi nel file TEI XML prodotto durante il laboratorio di codifica (d’ora in poi “sorgente XML”) con la funzione findall() di lxml
6 (fino a 6.1); vedi il Tutorial lxml
Mercoledì 6 marzo, 17:00-18:00 (1h)
  • Analisi del testo del sorgente XML
  • Cercare determinati elementi nel sorgente XML
  • Creare cicli con for sul risultato della funzione findall()
  • Contare gli elementi che hanno determinate caratteristiche (nome elemento, attributo o contenuto testuale)
  • Lunghezza media dei versi
Vedi il Tutorial lxml
Mercoledì 6 marzo, 18:00-19:00 (1h)
  • (Opzionale) Controllo del flusso: istruzioni condizionali (if)
  • Controllo del flusso con if
4.1
Giovedì 7 marzo, 15:00-16:30 (1h 30')
  • (Opzionale) Leggere e scrivere file
  • Importare dati da un file in sola lettura: open()
  • Leggere le righe di un file: readlines()
  • Scrivere l’output su un file
  • Salvare il risultato dell’analisi testuale in un file di testo esterno
7.2 (escluso 7.2.2)

Materiali

from lxml import etree
ns = {'t': 'http://www.tei-c.org/ns/1.0',               # for TEI XML
        'xml': 'http://www.w3.org/XML/1998/namespace',  # for attributes like xml:id
        'h': 'http://www.w3.org/1999/xhtml'}            # for (X)HTML output
tree = etree.parse('in.xml')
body = tree.findall('.//t:body', ns)
print(body)
<pre">

Per continuare a imparare…

  • Guido Van Rossum, Il Tutorial di Python (già citato sopra; io ho imparato da qui)
  • Stefan Behnel, The lxml.etree Tutorial (già citato sopra)
  • Corso gratis online Python Tutorial di W3Schools
  • Corso gratis online Learn Python 2 di CodeCademy. Riguarda la vecchia versione 2, ma il corso per Python 3 è a pagamento. Una volta imparato Python 2, si possono imparare altrove le (non molte, per noi) differenze tra la versione 2 e la 3 (io su CodeCademy ho imparato JavaScript)
  • Il sito con la documentazione ufficiale di Python
  • La mia email (vedi pagina contatti)! I miei ex studenti mi scrivono email dopo anni, e mi fa sempre molto piacere seguirli nel prosieguo del loro percorso
  • I motori di ricerca! Prova a cercare su un motore di ricerca python split, e troverai una marea di spiegazioni pratiche su come usare la funzione split() in Python:

Gli script che abbiamo creato

Script ciao.py

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 5 12:00:00 2019
@author: Paolo Monella
"""
# 1. Come fare i commenti
# Paolo è sciemo
# 2. Come stampare qualcosa a schermo
print('Ciao')
# 3. Variabili e stampa a schermo
a = 5
# radoppia a
# e stampala
a = a * 2
print(a)
# 4. Concatenare variabili; le liste
# Fuffy
nome='Fuffy'
a = ['riso', 'burro', 'ragu']
print(a)
# 5. Lunghezza di una lista
l = len(a)
print(l)
print(nome + ', hai comprato\
tutti e ' + str(len(a)) + \
' gli ingredienti?')

Script cicli.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Mar  6 17:08:41 2019
@author: Paolo Monella
"""
# 1. Cicli sulle liste
L = ['olio fritto e rifritto',
'frittola',
'frittura di pesce fritto']
for l in L:
print(l)
print('Ho finito')
# 2. Tokenizziamo un testo (dividiamolo in parole) con split()
t = '''
P. VERGILI MARONIS AENEIDOS LIBER PRIMVS
Arma virumque canō, Trōiae quī prīmus ab ōrīs
Ītaliam, fātō profugus, Lāvīniaque vēnit
lītora, multum ille et terrīs iactātus et altō
vī superum saevae memorem Iūnōnis ob īram;
multa quoque et bellō passūs, dum conderet urbem, 5
inferretque deōs Latiō, genus unde Latīnum,
Albānīque patrēs, atque altae moenia Rōmae.
Mūsa, mihī causās memorā, quō nūmine laesō,
quidve dolēns, rēgīna deum tot volvere cāsūs
īnsīgnem pietāte virum, tot adīre labōrēs 10
impulerit. Tantaene animīs caelestibus īrae?
Vergil The Latin Library The Classics Page
'''
P = t.split() # P è una lista con le parole del testo
# 3. Stampiamo una parola per volta
for x in P:
print(x)
# 4. Creiamo l'indice (dizionario macchina) del testo
S = set(P)
print(S) # ...e stampiamolo
# 5. Calcoliamo un indice di varietà lessicale
# WAY A: more clarity, less brevity
ls = len(S) # Width of the text vocabulary
lp = len(P) # Length of the text in words
i = ls / lp # Index of vocabulary variety
# WAY B, more compact
i = len(S) / len(P)
print('Indice di varietà lessicale:' + str(i))

Script myxml.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Mar  6 18:19:05 2019
@author: Paolo Monella
"""
# 1. Importiamo, dal modulo lxml, etree
from lxml import etree
# 2. Stabiliamo un dizionario per i namespace XML
ns = {'t': 'http://www.tei-c.org/ns/1.0', # for TEI XML
'xml': 'http://www.w3.org/XML/1998/namespace', # for attributes like xml:id
'h': 'http://www.w3.org/1999/xhtml'} # for (X)HTML output
# 3. Parsiamo (leggiamo) l'albero XML del file rovaio.xml
tree = etree.parse('rovaio.xml')
# 4. Calcoliamo la lunghezza media, in parole, dei versi della poesia in rovaio.xml
L = tree.findall('.//t:l', ns) # Troviamo tutti gli elementi
nv = len(L) # n(umero) dei v(ersi) della poesia
wordCount = 0 # conta-parole per l'intera poesia
for l in L: # per ogni verso nella lista L di tutti gli della poesia...
tv = l.text # t(esto) di quello specifico v(erso)
LP = tv.split() # lista che contiene le singole parole del verso
npv = len(LP) # npv: numero di parole di quel verso
wordCount = wordCount + npv # aggiungiamo npv al conta-parole
wordAver = wordCount / nv # media delle parole: num. totale parole diviso numero di versi
print('Il numero di parole \
per verso è ', wordAver) # Urrà!