Palabras Palabras Las palabras son el bloque fundamental del lenguaje. Cada lenguaje humano, hablado, por señas o escrito, está compuesto de palabras. Cada área de procesamiento del habla y lenguaje, desde reconocimiento del habla a traducción máquina para recuperación de información en la Web requiere conocimiento extensivo de las palabras. Palabras Muchas tareas de procesamiento lingüístico implican la coincidencia de patrón (pattern matching). Si queremos encontrar las palabras que terminan con 'aron' Si queremos encontrar las palabras que terminan con „en‟. Las expresiones regulares son un método más potente y flexible para describir los patrones que nos interesen. Expresiones regulares Una expresión regular (ER) es la notación estándar para caracterizar secuencias de textos. La ER es utilizada para especificar cadenas de texto en situaciones como: Búsqueda Web, procesamiento de palabras, cálculo de frecuencias de corpus, etc. Las ER pueden ser implementadas por autómatas de estado finito (AEF). Expresiones regulares La ER es un lenguaje para especificar cadenas de búsqueda de texto. La ER es una herramienta teórica importante de las ciencias de la computación y lingüística. Una ER es una fórmula en un lenguaje especial que es utilizada para especificar clases simples de cadenas. Cadena: secuencia de símbolos Expresiones regulares Una cadena es cualquier secuencia de caracteres alfanuméricos (letras, números, espacios, tabulaciones y puntuación). Un espacio es un carácter como cualquier otro representado con “_”. Expresiones regulares Formalmente una ER es una notación algebraica para caracterizar un conjunto de cadenas. Pueden ser usadas para especificar cadenas de búsqueda y para definir un lenguaje en una manera formal. Expresiones regulares La búsqueda de ERs requiere un patrón que se quiere buscar y un corpus de textos en los cuales hacerlo. Una función de búsqueda de ER buscará a través del corpus, regresando todos los textos que contengan el patrón. En un sistema de recuperación de información los textos pueden ser documentos enteros o páginas Web. En un procesador de palabras, los textos pueden ser palabras individuales o líneas de un documento. Expresiones regulares Una búsqueda puede ser diseñada para regresar todos los “empates” para una ER o sólo el primer “empate”. Patrones básicos de expresiones regulares El tipo más simple de ER es una secuencia de caracteres simples. Para buscar gato, se escribe /gato/. Así la expresión regular /pinocho/ empata cualquier cadena conteniendo la subcadena pinocho. Por ejemplo la línea Me llaman pinocho. Se pondrán barras // alrededor de cada ER para diferenciar una ER y un patrón. Expresiones regulares La cadena de búsqueda puede consistir de una sola letra (como /!/) o una secuencia de letras (como /urgl/). ER Ejemplo de patrones empatados /gatos/ “enlaces interesantes de gatos y perros” /a/ “Mariana paso a la tienda” /dice_Clara/ “Pedro, mi regalo por favor, dice Clara” /zapato/ “todos tus zapatos” /!/ “¡Dejaste a los niños en la selva!” Expresiones regulares Las ERs son sensibles a mayúsculas; la minúscula /s/ es distinta de la mayúscula /S/. Significa que el patrón /gatos/ no empatará la cadena Gatos. Se puede resolver este problema utilizando corchetes [ ]. La cadena de caracteres dentro los corchetes especifican una disyunción de caracteres a empatar. Expresiones regulares Se muestra que el patrón [ gG] empata patrones conteniendo ya sea g o G. ER Empate Patrones ejemplo /[gG]atos/ Gatos o gatos “Gatos” /[abc]/ „a‟, „b‟, o „c‟ “In uomini, in soldati” /[1234567890]/ Cualquier dígito “va desde 7 hasta 5” Expresiones regulares La ER /[1234567890]/ especifica cualquier dígito sólo. Las clases de caracteres como dígitos o letras son bloques de construcción importantes, en expresiones, pueden volverse complicadas, por ejemplo: /[ABCDEFGHIJKLMNÑOPQRSTUVWXYZ]/ Para especificar “cualquier letra capital” Los corchetes se pueden utilizar con el guión (-) para especificar cualquier carácter en el rango. Expresiones regulares El patrón /[2-5]/ especifica cualesquiera de los caracteres 2,3,4,o 5. El patrón /[b-g]/ especifica uno de los caracteres b, c, d, e, f, o g. ER Empate Patrones empatados de ejemplo /[A-Z]/ Una letra mayúscula “deberíamos llamarle Tomás” /[a-z]/ Una letra minúscula “mis alumnos estaban divertidos” /[0-9]/ Un solo dígito “Capítulo 1: introducción ” Expresiones regulares Los [] también se pueden utilizar para especificar lo que un solo carácter no puede ser, al utilizar el símbolo circunflejo ^. Si ^ es el 1er. símbolo después de [, el patrón resultante es negado. Por ejemplo, el patrón /[^a]/ empata cualquier caracter (incluyendo caracteres especiales) excepto „a‟. Sólo es verdad cuando ^ es el primer símbolo después del corchete. Si ocurre en cualquier otro lado, usualmente significa ^ Expresiones regulares ER Empata Ejemplo de patrones empatados [^A-Z] No una letra mayúscula “Oyfn pripetchik” [^Ss] Ni una “S” o “s” “No tiene sentido” [^\.] No un punto “el invitado de honor” [e^] Cualquiera „e‟ o „^‟ “buscar ^ ahora” a^b El patrón „a^b‟ “buscar a^b ahora” Con lo anterior se resuelve el problema de las letras capitales. Por ejemplo [^aeiouAEIOU] coincide con cualquier carácter que no sea una vocal: Expresiones regulares ¿Cómo especificar gato y gatos? No se puede utilizar [] ya que permiten decir s o S, pero no permiten decir s o nada. Se utiliza el signo de interrogación /?/, que significa “el carácter precedente o nada”. ER Empate Ejemplo de patrones que empatan gatos? gato o gatos “gato” colo?r color o colr “color” Podemos pensar en ? como “cero o más instancias del carácter previo”. Expresiones regulares Es una forma de especificar “cuanto de algo” queremos. En ocasiones se necesitan ERs que permitan repeticiones de cosas. Considere el lenguaje de un borrego, de cadenas como: ¡ bee! ¡ beeeee! ¡ beeeeeee! ¡beeeeeeeeee! Expresiones regulares Son cadenas con un signo de admiración, una b, seguida por lo menos de 2 e‟s y finalmente otro signo de admiración. El conjunto de operadores que permiten decir cosas como “algún número de es” está basado en el *, llamado Kleene. Significa cero o más ocurrencias del carácter inmediatamente previo o expresión regular. /e*/ significa “cualquier cadena de cero o más es”. Expresiones regulares La ER para empatar una o más e es /ee*/, significando una e seguida de cero o más es. También se pueden repetir patrones más complejos. [ab]* significa “cero o más as o bs”. Empatará cadenas como aaaa o ababab o bbbb. Expresiones regulares Especificar ER para precios *tarea La ER para un dígito fue /[0-9]/ La ER para un entero es /[0-9][0-9]*/ En ocasiones es molesto el tener que escribir la ER para dígitos dos veces. Hay otra forma más corta de especificar “al menos uno” de algún caracter. Kleene + significa “uno o más del caracter previo” Expresiones regulares La expresión /[0-9]+/ es la manera normal de especificar una secuencia de dígitos. Hay entonces 2 formas de especificar el lenguaje del borrego /¡beee*!/ o /¡bee+!/. El punto /./ una expresión comodín que empata cualquier caracter solo (excepto un retorno de carro). ER Empate Patrón de ejemplo /beg.n/ Cualquier caracter entre beg y n Begin, beg‟n, begun Expresiones regulares Supongamos que tenemos un hueco en un crucigrama para una palabra de ocho letras con j como su tercera letra y m como su sexta. En el lugar de cada celda en blanco se utiliza el comodín . : /^..j..m..$/ Obtendríamos las palabras 'abjectly', 'adjuster', 'dejected', 'dejectly', 'injector', 'majestic’ Expresiones regulares El comodín se utiliza a menudo con * para indicar “cualquier cadena de caracteres”. Suponga que se quiere encontrar cualquier línea en la cual una palabra en particular, por ejemplo aardvark, aparece doble vez. Podemos especificar esto con la ER /aardvark.*aardvark/ Expresiones regulares Anclas son caracteres especiales que sujetan ER a lugares particulares en una cadena. No empatan ningún caracter. En su lugar, empatan una posición antes, después o entre caracteres. Expresiones regulares Las anclas más comunes son ^ y $. ^ el circunflejo empata el inicio de una línea. El patrón /^El/ empata la palabra El sólo al inicio de una línea. /^b/ empata sólo la primera b en bobby. Aplicar /^a/ a abc empata a, pero /^b/ no empatará con abc. Expresiones regulares Hay entonces 3 usos de ^: Para empatar el inicio de una línea. Como una negación dentro de los corchetes. Sólo para indicar ^ Expresiones regulares El signo $ empata el final de la línea. /c$/ empata c en abc, mientras que /a$/ no empatará. El patrón _$ es un patrón útil para empatar un espacio al final de la línea y /^El perro\.$/ empata una línea que contiene sólo la frase El perro. Expresiones regulares Hay otras dos anclas: \b empata un límite de palabra, mientras que \B empata un no-límite. Así, / \bel \b/ empareja la palabra el pero no la palabra tele. / \b99/ empatará la cadena 99 en Hay 99 botellas de cerveza pero no 99 en hay 299 botellas de cerveza. Empatará 99 en $99 /\Bver\B/ Empareja ver con "Valverde" pero no con "verde" Disyunción, agrupamiento y precedencia Supóngase que queremos hacer una búsqueda en textos sobre mascotas, específicamente en gatos y perros. Quiero buscar la cadena gato o perro. Es necesario un operador nuevo, el operador disyunción, también llamado el símbolo pipe. El patrón /gato|perro/ empata ya sea la cadena gato o la cadena perro. Disyunción, agrupamiento y precedencia En ocasiones se necesita utilizar la disyunción en medio de una secuencia grande. Suponga que se quiere encontrar información sobre una mascota. ¿Cómo especificar gato y gatitos? /gato|itos/ solo coincidirá con gato e itos. Para que la disyunción aplique sólo a un patrón específico, se necesitan los operadores paréntesis ( y ) Disyunción, agrupamiento y precedencia Encerrar un patrón entre paréntesis lo hace actuar como un solo caracter para los propósitos de operadores vecinos como el pipe | y el Kleene *. Así el patrón /gat(o|itos)/ especifica lo que se quiere con la disyunción sólo aplicar a o y a itos. Disyunción, agrupamiento y precedencia El operador paréntesis ( es útil cuando se utilizan contadores como Kleene *. A diferencia del operador |, el operador Kleene * aplica por default a un solo caracter, no a una secuencia completa. Suponga que se quiere empatar instancias repetidas de una cadena. Tal vez tenemos una línea que tiene etiquetas columna de la forma Columna 1 Columna 2 Columna 3. Disyunción, agrupamiento y precedencia Con la expresión /(Columna_[0-9]+_*)*/ coincide la palabra Columna seguida por un número y espacios opcionales, el patrón completo repetido cualquier número de veces. Disyunción, agrupamiento y precedencia La siguiente lista da el orden de la precedencia de los operadores (desde la más alta a la más baja) Paréntesis () Cuantificadores * + ? {} Secuencias y anclas el ^ fin $ Disyunción | Un ejemplo simple Suponga que se quiere escribir una ER para encontrar los casos del artículo el. Un patrón simple, pero incorrecto sería /el/ Problema: se perdería la palabra cuando inicia una sentencia y es mayúscula. Se puede obtener la siguiente ER: /[eE]l/ Problema: se obtendrían textos incorrectos con el incluido en otras palabras (elefante o melena). Un ejemplo simple Es necesario especificar que se quieren instancias con un límite de palabra en ambos lados /\b[eE]l \b/ Supóngase que se quiere encontrar el en algún contexto donde tenga guiones o números cerca: el_ o el26. Especificar que queremos instancias donde no haya letras alfabéticas en ninguno de los lados de el. /[^a-zA-Z][eE]l[^a-zA-Z]/ Un ejemplo simple La ER anterior no encontraría la palabra el cuando inicia una línea, ya que la expresión implica que debe haber algún caracter antes de el. Especificar que antes de el requerimos el inicio de una línea o un caracter no alfabético. /(^|[^a-zA-Z])[eE]l[^a-zA-Z]/ Un ejemplo simple Revisemos la tarea Otro ejemplo Página 29 Equipos Operadores avanzados Existen algunos operadores avanzados. ER Expansión Empate Patrones ejemplo \d [0-9] Cualquier dígito Fiesta_de_5 \D [^0-9] Cualquier no dígito Luna_azul \w [a-zA-Z0-9_] Cualquier alfanumérico Daiyu \W [^\w] Un no alfanumérico !!!! \s [_\r\t\n\f] Espacio en blanco (espacio, tabulador) \S [^\s] No un espacio en blanco En_Córdoba Operadores avanzados Se pueden utilizar números explícitos como contadores, encerrándolos en llaves. /{3}/ indica 3 ocurrencias del caracter o expresión previa. /a\.{24}z/ coincidirá “a seguida por 24 puntos seguido de z” Puede especificarse un rango /{n,m}/ especifica desde n hasta m ocurrencias de la expresión previa. Operadores avanzados El símbolo ? especifica que el carácter anterior es opcional. /^e-?mail$/ coincide tanto con email como con e-mail. ER Empate * Cero o más ocurrencias del previo caracter o expresión + Una o más ocurrencias del caracter o expresión previa ? Exactamente cero o una ocurrencia del caracter o expresión previa {n} n ocurrencias del caracter o expresión previa {n,m} Desde n hasta m ocurrencias del caracter o expresión previa {n,} Al menos n ocurrencias del caracter o expresión previos. Operadores avanzados Ciertos caracteres especiales son indicados por la notación especial con la diagonal inversa (\). Como el caracter de nueva línea \n El caracter tabulador \t. Para tratar caracteres especiales (como .,*,[, y \), se les precede con diagonal inversa \ Es decir /\./, /\*/, /\[/, y /\\/ Operadores avanzados ER Empate Ejemplo de patrones \* Un asterisco * K*A*P*L*A*N \. Un punto . Dr. Pineda, supongo \? Un signo de interrogación ¿Qué dijo? \n Una nueva línea \t Un tabulador Expresiones regulares El sistema T9 se utiliza para introducir texto en los teléfonos móviles. Dos o más palabras que se escriben con la misma secuencia de pulsaciones se llaman textónimos. Expresiones regulares ¿Qué palabras pueden producirse con 4653? Se utiliza la expresión regular: /^[ghi][mno][jlk][def]$/ ¿Y para la ER /^[abc][ghi][tuv][abc]$/ ? Proponga otra ER, puede incluir más números El orden de los caracteres dentro de los corchetes no es significativo. Expresiones regulares Encuentre "trabadedos”, buscando palabras que sólo utilizan parte del teclado. /^[ghijklmno]+$/ o /^[g-o]+$/ coincide con palabras que sólo ocupan las teclas 4, 5, 6 en la fila central. /^[a-fj-o]+$/ coincide con palabras que utilizan las teclas 2, 3, 5, 6 en la esquina superior de la derecha. Supongamos que a ramón le gusta tomar fotos ¡Muchas fotos! Expresiones regulares Ramón quiere buscar todas en las que esté su nombre. Pero… tiene miles y miles de fotos donde buscar. Carpetas con distintos formatos jpg, bmp, tif, png Tiene muchos nombres para sus fotos ramoncito.jpg, ramon_playa.bmp, ramon_borracho.png, ramonennavidad.tif, ramon123.jpg, ramoncito_sexy_15.bmp Si quisiéramos fotografías nombradas: ramón.png, r4m0n.png, raaaaamoncito.png (sin incluir roman.png, romén.png) . Expresiones regulares . Coincide con cualquier carácter. (comodín) ^abc Coincide con «abc» en el inicio de una cadena. abc$ Coincide con «abc» al final de una cadena. [abc] Coincide con uno de «abc». (conjunto) [A-Z0-9] Coincide con uno de una serie de caracteres (aquí, alfanuméricos). ed|ing|s Coincide con una de las cadenas especificadas. (disyunción) * Coincide con cero o más elementos de la expresión anterior. + Coincide con uno o más elementos de la expresión anterior. ? Coincide con cero o uno de los elementos anteriores. (opcional) {n} Coincide con un carácter que se repita n veces, n es un número entero no negativo {n,} Coincide con un carácter que se repita al menos n veces {,n} Coincide con un carácter que se repita no más de n veces {m,n} a(b|c)+ Coincide con un carácter que se repita al menos m veces y no más de n veces Los paréntesis indican el alcance de los operadores. Ejercicios Escriba una ER en una hoja NO escriba el o los patrones que debe reconocer dicha expresión, SÓLO la ER. Equipos Ejercicios Obtenga un ejemplo de patrón para las siguientes expresiones regulares. /^[0-9]+\.[0-9]+$/ /^[A-Z]+\$$/ /^[0-9]{4}$/ /^[0-9]+-[a-z]{3,5}$/ /^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$/ /(ed|ing)$/ Ejercicios Obtenga un ejemplo de patrón para el cual coincidan las siguientes ER. Tarea Leer sección Regular Expression Substitution, Memory and Eliza Investigar si facebook utiliza PLN