Sei sulla pagina 1di 36

Curso de procesamiento del lenguaje natural

Csar Antonio Aguilar Facultad de Lenguas y Letras 04/04/2012 Cesar.Aguilar72@gmail.com

Expresiones regulares (1)


Para convertir nuestros archivos en cadenas, listas y textos, empleamos algunos caracteres y mtodos propios del uso de expresiones regulares (o Regexp). Pregunta: qu son las expresiones regulares?:
Una expresin regular es un tipo de patrn o estructura que describe un conjunto de cadenas sin enumerar sus elementos.

Es regular porque su codificacin tiende a ser repetitiva (de hecho, se pueden considerar una especie de rutina para comunicar cierta informacin).

Expresiones regulares (2)


Y para qu queremos usar expresiones regulares? Veamos el siguiente ejemplo: supongamos que queremos hacer bsquedas con el nombre Hndel, y tenemos que lidiar con dos variantes de ste: Handel y Haendel. Para resolver este problema, podramos agrupar estas tres variantes bajo una estructura regular del tipo:

H(a||ae)ndel
Esto equivale a decir algo: una cadena formada por los caracteres 'H', las opciones 'a', o '', o 'ae', 'n', 'd', 'e' y 'l'. Recuerden: no estamos trabajando con una palabra en s, sino con una secuencia de signos.

Expresiones regulares (3)

Las expresiones regulares son bastante tiles para muchsimas cosas: hacer bsquedas de palabras, tareas de procesamiento de textos, creacin de gramticas formales, generacin de textos, etc.

Expresiones regulares (4)

http://bwananet.iula.upf.edu/

Expresiones regulares (5)


Python, como muchos lenguajes de programacin, cuenta con mtodos y colecciones de expresiones regulares. En este caso, se agrupan en el mdulo re. Veamos algunas de las ms conocidas:

Operaciones con conjuntos

Negaciones

Expresiones regulares (6)


Operaciones con cadenas

Expresiones regulares en Python (1)


Retomando nuestra explicacin sobre Python , se trata de un lenguaje de programacin interpretado, esto es, cuenta con un mdulo que se encarga de leer y ejecutar los programas al vuelo, lo que se traduce en un ahorro de tiempo a la hora de evaluar un programa. Una de las ventajas de Python es su funcionalidad y gran compatibilidad con otros lenguajes, p. e., Jython, es una implementacin de Python compatible con Java (www.jython.org/Project/).

Expresiones regulares en Python (2)


Dadas estas caractersticas de Python, tres lingistas computacionales: Steven Bird (University of Melbourne), Edward Klein (University of Edinburgh) y Edward Loper (University of Pennsylvania), desarrollaron un conjunto de herramientas para tratamiento de lenguaje natural llamado Natural Language Tool-Kit (NLTK).

Para mayores datos sobre NLTK, pueden ver:

www.nltk.org

Expresiones regulares en Python (3)


Python maneja un mdulo especfico para realizar operaciones con expresiones regulares. La instruccin para importarlo es:

import re
La lista completa de meta-caracteres en Pyhon es la siguiente:

.^$*+?{[]\|()
Para mayores datos sobre expresiones regulares en Python, pueden ver:

www.amk.ca/python/howto/regex/

Usando mtodos con Regexp (1)


Vamos a realizar algunas operaciones empleando expresiones regulares. Veamos:
1. Escribamos la siguiente cadena: Python es un lenguaje interpretado, orientado a objetos, para fines generales. Python resulta muy adecuado para manipular archivos de texto.

2. Una vez que hayan creado su cadena, vamos a aplicar los siguientes procesos:

2.1. capitalize() : devuelve una copia de la cadena con el primer carcter en mayscula. Escriban entonces: Nombre_de_su_cadena.capitalize()

Usando mtodos con Regexp (2)

2.2. count (sub[, start[, end]]) : devuelve cuntas veces aparece subcadena en la cadena principal o S [start:end]. Los argumentos opcionales start y end se interpretan segn la notacin de corte. Escriban: Nombre_de_su_cadena.count(de). 2.3. replace (old, new[, maxsplit]) : devuelve una copia de la cadena en la que se han sustituido todas las apariciones de old por new. Si se proporciona el argumento opcional maxsplit, slo se sustituyen las primeras maxsplit apariciones. Escriban: Nombre_de_su_cadena.replace(de,del) 2.4. find (sub[, start[, end]]) : devuelve el menor ndice de la cadena para el que sub se encuentre, de tal modo que sub quede contenido en el rango [start, end). Los argumentos opcionales start y end se interpretan segn la notacin de corte. Devuelve -1 si no se halla sub. Escriban: Nombre_de_su_cadena.find(de).

Usando mtodos con Regexp (3)

2.5. split ([sep [,maxsplit]]) : devuelve una lista de las palabras de la cadena, usando sep como delimitador de palabras. Si se indica maxsplit, se devolvern como mucho maxsplit valores (el ltimo elemento contendr el resto de la cadena). Si no se especifica sep o es None, cualquier espacio en blanco sirve de separador. Escriban Nombre_de_su_cadena.split(), para generar un lista dividiendo la cadena en palabras (delimitadas por espacio).

Otro ejemplo: escriban Nombre_de_su_cadena.split(.), para dividir la cadena en una lista de oraciones delimitadas por un punto.

Usando mtodos con Regexp (4)

2.6. endswith (suffix[, start[, end]]) : devuelve verdadero si la cadena finaliza con el sufijo suffix especificado, en caso contrario es falso. Si se da valor al parmetro opcional start, la comprobacin empieza en esa posicin. Si se da valor al parmetro opcional end, la comprobacin finaliza en esa posicin.
2.7. startswith (prefix[, start[, end]]) : devuelve verdadero si la cadena comienza por prefix, en caso contrario, devuelve falso. Si se proporciona el parmetro opcional start, se comprueba la cadena que empieza en esa posicin. Si se proporciona el parmetro opcional end, se comprueba la cadena hasta esa posicin.

Usando mtodos con Regexp (5)

3. Ahora, para terminar, vamos a implementar dos mtodos ms o menos complejos para hacer dos tareas: encontrar y enlistar objetos (o findall) y substraccin de objetos (o sub) dentro de una cadena, esto es:

3.1. re.findall(r'\b[p|P][a-z]*', Cadena01)


3.2. re.sub(r'(\b[a-z]+) \1', r'\1', Cadena01)
Qu nos arroja como resultado? Veamos:

Usando mtodos con Regexp (6)


re.findall(r'\b[p|P][a-z]*', Cadena01)

Usando mtodos con Regexp (7)


re.sub(r'(\b[a-z]+) \1', r'\1', Cadena01)

Hacia el uso de mtodos hbridos (1)


Como hemos visto, una forma de hacer anlisis en documentos es empleando mtodos de carcter simblico, los cuales son ayudan a desarrollar diferentes tareas en varios niveles. Hasta el momento, hemos visto dos clase de mtodos: el diseo e implementacin de autmatas, y el uso de expresiones regulares.

Hacia el uso de mtodos hbridos (2)


Ahora, otra va paralela es usar mtodos estadsticos para hacer anlisis y predicciones en distintos niveles del lenguaje.

Hacia el uso de mtodos hbridos (3)


El uso de estadsticas no es algo exclusivo al PLN. Los lingistas los hemos empleado por lo menos desde el S. XIX. Algunos de los Junggrammatiker (o neogramticos) ya pensaban en sistemas combinatorios que ayudaban a explicar cambios lingsticos entre las lenguas indoeuropeas.
Alrededor de los 50 y los 60, un filosofo matemtico estadounidense, Richard Montague (1930-1971) propuso algunos trabajos de lgica aplicados al ingles, p. e., analizo el comportamiento semntico de los cuantificadores. Montague fue quiz el primero en plantear el uso de teora de conjuntos y lgica modal para explicar la sintaxis y la semntica de las lenguas naturales.

Richard Montague

Un autmata que sabe agrupar (1)


Lo que viene es un ejercicio. Si seguimos a Montague, suponemos viable describir un comportamiento sintctico usando una lgica de conjuntos. Si esto es posible, incluso podemos modelar un autmata capaz de entender y reproducir este comportamiento.

Un autmata que sabe agrupar (2)


Para que nuestro autmata entienda como se construye una buena frase nominal en ingls y en espaol, necesitamos buenos y malos ejemplos:

Un autmata que sabe agrupar (3)

Un autmata que sabe agrupar (4)

Un autmata que sabe agrupar (5)

Un autmata que sabe agrupar (6)

Un autmata que sabe agrupar (7)

Un autmata que sabe agrupar (8)

Un autmata que sabe agrupar (9)

Un autmata que sabe agrupar (10)

Un autmata que sabe agrupar (11)

Un autmata que sabe agrupar (12)

Un autmata que sabe agrupar (13)

Un autmata que sabe agrupar (14)

Un autmata que sabe agrupar (15)


Empleando las proposiciones que hemos hecho, podemos disear un autmata que sea capaz de generar secuencias de frases nominales que correspondan con los patrones del ingls y el espaol. Tendramos algo como:

Pregunta: este autmata por lo menos nos ayuda a resolver el caso del espaol, considerando que el adjetivo va en posicin postnominal. Si quisiramos que este mismo autmata analizara el ingls, qu tendramos que modificar?

Gracias por su atencin


Blog del curso: http://cesaraguilar.weebly.com/curso-deprocesamiento-del-lenguaje-natural.html