Introduzione a RegEx per Linguisti

Table of Contents

RegEx è uno strumento utilissimo per trovare velocemente file, ricercare ed estrarre stringhe dai datasets ed è anche richiesto solitamente per posizioni di linguistica computazionale.

Come funziona in Python

Per prima cosa, bisogna importare il modulo re e per questa volta utilizzeremo solo la funzione findall()

import re

#re.findall("PATTERN REGEX QUI","STRINGA IN CUI CERCARE QUI")

Le regular expressions sono delle espressioni, appunto, che permettono di definire dei pattern che possano corrispondere a stringhe che seguono tali pattern.

Quando si esegue una ricerca con regex, bisogna tener conto di caratteri speciali che permettono di estendere la propria ricerca oltre una stringa letterale, in questo post i simboli speciali utilizzati saranno .[]+.

Prendiamo un esempio, cerchiamo con regex persona in una stringa contenente le seguenti parole:

  • persona
  • persone
  • personx
  • personxy

Il risultato sarà: persona

import re

re.findall("persona","persona persone personx personxy")

Se volessimo trovare questo sostantivo sia in forma singolare che plurale, dovremmo fare una ricerca per persona ed una per persone. Il simbolo ., però, corrisponde a qualsiasi carattere, quindi lo si potrebbe applicare così:

Risultato: persona, persone, personx, personx

import re

re.findall("person.","persona persone personx personxy")

Così va decisamente meglio e si risparmia tempo rispetto al fare due ricerche normali separatamente. Però tra i risultati si ha una parola che ha un errore di battitura e magari non si vuole contare, personx ovviamente. E' importante notare, inoltre, che personxy anche è incluso, ma senza l'ultima lettera, dato che il nostro pattern si limita a 7 caratteri, e non 8. Come possiamo allora definire una regular expression che prenda in considerazione sono una certa gamma di lettere come lettera finale del sostantivo?

Usando le parentesi quadre, definiamo un range di caratteri che vogliamo regex prenda in considerazione nella ricerca, in questo caso [ae]. E' bene ricordare che, ora come ora, il contenuto di queste parentesi quadre definisce UN SOLO CARATTERE. Quindi, utilizzando il regex person[ae], il risultato sarà: persona, persone, così abbiamo risparmiato tempo con una sola ricerca, ed abbiamo anche solo i sostantivi che davvero ci interessano.

import re

re.findall("person[ae]","persona persone personx personxy")

Proviamo adesso ad ottenere i sostantivi persona e personaggio dalla seguente lista di parole:

  • persona
  • person34ina
  • personaggio

In questo caso, vogliamo sia il sostantivo lungo 7 caratteri che quello lungo di più. Per far ciò useremo l'ultimo simbolo speciale di questo post, il +. Quando si usa il + si sta dicendo al regex "trovami il carattere precedente ed una sua ripetizione fino al primo spazione o fine di rigo".

Può sembrare un pò complicato, ma questo esempio probabilmente aiuterà a capire. Usando le parentesi quadre dopo person, diremo a regex di trovare un qualsiasi carattere dalla a alla z così person[a-z]. Infine, gli diremo "Sai quell'ultimo carattere dalla a alla z? applicalo a qualsiasi carattere che segue person fino alla fine della parola".

Quindi useremo il pattern person[a-z]+ per ottenere il risultato: persona e personaggio. Da notare come la parola con errori di battitura non sia contata perchè 3 e 4 non sono lettere presenti dalla a alla z.

import re

re.findall("person[a-z]+","persona person34na personaggio")

Proviamo ad utilizzare una ricerca simile nello studio su un corpus di scritti di Italiano. Alcuni dialetti italiani hanno la desonorizzazione di alcune plosive dopo nasale. Se volessimo ricercare occorrenze di ancora ed angora nel nostro corpus con una sola ricerca, ed avere tutti i match in una lista pronti ad essere comparati, il regex necessario sarà an[cg]ora e la funzione findall() ci darà una lista con tutti i risultati che combaciano.

Esercizi

Infine, come esercizio di pratica, usando il generatore di Lorem Ipsum del sito https://www.lipsum.com, provate a generare un testo di 500 parole, copiatelo in una stringa (o ancor meglio, usiamo open() per leggere il file txt in cui salvarlo) e con RegEx trovate tutte le occorrenze della parola "lorem" (attenti a stampatello e minuscolo!) e tutte le parole che iniziano con "ph".

Date: 2018-11-07 Wed 00:00

Author: Andrew

Other posts