13.07.2015 Views

Text Processing in Python - Agentgroup

Text Processing in Python - Agentgroup

Text Processing in Python - Agentgroup

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Accesso ai s<strong>in</strong>goli caratteriE’ possibile accedere ai s<strong>in</strong>goli caratteriutilizzando gli <strong>in</strong>dici tra parenteisi quadre>>> myStr<strong>in</strong>g = “GATTACA”>>> myStr<strong>in</strong>g[0]‘G’>>> myStr<strong>in</strong>g[1]‘A’>>> myStr<strong>in</strong>g[-1]‘A’>>> myStr<strong>in</strong>g[-2]‘C’>>> myStr<strong>in</strong>g[7]Traceback (most recent call last):File "", l<strong>in</strong>e 1, <strong>in</strong> ?IndexError: str<strong>in</strong>g <strong>in</strong>dex out of rangeGli <strong>in</strong>dici negativi <strong>in</strong>izianodalla f<strong>in</strong>e della str<strong>in</strong>ga ecrescono verso s<strong>in</strong>istraL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/20114


Accesso alle sottostr<strong>in</strong>ghe>>> myStr<strong>in</strong>g = “GATTACA”>>> myStr<strong>in</strong>g[1:3]‘AT’>>> myStr<strong>in</strong>g[:3]‘GAT’>>> myStr<strong>in</strong>g[4:]‘ACA’>>> myStr<strong>in</strong>g[3:5]‘TA’>>> myStr<strong>in</strong>g[:]‘GATTACA’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/20115


Alcuni operatori utili>>> len(“GATTACA”)7>>> “GAT” + “TACA”‘GATTACA’>>> “A” * 10‘AAAAAAAAAA>>> “GAT” <strong>in</strong> “GATTACA”True>>> “AGT” <strong>in</strong> “GATTACA”FalseLunghezzaConcatenazioneRipetizioneTest di sottostr<strong>in</strong>gaL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/20117


Alcuni esempi di metodi str<strong>in</strong>ga ESEMPI:str<strong>in</strong>g.py>>> "GATTACA".f<strong>in</strong>d("ATT")1>>> "GATTACA".count("T")2>>> "GATTACA".lower()'gattaca'>>> "gattaca".upper()'GATTACA'>>> "GATTACA".replace("G", "U")'UATTACA‘>>> "GATTACA".replace("C", "U")'GATTAUA'>>> "GATTACA".replace("AT", "**")'G**TACA'>>> "GATTACA".startswith("G")True>>> "GATTACA".startswith("g")FalseL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/20118


Split e jo<strong>in</strong> ESEMPI:splitjo<strong>in</strong>.pyIl metodo split() è utilizzato per suddividereuna str<strong>in</strong>ga <strong>in</strong> una sequenza di elementi>>> '1+2+3+4+5'.split('+’)['1', '2', '3', '4', '5']>>> 'Us<strong>in</strong>g the default'.split()['Us<strong>in</strong>g', 'the', 'default']Il metodo jo<strong>in</strong>() è utilizzato per unire unasequenza di str<strong>in</strong>ghe>>> seq = ['1', '2', '3', '4', '5']>>> sep = '+'>>> sep.jo<strong>in</strong>(seq)'1+2+3+4+5'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/20119


stripIl metodo strip (s[, chars]) restituisce unacopia della str<strong>in</strong>ga con i caratteri <strong>in</strong>iziali ef<strong>in</strong>ali rimossiSe chars non è specificato, vengonorimossi gli spazi bianchi (tab, spazio)Utile per “ripulire” le str<strong>in</strong>ghe>>> ' spacious '.strip()'spacious’>>> 'www.example.com'.strip('cmowz.')'example'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201110


Le str<strong>in</strong>ghe sono immutabiliAttenzione: le str<strong>in</strong>ghe non possono esseremodificatePer la modifica è necessario crearne di nuove>>> s = "GATTACA">>> s[3] = "C"Traceback (most recent call last):File "", l<strong>in</strong>e 1, <strong>in</strong> ?TypeError: object doesn't support item assignment>>> s = s[:3] + "C" + s[4:]>>> s'GATCACA'>>> s = s.replace("G","U")>>> s'UATCACA'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201111


Le str<strong>in</strong>ghe sono immutabiliAttenzione: i metodi str<strong>in</strong>ga non modificano lastr<strong>in</strong>ga, ma ne restituiscono una nuova>>> sequence = “ACGT”>>> sequence.replace(“A”, “G”)‘GCGT’>>> pr<strong>in</strong>t sequenceACGT>>> sequence = “ACGT”>>> new_sequence = sequence.replace(“A”, “G”)>>> pr<strong>in</strong>t new_sequenceGCGTL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201112


Espressioni regolariLe espressioni regolari sono un potentemezzo di elaborazione del testo<strong>Python</strong> <strong>in</strong>clude un ricco pacchetto per lagestione di espressioni regolari: reGestione delle espressioni <strong>in</strong> stile PerlCreazione di un oggetto rappresentantel'espressione regolareInvocazione di metodi per il match diespressioni regolari su str<strong>in</strong>gaL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201113


S<strong>in</strong>tassi di baseUna str<strong>in</strong>ga di testo regolare fa match conse stessa“test” fa match <strong>in</strong> “Questo è un test”“.” fa match con ogni carattere s<strong>in</strong>golox* fa match con zero o più x“a*” fa match con ’’, ’a’, ’aa’, etc.x+ fa match con una o più x“a+” fa match con ’a’,’aa’,’aaa’, etc.x? fa match con zero o una x“a?” fa match con ’’ o ’a’x{m, n} fa match con i x, dove m < i < n“a{2,3}” fa match con ’aa’ o ’aaa’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201114


S<strong>in</strong>tassi di base[x] fa match con un qualunque caratteredella lista x“[abc]” fa match con ‘a’,‘b’ o ‘c’[^x] fa match con un qualunque caratterenon <strong>in</strong>cluso <strong>in</strong> x“[^abc]” fa match con qualunquecarattere eccetto ‘a’,’b’,o ‘c’Le parentesi () sono utilizzate per i gruppi“(abc)+” fa match con ’abc’, ‘abcabc’,‘abcabcabc’, etc.x|y fa match con x o y“this|that” fa match con ‘this’ e ‘that’, manon ‘thisthat’.L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201115


S<strong>in</strong>tassi di base“\d” fa match con una cifra“\D” fa match con una non-cifra“\s” fa match con un carattere whitespace“\S” fa match con un carattere non-whitespace“\w” fa match con un carattere alfanumerico“\W” fa match con un carattere nonalfanumerico“^” fa match con l’<strong>in</strong>izio della str<strong>in</strong>ga“$” fa match con la f<strong>in</strong>e della str<strong>in</strong>ga“\b” fa match con un word boundary“\B” fa match con una posizione che non è unword boundaryL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201116


Escap<strong>in</strong>g di caratteri specialiAttenzione ai caratteri speciali!'python.org’ fa match con 'python.org’ maanche con ‘pythonzorg’, etc.Per fare <strong>in</strong> modo che un carattere speciale sicomporti da carattere normale, occorre farnel’escap<strong>in</strong>g (carattere di backslash anteposto):'python\\.org’ fa match con 'python.org’Attenzione al doppio backslash (non s<strong>in</strong>golo)!Nelle str<strong>in</strong>ghe normali, ogni backslash vienevalutatoPer far arrivare al modulo re la str<strong>in</strong>ga corretta(python\\.org) occorre annullare il primobackslashL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201117


Escap<strong>in</strong>g di caratteri specialiPer quanto riguarda gli <strong>in</strong>siemi di caratteri,l’escap<strong>in</strong>g è possibile ma non necessarioAttenzione però ai seguenti casi:E’ necessario l’escap<strong>in</strong>g di ^ se compareall’<strong>in</strong>izio del set e non si vuole <strong>in</strong>tenderlo comeoperatore di negazione.Analogamente, ] e - devono essere postiall’<strong>in</strong>izio del set oppure deve esserne fattol’escap<strong>in</strong>gL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201118


Str<strong>in</strong>ghe “raw”Una pratica alternativa all’escap<strong>in</strong>g all’<strong>in</strong>terno distr<strong>in</strong>ghe è di utilizzare le raw str<strong>in</strong>gUna str<strong>in</strong>ga raw non è soggetta ad escap<strong>in</strong>gUna str<strong>in</strong>ga raw ha una r anteposta‘Questa è una str<strong>in</strong>ga’r‘Questa è una str<strong>in</strong>ga raw’Differenze con le str<strong>in</strong>ghe normali>>> pr<strong>in</strong>t 'C:\\nowhere’C:\nowhereCon una str<strong>in</strong>ga raw:>>> pr<strong>in</strong>t r'C:\nowhere’C:\nowhereL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201119


Esempi di utilizzo di str<strong>in</strong>ghe “raw”Supponiamo di voler scrivere una RE che<strong>in</strong>dichi le corrispondenze della str<strong>in</strong>ga"\section", tipico comando LATEXSenza utilizzare str<strong>in</strong>ghe raw, dovremmoseguire i seguenti passi: \section Str<strong>in</strong>ga di testo di cui cercare lacorrispondenza \\section Annullamento del backslash peril modulo re "\\\\section" Annullamento del backslashnella str<strong>in</strong>ga normaleL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201120


Esempi di utilizzo di str<strong>in</strong>ghe “raw”utilizzando str<strong>in</strong>ghe raw, l'esempio precedentesi riduce a: \section Str<strong>in</strong>ga di testo di cui cercare lacorrispondenza \\section Annullamento del backslash peril modulo rer'\\section' Uso della str<strong>in</strong>ga rawL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201121


modulo re: alcune funzioni importantisearch(pattern, str<strong>in</strong>g[, flags])Effettua la ricerca di pattern <strong>in</strong> str<strong>in</strong>gmatch(pattern, str<strong>in</strong>g[, flags])Fa match con pattern all’<strong>in</strong>izio di str<strong>in</strong>gsplit(pattern, str<strong>in</strong>g[, maxsplit=0])Suddivide str<strong>in</strong>g <strong>in</strong> base alle occorrenze dipatternf<strong>in</strong>dall(pattern, str<strong>in</strong>g)Restituisce una lista di tutte le occorrenze dipattern <strong>in</strong> str<strong>in</strong>gL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201122


modulo re: alcune funzioni importantisub(pat, repl, str<strong>in</strong>g[, count=0])Sostituisce con repl tutte le occorrenze di pat <strong>in</strong>str<strong>in</strong>gcompile(pattern[, flags])Crea un oggetto pattern da una str<strong>in</strong>ga con unaregexp escape(str<strong>in</strong>g)Effettua l’escap<strong>in</strong>g di tutti i caratteri speciali distr<strong>in</strong>gL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201123


Search e MatchI due metodi pr<strong>in</strong>cipali sono re.search() ere.match()re.search() ricerca un pattern ovunque nellastr<strong>in</strong>gare.match() effettua la ricerca solo a partiredall’<strong>in</strong>izio della str<strong>in</strong>gaTali metodi restituiscono None se il pattern nonè trovato e un “match object” se lo è>>> pat = "a*b">>> import re>>> re.search(pat,"fooaaabcde")>>> re.match(pat,"fooaaabcde")>>>L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201124


GruppiIl pattern seguente fa match con alcuni comuni<strong>in</strong>dirizzi email: \w+@(\w+\.)+(com|org|net|edu)>>> pat1 = "\w+@(\w+\.)+(com|org|net|edu)">>> r1 = re.match(pat,"f<strong>in</strong><strong>in</strong>@cs.umbc.edu")>>> r1.group()'f<strong>in</strong><strong>in</strong>@cs.umbc.edu’Potremmo voler fare match con sotto-parti delpattern, come il nome email e l’hostL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201125


Gruppi ESEMPI:match.pyE’ sufficiente racchiudere tra parentesi i“gruppi” che vogliamo identificare>>> pat2 = "(\w+)@((\w+\.)+(com|org|net|edu))">>> r2 = re.match(pat2,"f<strong>in</strong><strong>in</strong>@cs.umbc.edu")>>> r2.group(1)'f<strong>in</strong><strong>in</strong>'>>> r2.group(2)'cs.umbc.edu'>>> r2.groups()r2.groups()('f<strong>in</strong><strong>in</strong>', 'cs.umbc.edu', 'umbc.', 'edu’)L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201126


Gruppi ESEMPI:namedgroup.pyNotare che i gruppi sono numerati <strong>in</strong> pre-ord<strong>in</strong>e(cioè rispetto alla loro parentesi di apertura)È anche possibile etichettare i gruppi ereferenziarli attraverso le etichette>>> pat3 ="(?P\w+)@(?P(\w+\.)+(com|org|net|edu))">>> r3 = re.match(pat3,"f<strong>in</strong><strong>in</strong>@cs.umbc.edu")>>> r3.group('name')'f<strong>in</strong><strong>in</strong>'>>> r3.group('host')'cs.umbc.edu’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201127


Cos’è un match object?Il match object è un’istanza della classe matchcon i dettagli del risultato del match>>> pat = "a*b">>> r1 = re.search(pat,"fooaaabcde")>>> r1.group() # restituisce la str<strong>in</strong>ga che ha fattomatch'aaab'>>> r1.start() # <strong>in</strong>dice dell’<strong>in</strong>izio del match 3 7>>> r1.end() # <strong>in</strong>dice della f<strong>in</strong>e del match>>> r1.span() # tupla (start, end)(3, 7)L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201128


e match object: Alcuni metodi utiligroup([group1, ...])Restituisce le occorrenze dei sottopattern(gruppi) start([group])Restituisce la posizione di <strong>in</strong>iziodell’occorrenza di un dato gruppo end([group])Restituisce la posizione di f<strong>in</strong>e dell’occorrenzadi un dato gruppo span([group])Restituisce le posizioni di <strong>in</strong>izio e f<strong>in</strong>eL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201129


e.split() ESEMPI:resplit.pyre.split() è simile a split() ma può utilizzare deipattern>>> some_text = 'alpha, beta,,,,gamma delta’>>> re.split('[, ]+', some_text)['alpha', 'beta', 'gamma', 'delta']Con il parametro maxsplit è anche possibile<strong>in</strong>dicare il massimo consentito numero disuddivisioni>>> re.split('[, ]+', some_text, maxsplit=2)['alpha', 'beta', 'gamma delta’]>>> re.split('[, ]+', some_text, maxsplit=1)['alpha', 'beta,,,,gamma delta']L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201130


Altre funzioni del modulo rere.f<strong>in</strong>dall() trova tutti i match:>>> re.f<strong>in</strong>dall("\d+”,"12 dogs,11 cats, 1 egg")['12', '11', ’1’]re.sub() sostituisce un pattern con una str<strong>in</strong>gaspecificata>>> re.sub('(blue|white|red)', 'black', 'blue socks andred shoes')'black socks and black shoes’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201131


sub e i gruppiÈ possibile compiere sostituzioni avanzateutilizzando re.sub() <strong>in</strong>sieme a riferimenti agruppiAd esempio, immag<strong>in</strong>iamo di voler sostituire'*someth<strong>in</strong>g*' con 'someth<strong>in</strong>g’:>>> emphasis_pattern = r'\*([^\*]+)\*’>>> re.sub(emphasis_pattern, r'\1','Hello, *world*!')'Hello, world!’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201132


sub e le funzioni di sostituzioneÈ possibile compiere sostituzioni avanzateutilizzando vere e proprie funzioni disostituzione <strong>in</strong>vece che una semplice str<strong>in</strong>gadef dashrepl(matchobj):if matchobj.group(0) == '-':return ' ’else:return '-’>>>re.sub('-{1,2}', dashrepl, 'pro----gram-files')'pro--gram files'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201133


Pattern greedy e non greedyATTENZIONE: gli operatori di ripetizione sonogreedy (<strong>in</strong>gordi) di default, cioè tentano ditrovare i match più grandi possibiliQuesto può a volte produrre risultati nondesiderati>>> emphasis_pattern = r'\*(.+)\*’>>> re.sub(emphasis_pattern, r'\1','*This* is *it*!’)'This* is *it!’L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201134


Pattern greedy e non greedyPer risolvere il problema, è sufficienteutilizzare le versioni non-greedy degli operatoridi ripetizione, ad es:+ operatore greedy+? operatore non-greedy>>> emphasis_pattern = r’\*(.+?)\*’>>> re.sub(emphasis_pattern, r'\1', ’*This* is*it*!’)'This is it!'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201135


Compilazione di espressioni regolariSe si prevede di utilizzare un pattern re più diuna volta, è consigliabile compilarlo, ottenendoun oggetto pattern<strong>Python</strong> produce <strong>in</strong> questo caso una specialestruttura dati che ne velocizza il match<strong>in</strong>g>>> cpat = re.compile(pat)>>> cpat>>> r = cpat.search("f<strong>in</strong><strong>in</strong>@cs.umbc.edu")>>> r>>> r.group()'f<strong>in</strong><strong>in</strong>@cs.umbc.edu'L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201136


Pattern object: metodiPer un pattern object sono def<strong>in</strong>iti metodianaloghi a quelli visti nel modulo re: match search split f<strong>in</strong>dall subL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201137


Generatori ESEMPI:generators.pyUn generatore è una funzione che produceuna sequenza di risultati <strong>in</strong>vece di un s<strong>in</strong>golovaloreI valori della sequenza sono ritornati uno allavolta, tramite l'istruzione yielddef countdown(n):while n > 0:yield nn-=1>>> for i <strong>in</strong> countdown(5):... pr<strong>in</strong>t i,…5 4 3 2 1>>>L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201138


GeneratoriIl comportamento di un generatore è diversoda quello di una normale funzioneL'<strong>in</strong>vocazione di un generatore produce unoggetto generatoreNON esegue la funzione!def countdown(n):pr<strong>in</strong>t “Count<strong>in</strong>g down from”, nwhile n > 0:yield nn-=1>>> x = countdown(10)>>> x>>>Notate come nonsia stampato alcun valoreL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201139


GeneratoriLa funzione viene eseguita <strong>in</strong>vocando ilmetodo next() dell'oggetto generatoreUn po' come avviene per gli iteratori>>> x = countdown(10)>>> x>>> x.next()Count<strong>in</strong>g down from 10>>>yield produce un valore e sospende lafunzione f<strong>in</strong>o alla prossima next()>>> x.next()9>>> x.next()8L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/2011La funzione <strong>in</strong>izia la suaesecuzione qui40


GeneratoriQuanto la funzione ritorna, l'iterazione f<strong>in</strong>isce>>> x.next()1>>> x.next()Traceback (most recent call last):File “”, l<strong>in</strong>e 1, <strong>in</strong> ?StopIterationLa funzione <strong>in</strong>izia la suaesecuzione quiL<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201141


Generatori vs. IteratoriUn oggetto generatore è diverso da unoggetto iteratoreIl generatore è il classico esempio di one-timeoperationL'iterazione avviene una sola voltaSe si vuole ripetere l'iterazione, è necessariocreare un altro generatoreUn iteratore può iterare su una lista quantevolte vuoleIl generatore è più semplice da usareNon occorre creare i metodi .next(),.__iter__(), etc.L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201142


Espressioni generatrici ESEMPI:genlog.pyÈ possibile creare sequenze <strong>in</strong> maniera similealle list comprehensionList comprehension: lista creata tramite unciclo for>>> fruit = [ 'apple ', ' orange ', ' pear ']>>> list = [ f.strip() for f <strong>in</strong> fruit]['apple', 'orange', 'pear']>>>Esempio di espressione generatrice>>> a = [1, 2, 3, 4]>>> b = (2*x for x <strong>in</strong> a)>>> b>>> for i <strong>in</strong> b: pr<strong>in</strong>t i,2 4 6 8L<strong>in</strong>guaggi d<strong>in</strong>amici – A.A. 2010/201143

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!