Regular Expressions for Language Engineering - (RXRC) Karttunen, Chanod, Greffenstette, Schiller
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
Regular Expressions for Language Engineering Karttunen, Chanod, Greffenstette, Schiller (RXRC)
Introducción Transductores finitos muy utilizados para análisis morfolófico – Pero, ¿para qué otros aspectos del PLN pueden ser útiles? Expresiones regulares Tres operadores que facilitan las cosas – Restriction – Replacement – Left to right, longest match replacement Ejemplos
Lenguaje y relaciones regulares Las expresiones regulares denotan conjuntos (de strings y de pares de strings) Lenguaje: conjunto de strings Relación: conjunto de pares de strings Lenguaje regular: lenguaje expresado por una expresión regular Relación regular: relación expresada por una expresión regular
Autómatas y transductores Cualquier expresión regular se puede implementar mediante redes finitas (finite- state networks) Autómatas para los lenguajes Transductores para las relaciones
Símbolos básicos Dos tipos de símbolos en las expresiones regulares – Unarios (denotan lenguajes) – Parejas de símbolos (denotan relaciones) El símbolo unario b representa a {“b”} a:b representa a {} Una relación regular es un mapeo de dos lenguajes
Lenguaje superior e inferior El lenguaje a la derecha del símbolo “:” es el lenguaje superior o upper language El de la izquierda es el lenguaje inferior o lower language Para simplificar, no se distingue entre a y a:a
Dirección de los transductores Un transductor que implementa una relación regular mapea el lenguaje superior con el inferior… …o el inferior con el superior No hay una dirección privilegiada – En los ejemplos, se toma el superior como input y el inferior como output
Símbolos especiales A falta de epsilon, el símbolo 0 denota al string vacío ? denota a cualquier símbolo (ocurra en la expresión regular o no) Para considerar a 0, ? y otros caracteres especiales como lenguajes se los puede poner entre comillas o precedidos de % – %? – “0” – % (espacio) Se permiten “\n”, “\t” y otros caracteres especiales como en C.
Concatenación y unión Los lenguajes y relaciones regulares son cerrados bajo – Concatenación – Unión A B representa la concatenación de A con B A | B la unión (A) la unión de A con 0 (opción) A+ la iteración (1 o más ocurrencias de A) A* la clausura de Kleene (0 o más ocurrencias de A) – Equivale a (A+) [A] es equivalente a A
Complemento e intersección Los lenguajes regulares son cerrados bajo el complemento y la intersección Las relaciones regulares no lo son Siendo A y B lenguajes – ~A denota el complemento de A – A & B la intersección de A y B – A – B el complemento relativo o diferencia – A .x. B es el producto cartesiano de A y B Nótese que A .x. B denota una relación regular
Composición Las relaciones regulares son cerradas bajo composición Siendo A y B relaciones regulares – A .o. B denota al conjunto de los , donde pertenece a A y pertenece a B A .x. B (sobre lenguajes) y A .o. B (sobre relaciones) son los constructores básicos de relaciones
Containment El preguntar si un input contiene un elemento de un lenguaje es muy común Es tedioso escribir [?* A ?*] $A es equivalente $[A | B] denota el conjunto de todos los strings que contienen al menos a un elemento de A o al menos un elemento de B $ se llama contención (¿?) o containment
Restricción Pregunta: todos los strings que contengan un elemento A precedido de uno de B y seguido de uno de C Respuesta: [~[~[?* B] A ?*] | [?* A ~[?* C]]] Más fácil (agrego notación): A => B _ C Esta operación se llama restricción A, B y C tienen que ser lenguajes debido a ~
Reemplazo Problema: quiero reemplazar todas las ocurrencias de un cierto lenguaje por otro mediante una relación regular Solución: [~$[A – []] [A .x. B]]* [~$[A – []]] Esta operación se llama reemplazo A y B deben ser lenguajes
Variaciones A -> B || L _ R – Reemplazar A por B en el contexto L _ R A1 -> B1, A2 -> B2 – Reemplazar en paralelo – [~$[ [A1 | A2] – []] [[A1 .x. B1] | [A2 .x. B2]]]* [~$[[A1 | A2] – []]]
Ambigüedad del reemplazo [a b | b | b a | a b a] -> x produce ante la entrada “aba” – “xa” – “axa” – “ax” – “x” Se dice que el transductor es ambigüo
Left to rigth, longest match replacement Queremos reemplazar el string más grande de la izquierda a la derecha A @-> B [a b | b | b a | a b a] @-> x produce ante la entrada “aba” solamente “x” El operador se llama left to rigth, longest match replacement
Left to rigth, longest markup A @-> B ... C – Left to rigth longest markup – Reemplaza cualquier ocurrencia de A por ella misma precedida por un string de B y seguida por uno de C A2 @-> B1 ... C1, A2 @-> B2 ... C2 (d) a* n+ @-> %[ ... %] Input: “dannvaan”; Output: “[dann]v[aan]”
Simplificación del problema Consideraremos fechas como las siguientes: – Sunday, – August 11 – Sunday, August 11 – August 11, 1996 – Sunday, August 11, 1996 Nótese que algunas ocurren dentro de otras
Ejemplo: Fechas Utilizaremos expresiones para reconocer fechas Primero reconoceremos cualquier cosa que se parezca a una fecha Luego depuraremos las fechas inválidas
Lenguaje de las fechas
Lenguaje de las fechas Genera un automata de 13 estados y 96 arcos 30 millones de palabras en dicho lenguaje Las fechas que van de January 1 a December 31, 9999
Parser DateExpression @-> %[ ... ]% 23 estados, 332 arcos Una salida:
Fechas inválidas En 9999 años no hay 30 millones de días April 31, 1996 no es una fecha válida – Abril tiene 30 días (Problema 1) ¿Podemos sacar las fechas inválidas del lenguaje? Otras fechas inválidas – February 30 – February 29, 1994 1994 no es año bisiesto (Problema 2) – Tuesday, September 16, 1996 Era lunes (Problema 3)
Solución a problemas 1 y 2
Problema 3: Clases de equivalencia para los años “Afortunadamente”, el calendario Gregoriano repite la secuencia de días cada 400 años 14 clases de equivalencia
Problema 3: Clases de equivalencia para los días 14 clases de equivalencia para los días
Problema 3: Solución
Fechas válidas: solución ValidDate = DateExpression & MaxDaysInMonth & LeapDays & WeekDayDates ValidDate @-> %[ ... %] 1346 estados, 21006 arcos 10 segundos en Sun Ultra 1
Parser discriminador [[DateExpression – ValidDate] @-> “[ID” ... %], ValidDate @-> “[VD” … %]] Una salida:
Conclusiones Parsers finitos pueden ser construidos directamente desde expresiones regulares para lenguajes no triviales Existen subconjuntos regulares del lenguaje natural que pueden ser descriptos con expresiones regulares feasiblemente Lenguajes y relaciones regulares pueden ser modificadas para obtener nuevos lenguajes y relaciones sin modificar las gramáticas que las describen
Alternativas Se podría haber usado una phase structure grammar Pero, ¿cómo podemos hacer algo similar a DateExpression – ValidDate?
Otro ejemplo: Tokenización La tokenización es uno de los primeros pasos del procesamiento de string input Diferentes tokenizaciones para diferentes fines – Determinista (output único) – No determinista
Tokenizador determinístico simple El tokenizador más simple – Crea un sequencia de tokens sin usar información específica del lenguaje
Multiwords
Tokenizador con lexicon Ponemos todos las abreviaciones, expresiones de más de una palabra, palabras compuestas y otras expresiones que contengan caracteres especiales en el lenguaje TokenLexicon Reemplazamos por
Problemas del tokenizador con lexicon Si “in general” pertenece a TokenLexicon, no se distingue entre el “in general” de “in general, he” y “in general meetings” El lexicon puede ser muy grande
Tokenizador paso a paso Primero usamos el tokenizador simple Luego identificamos multiwords y las agrupamos El lenguaje de las multiwords es MWL Se asume para MWL que primero se pasó por el tokenizador simple Por ejemplo, MWL = [ a d “\n” h o c | a n d “\n” s o “\n” o n ]
Stapler Expresamos un transductor que recompone las multiwords
Tokenizador paso a paso: Ejemplo
Tokenizador no determinístico Algunas expresiones tienen diferente significado según el contexto El tokenizador no tiene la lógica suficiente como para tomar una decisión acertada Podría dar toda las opciones… Necesitamos que sea no determinístico para ello
Ambigüedad “De même les boîtes de même format sont classées ensemble” es ambigua debido a que “de même” también lo es ¿Quién se encarga de la ambigüedad? Restricciones sintácticas pueden eliminar tokenizaciones no aplicables (aunque no siempre la ambigüedad)
Restricciones sintácticas: Ejemplo
Markers y filters Un transductor finito que introduce símbolos adicionales a un input string se llama finite state marker Un transductor finito que devuelve partes de un input string se llama finite state filter
Último ejemplo: Light parser Reconocer patrones léxicos recurrentes es útil para la extracción de información ¿Se puede hacer con un transductor? Si se puede, muchas soluciones son más complicadas de lo que se necesita (estados infinitos)
Etapas del light parser Identificamos grupos nominales y verbales (phrasal mark-up) Indentificamos el cabezal de cada grupo (head-marking) Extraemos relaciones sintácticas (syntactic extraction)
Phrasal mark-up
Head marking
Syntactic function extraction
Performance Light parser aplicado a 1 Mbyte de texto (164.000 palabras) en SPARC-20 Tagging: 15 segundos Phrasal mark-up: 2 minutos Head marking: 3 minutos Union de 17 filtros: 11 minutos
Conclusiones Los transductores finitos resuelven problemas del PLN eficientemente más allá de su uso clásico (a la fecha del artículo), pese a que el lenguaje natural no es regular Las expresiones regulares facilitan la producción de transductores Las extensiones de Xerox son buenas ☺
También puede leer