




















Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Esercitazioni linguistica computazionale - prof. Felice Dell'Orletta
Tipologia: Dispense
1 / 28
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





















Classe di caratteri un insieme di caratteri tra parentesi quadre è una RE che definisce una classe di caratteri disgiunti. RE Definizione Esempi di “matching” r’[st]’ il carattere ‘s’ o il carattere ‘t’ “la sintassi” “il tempo” r’[1234567890]’ qualsiasi cifra “ 2 parole” r’[Ll]inguistica’ ‘linguistica’ o ‘Linguistica’ “la Linguistica Computazionale” “la linguistica computazionale” ATTENZIONE! Una classe di caratteri corrisponde sempre ad un solo carattere ‘[st]’ il carattere ‘s’ o ‘t’ “la sintassi” “il tema” ‘st’ la stringa ‘st’ “la sintassi” “il tema” ‘[123]’ il carattere ‘1’ o ‘2’ o ‘3’ “7 1 5.478” ‘123’ la stringa di caratteri ‘123’ “715.478” “674. 123 ” Dentro una classe di caratteri è possibile specificare un intervallo di caratteri in una scala usando ‘-‘: RE Definizione Esempi di “matching” r’[a-z]’ qualsiasi lettera minuscola “la sintassi” “il Tempo” r’[0-9]’ qualsiasi cifra “ 2 parole” r’[a-zA-Z]’ qualsiasi lettera minuscola o maiuscola “la Linguistica” “la linguistica” Dentro una classe di caratteri è possibile specificare che un pattern non deve contenere un certo carattere usando il segno ‘^’: RE Definizione Esempi di “matching r’[^a-z]’ qualsiasi carattere diverso da una lettera minuscola “la Sintassi” “il 25%” “il_tempo” r’[^st]’ qualsiasi carattere che non sia ne’ ‘s’ ne’ ‘t’ “2 parole” “ssss” ATTENZIONE! ‘^’ ha valore negativo solo quando compare subito dopo la ‘[‘ ‘[2^]’ il carattere ‘2’ o ‘^’ “3^5” Alcune utili abbreviazioni per classi di caratteri RE Classe di caratteri equivalente r’\d’ r’[0-9]’ r’\w’ r’[a-zA-Z0-9_]’ r’\s’ r’[ \t\n]’ r’\D’ r’[^0-9]’ r’\W’ r’[^a-zA-Z0-9_]’ r’\S’ r’[^ \t\n] ’ Caratteri particolari: \t tabulazione \n a capo Alternativa L’operatore “|” esprime la disgiunzione tra due RE (operatore di alternativa) RE Definizione Esempi di “matching” r’cane|gatto’ la stringa ‘cane” oppure la stringa “gatto” “il cane abbaia” “il gatto miagola” ATTENZIONE! ‘[..]’ esprime solo la disgiunzione tra caratteri singoli ‘[abc’] il carattere ‘à o ‘b’ o ‘c’ La disgiunzione tra stringhe deve essere espressa con l’operatore di alternativa ‘ab|c’ la stringa ‘ab’ o il carattere ‘c’
Moltiplicatori I seguenti simboli sono usati in una RE per specificare quante volte deve comparire il carattere che li precede immediatamente: r’?’ “il carattere precedente è opzionale (occorre 0 o 1 volta)” r’’ “il carattere precedente occorre 0 o n volte” (Kleene Star) r’+’ “il carattere precedente occorre 1 o n volte” RE Definizione Esempi di “matching” r’ba?rio’ la stringa ‘brio’ o ‘bario’ (la a è opzionale) “brio” “bario” “berio” r’tokens?’ l’ultimo carattere ‘s’ è opzionale “token” “tokens” “tokened” r’ba’ il carattere ‘b’ seguito da 0 o n ‘a’ “b” “ba” “baaa” r’[0-9]*’ un numero infinitamente lungo, composto da 0 a n cifre
“la repubblica” r’[0-9][0-9]*’ un numero infinitamente lungo che deve contenere almeno una cifra
“la repubblica” r’[0-9]+’ un numero infinitamente lungo che deve contenere almeno una cifra
r’ba+’ il carattere ‘b’ seguito da 1 0 n ‘a’ “ba” “baa” “baaaaa” Moltiplicatori avanzati : ‘{n,m}’ “il deve occorrere almeno n volte e al massimo m volte” ‘{n,}’ “il deve comparire almeno n volte” ‘carattere>{n}’ “il deve comparire esattamente n volte” RE Definizione Esempi di “matching” r’a{2,3}b’ la stringa formata da almeno 2 ‘a’ e al massimo da 3 ‘a’ seguita da una ‘b’ “aab” “aaaab” “ab” “aaaab” r’a{2}b’ la stringa formata da esattamente 2 ‘a’ e una b “aab” “ab” “aaab” La funzione re.sub(Pattern, Repl, String) Restituisce la stringa String dove il pattern (se presente) viene sostituito dalla stringa Repl. re.sub(Pattern, Repl. String, Int) aggiungendo l’intero Int, si esprime la volontà’ di sostituire solo le prime Int ripetizioni (partendo da sinistra) di Pattern all’interno di String. import sys import re for line in sys.stdin: NuovaLine=re.sub(r’RE’, ‘re’, line) print NuovaLine esempi: Pattern Repl String NuovaStringa r’è’ “e’” “... non so il perché” “... non so il perche'” r’ab*c’ ‘ad’ “abbbbbbc” “ac” “ad” “ad” r’a’ r’a' ‘i’ ‘i’ (int=1) “cavallo” “cavallo” “civillo” “civallo”
E’ possibile rendere i moltiplicatori “pifri” (lazy) facendoli seguire dal carattere “?” Fanno matching con la stringa piu’ corta possibile r’a.*?c’ “a xxx c xxx c xxx d” “a xxx c xxx c xxx d” Raggruppamento e memoria Le parentesi tonde (seguite dai simboli ‘?:’) servono per raggruppare stringhe di caratteri da moltiplicare: RE Definizione Esempi di “matching” r’(?:ab)+’ Una o piu’ stringhe “ab” “ab” “abab” “ababab” r’ab+’ Una “a” seguito da una o piu’ “b” “ab” “abb” “abbb” Le parentesi tonde (senza ‘?:’) memorizzano la stringa di testo corrispondente al contenuto delle parentesi:
la stringa viene memorizzata in una variabile temporanea
il contenuto della variabile può essere richiamato con \ output: 17/10/2013, 12/ 10 /2013, 30/05/1977, 40- 12 - 2013 Caratteri speciali Alcuni caratteri hanno un significato speciale nel linguaggio delle RE [ ]? *. ( ) + - / { } Se questi caratteri fanno parte del pattern di testo da cercare, devono comparire in una RE con davanti il carattere ‘\’ (carattere escape)
r’[a’ Errore! ‘[‘ e’ interpretato come classe di carattere e manca la parentesi ‘]’
r’[a’ la stringa “[a”
r’a.’ qualsiasi stringa di due caratteri che inizia con ‘a’
r’a.’ la stringa di testo “a.”
r’cane?’ le stringhe “cane” e “can”
r’cane?’ la stringa “cane?” Ancore Le ancore sono caratteri speciali che specificano dove deve comparire il pattern di testo da cercare
‘^’ il deve comparire all’inizio di una linea
‘$’ il deve comparire alla fine di una linea RE Definizione Esempi di “matching” r’cane$’ La stringa ‘cane’ quando compare alla fine di una linea “…cane¶” “il cane di Mario” r’^La’ La stringa ‘La’ quando compare all’inizio di una linea “ ¶ La macchina era guasta” “il treno per La Spezia” r’^La Spezia$’ Una riga che contiene solo la stringa “La Spezia” “ ¶ La Spezia ¶ ” “a La Spezia per lavoro…” “/b” e’ un ancora che indica il confine di una parola (“/B” indica ogni punto non confine di parola) Il confine di una parola e’ un punto che ha da una parte un carattere di classe \w e dall’altra o un carattere di classe \W o l’inizio (fine) riga RE Definizione Esempi di “matching” r’\bcane\b’ La stringa ‘cane deve avere a destra e a sinistra un confine di parola “il cane e’ …” “ il canestro” “le americane sono” R’\Bcane\b La stringa ‘cane’ deve avere a destra (ma non a sinistra) un confine di parola “il cane e’ … ” “il canestro” “le americane sono” Precedenza I moltiplicatori, le parentesi, l’alternativa, le ancore sono operatori e permettono di costruire RE complesse a partire da altre RE. Esistono delle regole di precedenza tra gli operatori Le parentesi ( ) permettono di alterare l’ordine di precedenza r’a|b+’ vs. r’(?:a|b)+’ Esercizi : Formalizzare con le espressioni regolari i patterns per trovare le seguenti stringhe:
“Tutti i numeri con o senza punto o virgola (es. 10.000 0,56 45 ecc.)” r'\d+[.,]?\d+|\d'
“Le parole in fondo ad una linea di testo che terminano per sto o per sito” r'\w*si?to$'
“I punti di fine frase che compaiono in fondo ad una linea di testo”
Python: leggere un file di testo Per aprire un file di testo in Python si usa la classe codecs ed il suo metodo open() : Il programma di aspetta un parametro (un file di testo in questo caso) codecs permette di gestire file con diverse codifiche (per l’italiano di solito si usa l ’utf-8I) Il metodo read() serve per leggere il file ed assegnare tutto il suo contenuto ad una variabile di tipo String (raw nell’esempio sopra) Il metodo (dell’oggetto di tipo String ) encode() serve per trasformare una stringa: dal formato interno che usa il python, nel formato scelto (utf-8 nel nostro caso) Output del programma: il sistema non ha alcuna conoscenza linguistica Python e NLTK: Sentence Splitter Per dividere un testo inglese in frasi con NLTK si applica la funzione tokenize(String). Che utilizza un modello statistico presente nella distribuzione ufficiale di NLTK: english.pickle in tokenizers/punkt/. nltk.data.load(modello) , serve per caricare il modello statistico
output La funzione prende in input una stringa (tutto il testo) e restituisce una lista di stringhe (le frasi): Python e NLTK: Tokenizzatore Per dividere le frasi in parole si usa la funzione word_tokenizer.tokenize(String) , che prende in input una stringa (la frase) e restituisce una lista di stringhe (i token della frase). output
- len(L) – restituisce il numero di elementi della lista L, es: L=[“a”, “b”, “a”, “a”, “e”, “f”], len(L)== - L.count(elemento) – restituisce il numero di occorrenze di elemento nella lista L, es: L=[“a”, “b”, “a”, “a”, “e”, “f”], L.count(“a”)== NB: in Python le stringhe possono essere trattate come liste (ad eccezione del fatto che le liste possono contenere qualsiasi cosa, mentre le stringhe solo caratteri), quindi tutte le funzioni viste fino ad ora valgono anche per le stringhe, es: S=”casa” Len(S)==4 S.count(“a”)== Calcolare e confrontare la lunghezza in token di due file di testo: Esercizio - Creare due file contenenti testo in inglese. - Realizzare un programma che: o stampi la divisione in frasi dei due file e per ogni frase stampi il testo tokenizzato; o stampi i token diversi contenuti in ogni singolo file ordinati alfabeticamente; o confronti tra loro i due file rispetto a: § il numero di frasi; § il numero di token; § il numero di token diversi contenuti in ogni singolo file. NB: l’output del programma deve essere ridiretto all’interno di un file.
Calcolare la lunghezza di un corpus |C| : output sys.argv[0] sys.argv[1] print “Il file”, file1, “e’ lungo”, lunghezza1, “token” Trovare il token con frequenza massima: output sys.argv[0] sys.argv[1] print “Il token piu’ frequente e’:”, tokenMAX, ‘\tcon frequenza:”, freqTokenMAX
Python: le Tuple Una tupla e’ simila ad una lista con differenza: e’ un tipo non mutabile , cioe’ non e’ possibile aggiungere, modificare o togliere elementi ad una tupla. http://docs.python.org/tutorial/datastructures.html Stampare I bigrammi diversi di un testo e trovare il bigramma con frequenza massima: (programma) output … …
Trovare il bigramma con Probabilita’ condizionata massima: (programma) output Con il comando: print “Il bigramma con Prob Condizionata massima nel file”, file1, “e’:”, bigrammaMAX, “con Probabilita:”, probCondizionataMAX Stampata la struttura dati Bigramma (o Tupla) bigrammaMAx Per stampare solo il contenuto: print “Il bigramma con Prob Condizionata massima nel file”, file1, “e’: \””, bigrammaMAX[0], bigrammaMAX[1], “\” con Probabilita:”, probCondizionataMAX Funzioni Matematiche: il modulo math Il modulo math contiene le funzioni matematiche non direttamente supportate da Python : http://docs.python.org/library/math.html Esercizi:
Python e NLTK: trigrams Per ottenere tutti i trigrammi di un testo si utilizza la funzione trigrams(listaParole) di NLTK: trigrams() prende in input una lista e restituisce una lista di tuple. Ogni tupla rappresenta una trigramma degli elementi della lista di partenza. NB: Da NLTK 3.0 in poi trigrams() NON restituisce una lista ma un oggetto trigrams che puo’ essere trasformato in una lista con la funzione list(). Python e NLTK: Distribuzioni di frequenza (NB: versione NLTK<3.0) Per calcolare la distribuzione di frequenza degli elementi di una lista possiamo utilizzare la funzione FreqDist(lista) Python e NLTK: Distribuzioni di frequenza (NB: versione NLTK>=3.0) Da NLTK FreqDist(lista) rimane uguale, cambia solo in modo di estrarre gli elementi ordinati per frequenza. NB: DA NLTK 3.0 in poi la lista dei primi N elementi ordinati per frequenza si estrae con la funzione most_common(N). Questa funzione restituisce una lista di tuple: (chiave, valore)
Stampare i token ed i trigrammi diversi di un testo ordinati in base alla frequenza: (programma) output
Analisi morfo-sintattica: Part-of_Speech tagging Il part-of-speech tagging e’ il processo di annotazione morfosintattica del testo: ad ogni token viene associata la sua categoria grammaticale. In NLTK tale analisi viene fatta atraverso la funzione nltk.pos_tag() che prende in input una lista di token e restituisce una lista di tuple (coppie) della forma: (token, POS) Input: [“Luca”, “mangia”, “la”, “mela”] Output: [(“Luca”,“NNP”),(“mangia”,“VBZ”),(“la”,“DT”),(“mela”,“NN”),(“.”,”.”)] Nell’analisi dell’inglese le POS utilizzate da NLTK sono state definite nel progetto Penn-treebank project Da NLTK3 per poter utilizzare la funzione pos_tag() deve essere installato il modulo: averaged_perceptron_tagger Python e NLTK: Part-of-Speech tagging output