Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Esercitazioni linguistica computazionale, Dispense di Linguistica

Esercitazioni linguistica computazionale - prof. Felice Dell'Orletta

Tipologia: Dispense

2018/2019

Caricato il 28/01/2019

xph.je
xph.je 🇮🇹

4.5

(11)

10 documenti

1 / 28

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
!
2!
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’ “715.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’
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c

Anteprima parziale del testo

Scarica Esercitazioni linguistica computazionale e più Dispense in PDF di Linguistica solo su Docsity!

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:

  • Create un file di testo in inglese lungo almeno 1000 token.
  • Utilizzando le funzioni di NLTK e le funzioni di base del Python scrivete un programma che: o stampi tutti i bigrammi “(u, v)” diversi presenti all’interno del file e per ogni bigramma ne stampi: § la frequenza dei token “u” e “v” e la frequenza del bigramma “(u, v)”; § la probabilità condizionata P(v|u); § la probabilità congiunta P(u,v);

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

Alphabetical list of part-of-speech tags used in the Penn Treebank Project:

Number Tag Description

1. CC Coordinating conjunction

2. CD Cardinal number

3. DT Determiner

4. EX Existential there

5. FW Foreign word

6. IN Preposition or subordinating conjunction

7. JJ Adjective

8. JJR Adjective, comparative

9. JJS Adjective, superlative

10. LS List item marker

11. MD Modal

12. NN Noun, singular or mass

13. NNS Noun, plural

14. NNP Proper noun, singular

15. NNPS Proper noun, plural

16. PDT Predeterminer

17. POS Possessive ending

18. PRP Personal pronoun

19. PRP$ Possessive pronoun

20. RB Adverb

21. RBR Adverb, comparative

22. RBS Adverb, superlative

23. RP Particle

24. SYM Symbol

25. TO to

26. UH Interjection

27. VB Verb, base form

28. VBD Verb, past tense

29. VBG Verb, gerund or present participle

30. VBN Verb, past participle

31. VBP Verb, non-3rd person singular present

32. VBZ Verb, 3rd person singular present

33. WDT Wh-determiner

34. WP Wh-pronoun

35. WP$ Possessive wh-pronoun

36. WRB Wh-adverb

37.. punctuation mark, sentence closer

38. , punctuation mark, comma

39. : unctuation mark, colon

40. ( contextual separator, left paren

41. ) contextual separator, right paren