Fonaments de Processament del Llenguatge Natural

13305 – UPF - Lingüística

 

Probablement les respostes a les teves preguntes estan aquí. Llegeix fins al final abans de començar a fer res!!

Pràctica 2

 

1. Introducció

 

Expressions Regulars (ER) és el nom d’una notació estàndard per definir seqüències o cadenes de caràcters. Més exactament: definim, en donar uns patrons, un conjunt de cadenes. És a dir, especifiquem característiques que volem que siguin restriccions per seleccionar de tot el conjunt possible de cadenes de caràcters, aquelles que volem. Amb ER’s podem dir: “seleccioni o trobi totes les seqüències de caràcters que tinguin ‘zx’”, per exemple. Aquestes restriccions són el que es diu un patró. I els resultats, aquelles cadenes que efectivament tenen les característiques que volíem, és el conjunt de cadenes definit per la ER.

 

 

 

 

 

 

 

 

 

 

 

 

 


Per usar ER, però, hem de tenir en compte que en un text digital hi ha caràcters que es veuen i caràcters que no, però que tots estan codificats. Les ER permeten fer referència a tot el rang de possibles caràcters:

 

(1) Caràcters alfabètics: De la A a la Z com a lletres majúscules i com a lletres minúscules, que són codis diferents per a tot tipus de programes. Quan volem referir-nos a totes les lletres de l’abecedari podem escriure, com a drecera de notació, [A-Z] si ens volem referir a totes les lletres de l’abecedari en majúscules, o [a-z] a totes en minúscules. També hem de fer atenció als caràcters que no corresponen a l’abecedari anglès i que poden haver de especificar-se a més a més. [a-záéíóúñ] seria tot el rang necessari per trobar qualsevol lletra minúscula del castellà, per exemple. Pensa, quin seria el rang per treballar català.

 

(2) Caràcters numèrics: De 0 a 9, o com hem definit abans el rang: [0-9]

 

(3) Caràcters per a puntuació: punt (.), coma (,), punt i coma (;), etc. que són els visibles, i els caràcters de puntuació no visibles i als quals ens podem referir amb un codi especial:

 

\n       salt de línia

\t       tabulador

\r       retorn de carro manual

\f       “form feed”

 

Per referir-nos a tots aquests caràcters de puntuació que no es veuen juntament amb l’espai, tenim també una notació abreviada que és \s

 

2. Expressions Regulars

 

            ER es un llenguatge formal i per tant té el seu vocabulari, la seva sintaxi i la seva semàntica. Aquest llenguatge té una sintaxi simple però amb la qual es poden construir expressions molt complexes que defineixen un conjunt força variat d’elements.

 

            L’expressió regular més senzilla és una seqüència de caràcters. Per exemple, /responsable/. L’expressió regular es marca amb aquestes barres inclinades i el que hi posem entre elles són les restriccions que ha d’executar un programa que entengui així que estem expressant una expressió regular. Si en un programa donéssim l’ordre de buscar aquesta expressió /responsable/ ens trobaria totes les seqüències que contenen aquesta, és a dir, per exemple, les següents paraules:

 

responsable

responsables

responsablement

 

            Però també ens trobarà coses com ara:

 

irresponsable

irresponsables

irresponsablement

 

            Fixeu-vos que, per evitar-ho, podem escriure una expressió com ara / responsable/, on el primer caràcter de l’expressió és un espai en blanc, que significa literalment que l’únic caràcter que pot haver davant del caràcter ‘r’ és un espai en blanc.

 

            Però el que realment és interessant de les ER és que, gràcies als seus operadors, podem construir expressions complexes que ens permeten definir conjunts molt específics de seqüències, per exemple, definir el conjunt de les coses que són paraules. Primer hem de saber com podem definir aquest conjunt i desprès podem expressar-ho en el llenguatge de les Expressions Regulars..... Anem a pams.

 

IDENTIFIQUEM PARAULES

 

            Partirem de les dades de l’exercici anterior per identificar paraules. Ara definirem la tasca que volem que realitzi el nostre programa. L’entrada és un text (en format ‘txt’), la tasca és identificar unitats que anomenem ‘paraules’ i volem que el resultat sigui el text on cada unitat identificada, cada paraula, estigui en una línia.

A l’exercici anterior havíem descrit ‘com’ podríem resoldre la tasca amb instruccions com, per exemple, identifica “la seqüència de caràcters que està entre dos espais en blanc”. Aquesta restricció l’expressaríem de la següent manera amb les ER:

 

(1)   / [a-zA-Zàéèíòóúç·] /

 

Fixeu-vos que entre la barra inclinada i el claudàtor ‘[‘  hi ha un espai en blanc, i significa ‘literalment’ que el patró conté un espai en blanc. Fixeu-vos a més a més, que en usar l’operador ‘[ ]’, el claudàtor, per marcar un rang, ‘qualsevol caràcter alfabètic, en minúscules o majúscules’, hem afegit també els caràcters de les vocals accentuades i dels caràcters consonàntics que no té l’anglès.

 

Però amb la instrucció (1) estem definint que entre els dos espais en blanc ha d’haver un únic caràcter, que pot ser qualsevol dels que hem indicat. I no és això, oi? Per marcar que estem buscant 1 o més caràcters d’aquest possible tipus, en un nombre il·limitat, usarem l’operador ‘+’.

 

(2)  / [a-zA-Zàéèíòóúç·]+ /

 

 

EXECUTEM ACCIONS: el comandament substituir

 

Ara usarem les expressions regulars per donar-li ordres al segmentador: un programa que identificarà paraules segons les instruccions que nosaltres li donem en forma de ER. Hem preparat un programa (escrit en un llenguatge de programació, perl) que executarà les accions de cerca i selecció que li demanem. Aquest programa és el fitxer anomenat ‘SEGMENTADOR.PRL’. A més a més, li podem demanar que executi ordres d’acció com ara la de posar cada unitat identificada en diferents línies. Així que si usem l’expressió regular a (3), on  s/ vol dir ‘substituir’, sobre un text ens ha de trobar aquesta seqüència.

 

(3)  s/ /\n/g;

 

Fixeu-vos primer en les barres inclinades a la dreta ‘/’. Són les que separen les diferents accions.

 

(4)

 

 

s/ /\n/g;

Llamada con línea 1: patró: en aquest cas,
l’espai
 

 

 

 

 

 


s/ /\n/g;

Llamada con línea 1: acció: en aquest cas, posar un caràcter de salt de línia ‘\n’
 

 

 

 

 

 

 

 

 

 


El significat de tota l’expressió és:  “substitueix cada espai en blanc que trobis per un caràcter de salt de línia”.

 

 

(5)

 

s/ /\n/g;

 

Encara ens falta explicar una cosa, però. La ‘g’, vol dir que ho faci de forma general, tants cops com vegades trobi el patró. Aquest modificador de la ER és necessari per distingir quan volem que faci l’acció una sola vegada, la primera que trobi el patró, o volem que la faci tantes vegades com pugui. El ‘;’ diu que hem acabat aquesta expressió.

 

 

Recordeu:

 

1) L’expressió regular de cerca es troba a la primera part de la instrucció que li donem al SEGMENTADOR, el primer espai entre barres inclinades.

 

2) Estem usant les ER per trobar patrons i substituir-los. Per això, en el segon espai entre barres inclinades hem de posar per a quina cosa volem que sigui substituït allò que ha trobat. En l’exemple hem dit que substitueixi els espais en blanc per un caràcter de salt de línia. Quan imprimeixi aquest caràcter imprimirà un salt de línia i la paraula següent es s’imprimirà en una altra línia.

 

3) Després de la darrera barra inclinada, la ‘g’ indica que repeteixi l’acció tants cops com trobi el patró. En el nostre exemple això voldrà dir tots els espais en blanc.

 

4) NO ens hem d’oblidar del ‘;’ final. El nostre programa necessita aquesta marca per entendre que hem acabat una instrucció

 

Mireu un altre exemple. En aquest cas veurem una altra característica interessant de les expressions regulars.

 

De la nostra llista d’instruccions per identificar paraules, de ben segur que hem tingut en compte que no totes les paraules estan entre espais en blanc. També n’hi ha que en lloc d’un espai tenen un signe de puntuació. (‘puntuació.’ és un bon exemple). Ara hem de decidir què volem fer amb aquest signe de puntuació. Si decidim de tractar-lo com un signe lingüístic més i posar-lo en una línia separada, podem fer el següent:

 

(6)

 

s/\./\n\.\n/g;

 

Amb aquesta instrucció diem: “Substitueix cada caràcter ‘punt’ (fixeu-vos que usem la barra inclinada ‘\’ per referir-nos al caràcter i no a l’operador ‘.’ que vol dir ‘qualsevol caràcter’ per:

-        un de ‘salt de línia’,

-        un caràcter ‘punt’ i

-        un de ‘salt de línia’”

 

Com que hi ha més signes de puntuació que poden anar enganxats darrera les paraules, hauríem de fer una instrucció per a cada un d’ells o bé posar-los tots entre claudàtors per tal d’expressar que pot ser un de tots els que posem a la llista:

 

(7)

 

s/[.,!?:;]/

 

(Aquí no caldrà marcar amb la barra ‘\’ ja que l’operador de rang ‘[]’ ho deixa clar, i ull, que me n’he deixat alguns...) Però ara, per qual el substituïm? El que voldríem és que si ha trobat un punt, el substitueixi per un punt, i si era una coma, per una coma, etc. Les Expressions Regulars permeten usar ‘variables’, és a dir, elements el valor dels quals es determina quan s’està processant. La instrucció que donaríem es podria llegir com “substitueix qualsevol d’aquests signes que puguis trobar, per salt de línia i el signe que has trobat efectivament”. Usem ‘$1’,  el dòlar per marcar que és una variable, i el nombre per identificar diferents variables. Per marcar el referent de la variable usem els parèntesis:

 

(8)

 

s/([.,!?:;,])/\n$1/g;

 

Ara que ja sabem expressar-nos, podem passar a construir el segmentador....

 

EXERCICIS