Introducción al Procesamiento de Lenguaje Natural Grupo de PLN - InCo 2011
Expresiones regulares y autómatas finitos English is not a finite state language. (Chomsky 1957)
ER y Búsquedas Se requiere: Patrón (qué se quiere buscar) Corpus (dónde se quiere buscar) Se tiene una función de búsqueda que recorre el corpus encontrando (y devolviendo) todas las ocurrencias del patrón Las ER son típicamente eficientes!
ER y Búsquedas Algunos ejemplos (Python): ER cabeza Patrón encontrado de la cabeza al sombrero! Vení para acá! [vv]agón [abc] en un vagón cargado de sandías solo de noche [0-9] Capítulo 1: Introducción [^A-Z] [^ss] Mañana va a ser un gran día Tengo permiso >>> m = re.search('cabeza', de la cabeza al sombrero ) >>> m.group(0) 'cabeza' >>>
ER y Búsquedas Algunos ejemplos (Python): ER Patrón encontrado [e^] símbolo ^ significa que a^b cuando encuentres a^b es casas? Juan había ido a casa de pec.s tenía pecas en toda la cara /beee*!/ La oveja hace beeeeee! /bee+!/ La oveja hace beeeeee! /^.*Juan vino\../*$/ Carlos cerveza. Juan vino. José agua. /\bel\b/ Caminaba por el camino de >>> re.search('.*juan vino\..*$','carlos cerveza. Juan vino. José agua.').group(0) 'Carlos cerveza. Juan vino. Jos\xe9 agua.' >>>
ER y Búsquedas Operadores avanzados \d dígito [0-9] \w cualquier carácter alfanumérico o espacio \s [\b\t\n] y las mayúsculas son la negación {n} n ocurrencias del carácter o expresión anterior {n,m} de n a m ocurrencias {n,} al menos n ocurrencias
ER y Sustituciones Sustitución: sustituye un patrón por otro >>> re.sub('([0-9]+)',r'<\1>','tenía el número 10 en la espalda') 'tenía el número <10> en la espalda' >>> Qué pasa con patrones múltiples? Alcanza con expresiones regulares?
ER y Sustituciones Paréntesis y operadores, pueden ser usados para especificar ciertas expresiones a sustituir Ejemplo: (1) hoy (.*)ro estar aquí, mañana \1ro morir NO - hoy quiero estar aquí, mañana quiero morir - hoy quiero estar aquí, mañana prefiero morir (2) hoy (.*)ro estar (.*), mañana \1ro morir \2 - hoy quiero estar aquí, mañana quiero morir aquí NO - hoy quiero estar aquí, mañana quiero morir allí Este tipo de facilidades son extensiones de las ER
Lenguajes regulares conjunto de strings denotados por expresiones regulares definidas sobre un alfabeto Σ Operaciones de clausura: intersección (L 1 L 2 ) diferencia (L 1 - L 2 ) complemento (Σ* - L 1 ) reverso (L 1r )
Máquina de estados En particular, nos interesan desde el punto de vista del reconocimiento de Lenguajes Regulares un lenguaje regular es el conjunto de strings sobre un alfabeto Σ reconocidos por autómatas finitos
Cualquier ER puede ser implementada por un AF y recíprocamente Lenguaje Regular representa a reconoce Expresión Regular puede convertirse a Autómata Finito
Ejemplo: el lenguaje de las ovejas lo podemos ver como secuencias (infinitas) de tiras bee! beee! beeee! beeeee! donde, la ER asociada sería /bee+!/
Formalmente M:(Q, Σ,δ,q 0,F) Q: conjunto finito de n estados Σ: alfabeto finito de símbolos de entrada q 0 : estado inicial F: conjunto de estados finales (o aceptores) F Q δ(q i,a)=q j función de transición entre estados δ: Q x Σ Q
el algoritmo anterior falla si no está definida la función δ se completa la función δ con un estado pozo
Como generadores de lenguajes Definición: un Lenguaje Formal es el conjunto de strings sobre un alfabeto finito Σ, para el cual existe un modelo M (que puede ser un AF) Lenguaje Formal vs. Lenguaje Natural
Para discutir
Autómata Finito NO Determinista Autómata Finito NO Determinista-ε
Formalmente, un AFND M:(Q, Σ,δ,q 0,F) Q: conjunto finito de n estados Σ: alfabeto finito de símbolos de entrada q 0 : estado inicial F: conjunto de estados finales (o aceptores) F Q δ(q i,a)={q j } función de transición entre estados δ: Q x Σ 2 Q donde Σ incluye ε si admite arcos rotulados con ε
En estos modelos, el problema es elegir el camino adecuado para procesar la tira Soluciones estándar: - Backup - Look-ahead - Paralelismo
Backup cada vez que hay que elegir, se coloca una marca: en qué lugar del buffer se hizo esa elección cuál fue el estado si falla, entonces se vuelve atrás hasta ese punto y se elige otro camino
Algoritmo de Thompson Fuente: http://swtch.com/~rsc/regexp/regexp1.html
Los AFD y los AFND reconocen lenguajes equivalentes. (Hopcroft 1979)
Historia 1959: Dana Scott y Michael Rabin: NDFA (Premio Turing 1976) 1968: Mc Naughton y Yamada, Ken Thompson: conversión regexp => nfa 1969: QED. Unix. Grep, Egrep. Perl, Javascript todos
Referencias J.Martin & D.Jurafsky. Speech and Language Processing. R.Cox. Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...) K.Thompson. Regular Expression Search Algorithm Hopcrofy & Ullman: Int. To Automata Theory, Languages and Computation