Compito N. 1: Soluzioni 1) Che differenza c'e' tra le seguenti due espressioni regolari? [1/4 di punto] ..a$ ^.*..a$ R: Nessuna: entrambe trovano righe di almeno 3 caratteri che finiscono con a. 2) Che righe tolgo da un file con il seguente comando? (Ossia, che righe non soddisfano l'espressione regolare specificata?) [1/4 di punto] egrep "...." file.txt R: Tolgo le righe con meno di 4 caratteri (tengo le righe di almeno 4 caratteri). 3) Scrivere delle espressioni regolari che corrispondano alle seguenti descrizioni: [1/2 punto per ciascuna espressione regolare] a. Righe di qualsiasi lunghezza che inizino e finiscano con sequenze di due consonanti adiacenti. R: ^[^aeiou][^aeiou].*[^aeiou][^aeiou]$ b. Righe di quattro o piu' caratteri che inizino con p o con t o con k. R: ^[ptk]... c. Righe di tre o piu' caratteri che contengano almeno una p o una t o una k, ma non all'inizio ne' alla fine. R: ^[^ptk].*[ptk].*[^ptk]$ d. Righe di qualsiasi lunghezza che comincino con la stringa pre e contengano almeno due vocali (la e di pre inclusa). R: ^pre.*[aeiou] 4) Quante parole di 3 lettere ci sono nel Brown e quante nel LOB? In proporzione ci sono piu' parole di 3 lettere nel Brown o nel LOB? (Mostrare i passaggi seguiti per ottenere i dati riportati; naturalmente, per calcolare le proporzioni potete usare un calcolatore.) [1 punto] R: NB: Ci possono essere differenze numeriche nelle risposte, dovute a tokenizzazioni diverse. L'importante e' seguire la procedura giusta. Trovo e conto le parole di 3 lettere nei due corpora tokenizzati: $ egrep "^...$" brown.tok | wc 216258 216258 865032 $ egrep "^...$" lob.tok | wc 215546 215546 862184 Dunque, ci sono piu' parole di 3 lettere nel Brown. Per calcolare le proporzioni, ho bisogno del numero di parole totali nel Brown e nel LOB. Dunque, conto le parole nei due corpora tokenizzati: $ wc brown.tok 1025374 1025374 5775243 brown.tok $ wc lob.tok 1017404 1017404 5625364 lob.tok Adesso calcolo le proporzioni con un calcolatore: Brown: 216258/1025374=.2109064594 LOB: 215546/1017404=.2118588092 In proporzione, le parole di tre lettere sono (leggermente) piu' frequenti nel LOB. 5) Tokenizzare le novelle di Pirandello seguendo il modello a p. 19 dell'handout Unix per Linguisti, ma tenendo i numeri, eliminando gli apostrofi e convertendo tutto in minuscolo. (Riportare la serie di comandi usati.) [1/2 punto] R: $ cat cl_shared_data/novelle/*_* | sed "s/[^a-zA-Zאטילעש0-9]/\n/g" |\ egrep -v "^$" | lc > novelle2.tok (Naturalmente il \ non serve: l'ho aggiunto qui per evitare una riga troppo lunga.) 1 punto extra: Quante parole (tipi) con frequenza 1 (ossia, che capitano una sola volta) ci sono nel Brown? Quante sono, in proporzione, rispetto al numero totale di parole distinte (tipi)? (Riportare i comandi usati.) R: Se non ce l'ho gia', creo una lista di frequenza: $ sort brown.tok | uniq -c > brown.fq Cerco le parole con frequenza 1 usando egrep (e basandomi sul fatto che i soli caratteri che non sono nell'insieme [a-z0-9] in brown.fq devono essere gli spazi): $ egrep "^[^a-z0-9]*1[^a-z0-9]" brown.fq | wc 15876 31752 272102 OPPURE (meglio) uso gawk: $ gawk '$1==1' brown.fq | wc 15876 31752 272102 Per calcolare la proporzione, ho bisogno del numero di parole distinte nel Brown, ovvero: $ wc brown.fq 41507 83014 695547 brown.fq Dunque: 15876/41507=.3824897005 Ovvero, piu' di un terzo delle parole del Brown capitano una sola volta!