5. 5.1. ANÁLISIS SINTÁCTICO II ANÁLISIS SINTÁCTICO ROBUSTO Capacidad de analizar sintácticamente cualquier texto en LN • en cualquier dominio • sin restricciones Objetivo: devolver un análisis correcto o muy cercano al correcto • en presencia de errores • con partes desconocidas en la entrada Cuestiones a resolver: 1. Desambigüación: selección de la etiqueta más correcta entre las múltiples posibilidades existentes. 2. Troceado (chunking): división del texto en segmentos analizables sintácticamente. 3. Tratamiento de entradas fuera de cobertura léxica y/o sintáctica del analizador. • Problemas de subgeneración (undergeneration) Tratamiento de las entradas fuera de cobertura • Es difı́cil (casi imposible) definir completamente toda la gramática de un LN debido a la carencia de formalismos gramaticales apropiados. ◦ Sólo actualmente comienzan a construı́rse formalismos apropiados para representar lenguajes sensibles al contexto. • Es necesario admitir y manejar entradas incompletas y con errores. • Dos aproximciones: ◦ Uso de gramáticas aproximadas y de técnicas de corrección automática de errores. ◦ Uso de técnicas de inducción estadı́stica. ⋄ “Aprendizaje” de la gramática correcta a partir de un corpus analizado. ⋄ La gramatica está formada de reglas con probabilidades asociadas. Se busca el/los análisis más probable/s. 1 Corrección automática de errores. • Modo pánico: ◦ Aproximación más simple, usada en compiladores. ◦ Cuando el analizador se topa con un error deshace parte del análisis realizado y/o ignora parte de la entrada restante hasta llegar a un punto en el que puede proseguir con el análisis. ◦ Uso de sı́mbolos especiales de error. • Uso de contextos de error: ◦ Proceso más complejo que el del modo pánico, pero se obtienen correcciones mejores. ◦ Tres familias de algoritmos: ⋄ Algoritmos globales: Examinan la totalidad del texto. Carácter minimal en el texto. Coste computacional elevado. Ausencia de errores en cascada. Calidad óptima. ⋄ Algoritmos locales: Examinan el contexto inmediato. Zona fija de validación. Carácter minimal en dicha zona. Coste computacional bajo. Abundancia de errores en cascada. Calidad pobre. ⋄ Algoritmos regionales: Examinan el contexto del error. Zona variable de validación. Carácter minimal en dicha zona. Coste computacional equivalente al local en el mejor de los casos, equivalente al global en el peor de los casos. Capacidad de reconsideración de errores en cascada. Calidad óptima (equivalente a los globales). • Operaciones de edición: ◦ Usadas en los tres modelos anteriores de correción de errores. ◦ Modificaciones simples de la entrada. ⋄ inserción de un terminal previamente al próximo a analizar. ⋄ borrado del próximo terminal a analizar. ⋄ reemplazamiento del próximo terminal a analizar por otro. 2 ◦ Se seleccionan secuencias de operaciones que permiten obtener una entrada concordante con la gramática. ◦ Asociación de costes a las operaciones de edición y elección de la reparación con menor coste. 5.1.1. ALGORITMO DE LYON Algoritmo de corrección automática de errores global. Construı́do a partir del algoritmo de Earley, aplicando tres hipótesis de error: inserción, borrado y modificación de un terminal. El objetivo del algoritmo es reconocer la cadena o cadenas pertenecientes al lenguaje con un número mı́nimo de hipótesis de error respecto a la entrada. Este problema es abordable por métodos de programación dinámica debido a que el cálculo del error acumulado en el reconocimiento de un no terminal es separable. Esto es, los subanálisis de las diferentes categorı́as presentes en el mismo análisis contribuyen a su cálculo sin interferencia entre ellos. Para una regla “X → Y Z” el error acumulado en el reconocimiento de X será la suma de los errores acumulados en el reconocimiento de Y y Z. Si estos son mı́nimos, entonces el error en el reconocimiento de X también lo será. OPERACIÓN Se adoptan los mismos conceptos de chart y estado que en el algoritmo de Earley. Para llevar cuenta de las hipótesis de error en cada rama de análisis se añade al estado un nuevo campo llamado contador de errores. La adición de estados se rige por el criterio de optimalidad. Si un estado I = A → α.β (i, j, e), donde e es el contador de error, es candidato al almacenamiento en la entrada del chart j, donde ya existe un estado similar I ′ = A → α.β (i, j, e′ ), I es rechazado si e′ ≤ e. Sin embargo, si e < e′ , entonces I ′ es reemplazado por I. El algoritmo procesa en orden de derecha a izquierda todas las entradas del chart. 1. Cada i entrada es inicializada con un estado A → .α(i, i, 0) para cada regla A → α de la gramática. 2. Se aplica el operador scanner a cada uno de los estados de la entrada. 3. Se aplica el operador complección a cada uno de los estados finales obtenidos. Se sigue aplicando mientras haya estados finales no cubiertos. 4. Se repiten los pasos 2 y 3. 3 En la última entrada del chart, una vez terminado el procesamiento, se busca un ı́tem final Φ → S. (0, n, e) que expresa el reconocimiento de la cadena de entrada con un error acumulado mı́nimo e. SCANNER Es el operador responsable de la aplicación de las hipótesis de error. Dado un estado A → α.aβ (i, j, e): • Coincidencia.- Si el siguiente terminal en la cadena de entrada es “a”, se genera un nuevo estado A → αa.β (i, j + 1, e), representando el reconocimiento de dicho terminal con coste cero, de la misma forma que en el algoritmo de Earley. • Hipótesis de reemplazamiento.- Si el siguiente terminal en la cadena de entrada no es “a”, se genera un nuevo estado A → αa.β (i, j + 1, e + 1), simulando el reconocimiento de “a”. Se supone que el error proviene de haber reemplazado dicho terminal por otro en la entrada. • Hipótesis de borrado.- Se genera un nuevo estado A → αa.β (i, j, e + 1), simulando la inserción del terminal “a”. Se supone que el error proviene del borrado de “a” en la entrada. • Hipótesis de inserción.- Se genera el estado A → α.aβ (i, j + 1, e + 1), simulando el borrado del sı́mbolo actual de la entrada. Se asume que el error proviene de haber insertado dicho sı́mbolo. El reconocedor aplica todas las hipótesis a los estados, es decir, cubre todas las posibilidades. Esto tiene su explicación en el hecho de que en un contexto de errores ninguna posibilidad puede ser descartada, puesto que tal contexto no es fiable. COMPLETER Es el mismo operador que en el algoritmo de Earley, con la diferencia de que ahora debemos calcular el contador de error y la selección de los estados finales sobre los que se aplicará completer se realizará siguiendo un cierto orden. Para cada uno de los estados finales A → α. (i, j, e), se busca en la entrada del chart i designada por su puntero de retroceso, los estados B → β.Aγ (l, i, e′ ) a la espera del reconocimiento del sı́mbolo no terminal “A”. Para cada uno de estos estados se crea uno nuevo B → βA.γ (l, j, e′ + e) en la entrada actual del chart. 4 Los estados finales se procesan en orden descendente por su puntero de retroceso. Esto es, seleccionan primero aquellos estados finales con un puntero de retroceso más a la derecha. De este modo, se asegura que si esposible volver a generar mediante completer un ı́tem final ya existente, de forma que el nuevo estado tenga un contador menor, se haga antes de procesar dicho ı́tem ya existente. Cuando se procesa un grupo de estados con el mismo puntero de retroceso, se seleccionan en orden ascendente por su contador de error. Esto es, Se elige primero a aquellos estados finales con un contador de error mı́nimo. De esa manera, si al aplicar este operador generamos dos estados iguales excepto en el contador de error, nos aseguramos de que primero se genere aquel con el menor contador. Sea la gramática aumentada definida por las reglas: (0) Φ → S (1) S → Y (2) Y → b (3) Y → U (4) U → a y los algunos ı́tems generados en el reconocimiento de “a”. Φ S Y Y U Entrada 0 → .S (0, 0, 0) → .Y (0, 0, 0) → .b (0, 0, 0) → .U (0, 0, 0) → .a (0, 0, 0) S Y Y U Entrada 1 → Y. (0, 1, 0) → b. (0, 1, 1) → U. (0, 1, 0) → a. (0, 1, 0) Ej.- Supongamos que el primer estado final en 1 sobre el que se aplica la operación completer es Y → b. (0, 1, 1). Se encontrarı́a S → .Y (0, 0, 0) como estado abandonado sobre el que se puede reconocer Y , por lo que se genera un nuevo estado I = S → Y. (0, 1, 1), sobre el que seguir operando. Supongamos que, a continuación, se escoge como siguiente estado final objeto de aplicación del operador completer a U → a. (0, 1, 0). Encontraremos abandonado en 0 a Y → .U (0, 0, 0), y se genera un nuevo estado final Y → U., (0, 1, 0). Si aplicamos el operador de completer a este último estado, encontramos abandonado en 0 a S → .Y (0, 0, 0) y se genera I ′ = S → Y. (0, 1, 0). Nótese que I e I ′ sólo difieren en el contador de error. Dado que el de I ′ es menor, I ′ reemplazará a I. El problema aquı́ no es la generación de dos estados en el mismo conjunto, que sólo se diferencian en su contador de error, sino el orden en que han sido generados. Cuando I ′ reemplaza a I, las operaciones de scanner o completer aplicadas a éste deben ser repetidas para I ′ . De esta manera nos aseguramos 5 que el contador de error 0 de este nuevo subanálisis óptimo se propague por todos los análisis que lo contienen. Esta repetición de operaciones para I e I ′ no es necesaria si I ′ es generado primero. En este caso, cuando se genera I con un contador de error 1, se chequea que ya existe I ′ con un contador menor, y el primer estado es descartado. Interesa que, de existir la posibilidad de generar dos estados idénticos excepto en el contador de errores, se genere primero aquel con contador menor. Sobre los estados resultantes de completer se aplica scanner de la forma siguiente. Sea A → α.β(i, j, e) un estado resultante de la aplicación del operador completer, se calculará los estados resultantes de reconocer la parte β de la regla vı́a hipótesis de borrado (esto es, simulando inserciones). Entre otros se obtendrá un nuevo estado final A → αβ.(i, k, e + e′ ), donde e′ es el error acumulado en el reconocimiento de β. Ej.- Supongamos una gramática (0) Φ → A (1) A → aV cXY (2) V → b (3) X → bb (4) X → aba (5) Y → d Comenzando con el estado resultate de completer A → aV.cXY (0, 2, 1), simuları́amos inserciones obteniendo los estados A → aV c.XY (0, 2, 2), A → aV cX.Y (0, 2, 4), A → aV cXY. (0, 2, 1). Las cantidades añadidas a los contadores de error cuando se aplica la hipótesis de borrado sobre los no terminales “X” e “Y ”, se calculan previamente a la ejecución del algoritmo como el número mı́nimo de hipótesis de borrado a aplicar para reconocer el sı́mbolo no terminal correspondiente. Ejemplo: Queremos analizar “aa” , dada la siguiente gramática: (0) Φ → S (1) S → aS (2) S → b 6 coste(Φ) = 2 coste(S) = 1 0 I1 I2 I3 I4 I5 I6 I7 Φ → . S (0, 0, 0) S → . a S (0, 0, 0) S → . b (0, 0, 0) S → a . S (0, 0, 1) S → b . (0, 0, 1) Φ → S . (0, 0, 1) S → a S . (0, 0, 2) 1 I8 I9 I10 I11 I12 I13 I14 I15 I16 I17 I18 S → . a S (1, 1, 0) S → . b (1, 1, 0) S → a . S (0, 1, 0) S → . a S (0, 1, 1) S → b . (0, 1, 1) S → . b (0, 1, 1) S → a . S (1, 1, 1) S → b . (1, 1, 1) S → a S . (0, 1, 1) S → a S . (1, 1, 2) Φ → S . (0, 1, 1) 3 I19 I20 I21 I22 I23 I24 I25 I26 I27 I28 I29 I30 I31 I32 I33 I34 S → . a S (2, 2, 0) S → . b (2, 2, 0) S → a . S (1, 2, 0) S → . a S (1, 2, 1) S → b . (1, 2, 1) S → . b (1, 2, 1) S → a . S (0, 2, 1) S → .a S (0, 2, 2) S → b . (0, 2, 2) S → . b (0, 2, 2) S → a . S (2, 2, 1) S → b . (2, 2, 1) S → a S . (1, 2, 1) S → a S . (0, 2, 1) S → a S . (2, 2, 2) Φ → S . (0, 2, 1) 7 5.2. GRAMÁTICAS DE CLÁUSULAS DEFINIDAS (GCDs ó DCGs) INTRODUCCIÓN Necesidad de formalismos sintácticos más expresivos. Uso de gramáticas lógicas o de unificación: • Los componentes tienen estructura: ◦ términos de lógica de predicados. ◦ estructuras de rasgos (feature estructures). • Posibilidad de representar restricciones: ◦ concordancia de género y número. ◦ subcategorización verbal. • Otras ventajas: ◦ modelización de fenómenos más complejos que los soportados por CFGs. ◦ soporta la construcción de representaciones semánticas a partir de las estructuras sintácticas. GRAMÁTICAS DE CLÁUSULAS DEFINIDAS Muchas implementaciones de Prolog permiten analizar DCGs: • Ventajas: ◦ No hay que construı́r el analizador. ◦ Diseño y depuración de gramáticas muy rápido. ◦ Eficiencia razonable. • Inconvenientes: ◦ Estrategia descendente fija. ◦ Orden de tratamiento fijo (izquierda a derecha). ◦ Orden de aplicación de cláusulas estricto. ◦ Gestión de la recursividad izquierda. ◦ Repetición de cálculos y generación de subárboles inútiles. ◦ Rigidez. 8 Notación DCGs: • Oculta la implementación real. • Reglas: ◦ no terminal -->cuerpo ◦ no terminales: átomos Prolog. ◦ cuerpo: terminales y no terminales separados por “,”. ◦ cadenas de terminales: listas de átomos Prolog. S --> [a],[b],S. S --> [c]. S --> fn,fv. fn --> det,nom. fv --> verbo,fn. det --> [el]. nom --> [Pepe] nom --> [ni~ no]. verb --> [come]. TRADUCCIÓN DE LA NOTACIÓN DCG A PROLOG Construcción de cláusulas Prolog asociadas a las reglas. Uso de la diferencia de listas (hay otras formas, con append). • no terminales ≡ predicados. • uso de argumentos adicionales para implementar la diferencia de listas. S --> fn,fv. det --> [el]. => => S(X,Z) :- fn(X,Y), fv(Y,Z). det([el|X],X). Análisis: llamada al axioma usando 2 listas • Lista con texto a analizar. • Lista con resto de entrada. ?- S([el, ni~ no, corre], []). ?- S([el, ni~ no, corre], [un,bocata]). • Si hay atributos. ?- S(<...>, listaE, listaR). 9 USO DE RESTRICCIONES. Adición de argumentos en los no terminales. Concordancia: género, número, persona. fn(Num,Gen) --> det(Num,Gen),nom(Num,Gen). det(masc,sing) --> [el]. nom(masc,sing) --> [ni~ no]. Se representa: • Propagación de atributos: “fn” toma los atributos de “nom”. • Establecimiento de restricciones: “Num” y “Gen” deben coincidir para “det” y “nom”. Otra notación: uso de atributos nombrados. fn(numero:N,genero:G) --> det(numero:N,genero:G), nom(numero:N,genero:G). det(numero:sg,genero:fem) --> [la]. Subcategorización verbal. • Algunos verbos admiten determinadas estructuras acompañándolos. • Codificar esas combinaciones (subcategorization frames) y añadirlas como atributos en reglas y en los terminales para cada verbo (un verbo puede tener más de un frame). fv(Persona,Numero,fn) --> verb(Persona,Numero,fn), fn(_,_). fv(P,N,fn_fp) --> verb(P,n,fn_fp), fn(_,_), fp(_,_). • Uso de estructuras más complejas (listas, etc...). verbo(3p,sg,fn) --> [corre]. verbo(1p,sg,fn) --> [regalo]. verbo(1p,sg,fn_fp) --> [regalo] regalo un coche regalo un coche a mis alumnos Existe subcategorización para otras categorı́as léxicas (adverbios, etc...). 10 PREDICADOS PROLOG Se utiliza para codificar restricciones no codificables como atributos en los átomos. num1a100 --> [X], {integer(X), X >= 1, X =< 100}. ÁRBOL DE ANÁLISIS Hasta ahora hemos visto sólo la implemetación de DCGs como reconocedores. Podemos obtener un árbol de análisis como un término Prolog. s(fn(det(el),n(ni~ no)),fv(v(come))). Para construı́r dichos términos podemos utilizar atributos y unificación. s(s(FN,FV)) --> fn(FN),fv(FV). fn(fn(DET,N)) --> det(DET),n(N). fv(fv(V,FN)) --> v(V),fn(FN). fv(fv(V)) --> v(V). det(det(el)) --> [el]. det(det(un)) --> [un]. n(n(ni~ no)) --> [ni~ no]. n(n(guardia)) --> [guardia]. v(v(come)) --> [come]. LENGUAJES SENSIBLES AL CONTEXTO Hasta ahora hemos utilizado las DCGs para analizar lenguajes independientes del contexto. Podemos utilizar las restricciones y la unificación para codificar lenguajes sensibles al contexto. an bn cn , 0 ≤ n es un ejemplo de lenguaje NO independiente del contexto. Podemos codificarlo con una DCG. Para ello, utilizamos un atributo Cont para asegurar que el número de terminales a, b y c es el mismo. 11 s(Cont) --> ablock(Cont),bblock(Cont),cblock(Cont). bloquea(0) --> []. bloquea(succ(Cont)) --> [a],bloquea(Cont). bloqueb(0) --> []. bloqueb(succ(Cont)) --> [b],bloqueb(Cont). bloquec(0) --> []. bloquec(succ(Cont)) --> [c],bloquec(Cont). 5.3. ANÁLISIS SINTÁCTICO PARCIAL O SUPERFICIAL Algunas aplicaciones no requieren análisis sintácticos de cobertura completa. • Sólo es necesaria la identificación de ciertas estructuras. • Ej.- Extracción/Recuperación de información. Muchos sistemas de análisis parcial están basados en cascadas de autómatas finitos. • Más efificentes que análizadores de GICs. • Menos cobertura que GICs (falta de ciertas reglas recursivas). Estos sistemas identifican sintagmas o grupos básicos. Ej.- FASTUS Nombre Compañı́a: Grupo verbal: Grupo nominal: Grupo verbal: Grupo nominal: Preposición: Lugar: ... Bridgestone Sports Co. said it had set up a joint venture in Taiwan Vamos a ver un subconjunto de las reglas que permiten identificar grupos nominales en FASTUS. Vamos a utilizar una notación basada en reglas de producción. En primer lugar un grupo nominal puede estar constituı́do de un pronombre, un grupo de tiempo (yesterday) o una fecha: GN → P ronombre | GrupoT iempo | F echa 12 También puede estar compuesto de pronombres demostrativos (this, that, ...) o un nombre principal precedido de: a) una secuencia de adjetivos, b) un grupo que actua como modificador (thequick and dirty solution); y c) un gerundio. (the rising index) GN → (Adjs) (GM ) N P s | GM Ger N P s | GM C (and N P s) Los paréntesis indican opcionalidad. Puede haber dos variedades de grupos modificadores: Parciales y completos. GM → GM C | GM P Los grupos modificadores completos son: a) sintagmas (only five, another three, this, many, hers, all y the que pueden aparecer antes de un número (almost five, pronombres posesivos que pueden aparecer como frases (mine, his); y d) cuantificadores como many, few, much. nominales completos most); b) adverbios precisely five, ...); c) nominales completas GM C → ( { Adv pre num | another | | { Det | P ro P os } ( { Adv pre num | only (other) } ) } )N umero | Cu | Cu + er | (the) Cu + est | another | Det cp | Det Cu | P ro P os C Los grupos modificadores parciales son aquellos que no sirven como sintagmas nominales completos (the, his only, every, a) o pronombres posesivos que tampoco tienen entidad suficiente como sintagma nominal. GM C → { { Det | P ro P os } only | a | an | Det in | P ro P os in } (other) | (GM C) other Una secuencia de adjetivos consiste en uno o más adjetivos (o gerundios o participios actuando como adjetivos) separados por comas o conjunciones (big, bad and ugly o interesting but outdated). Adjs → SAdj ( {, |(, ) Conj} {SAdj|P articipio} )∗ Los sintagmas adjetivos pueden ser adjetivos, participios, ordinales, combinaciones nombre-verbo (man-eating) y pueden ser modificados por cuantificadores comparativos o superlativos (more, fewest, most, fewest, ...). A su vez, los nombres pueden ser combinados usando conjunciones. N P s → N P (and N P ) 13 También hay nombres compuestos y comninaciones de nombres (gasoline and oil tanks, California wines o quick-reaction strike). N P → N omP ropio | {P reN s | N omP ropio} N ombre | {N omP ropio N ombreComun} Donde P reN s se refiere a modificadores nominales formados por nombres compuestos y adjetivos que pueden aparecer en ese rol (presidential retreat). P reN s → P reN ( and P reN 2 )∗ P reN → ( Adj −)N omComunSingular P reN 2 → P reN | Ordinal | AdjN ominal Estas raglas se usarı́an para construir un traductor finito o una red de transicion recursiva (RTN) El principal fenómeno que no pueden reproducir estas construcciones es el de la recursividad. En el caso anterior de los grupos nominales, seria imposible reproducir grupos nominales superiores formados por la combinación de varios grupos nominales (cláusulas relativas ...) La solución a esto es una cascada de autómatas (o más bien traductores) finitos. La salida de cada uno de ellos sirve para alimentar al siguiente, de forma que si no encontramos un grupo nominal formado por la combinación de otros dos, el primer autómata identificará estos y el segundo aquel. En FASTUS, sólo se permite un número de pasos recursivos fijos de antemano. El segundo nivel de FASTUS encuentra grupos nominales no recursivos, el tercero los combina en sintagmas nominales como: • Frases de medida: 2000 iron and “metal wood” clubs a month • Frases preposicionales: production of 2000 iron and “metal wood” clubs a month • Conjunción de grupos nominales: a local concern and a Japanese company. En un sistema de un sólo nivel, serı́a necesario tratar con reglas recursivas (GN → GN and GN ), lo que no serı́a posible usando autómatas finitos. El usar cascadas de autómatas evita ese problema convirtiendo los GN del lado derecho de la regla en antidades distintas del GN del lado izquierdo de la regla. 14 5.4. ANÁLISIS SINTÁCTICO ESTADÍSTICO 5.4.1. Introducción GICs estocásticas o probabilı́sticas: incorporan una probabilidad asociada a cada regla de producción, que indica el hecho de que algunas reescrituras son más comunes que otras. La única restricción impuesta es que las probabilidades de todas las reglas con la misma parte izquierda (reescritura de un mismo sı́mbolo) tienen que sumar 1. Formalmente, una GICs estocástica es una tupla G = {N, Σ, P, S} donde N es el conjunto de sı́mbolos no terminales o categorı́as sintácticas, Σ es el conjunto de sı́mbolo terminales o categorı́as léxicas, S es el sı́mbolo raı́z de la gramática y P es el conjunto de reglas de producción A → α, con A ∈ N y α ∈ (N ∪ T )∗ . Cada regla, además, tiene P asociada una probabilidad, y este conjunto de probabilidades verifica que α P (A → α) = 1, ∀A ∈ N . Es importante recordar que al decir P (A → α) nos referimos en realidad a P (A → α|A), con lo que para cualquier sı́mbolo no terminal A, la gramática proporciona la distribución de probabilidades de todas sus posibles transformaciones α. El cálculo de una gramática estocástica puede ser manual (en casos pequeños) o automático a partir de un corpus anotado (sintácticamente). El objetivo de las gramáticas estocásticas es que, en caso de analizar una frase ambigüa, obtener aquel análisis con mayor probabilidad (pueden ser varios). Para asignar una probabilidad a una frase s de acuerdo a una gramática G X X P (s) = P (s, t) = P (t) t t:hojas(t)=s donde la variable t recorre el espacio de todos los posibles árboles de análisis para las cuales la secuencia de nodos hoja, leı́da de derecha a izquierda, coincide con la frase s. Asumiendo la hipótesis de que todas las reglas de una gramática estocástica G son independientes, la probabilidad de un nodo cualquiera de un árbol t se calcula recursivamente como el producto de las probabilidades de sus subárboles locales y de la probabilidad de la regla de producción de G que los une. La probabilidad de un árbol t viene dada, pues por la probabilidad de su nodo raı́z. Ejemplo: Sea una GICs estocástica G = {N, Σ, P, S}, con N = {S, A, B, C}, T = {a, b} y el conjunto P de producciones (con sus respectivas probabilidades) 15 es: S → A B (0,25) S → B C (0,75) A → B A (0,25) A→a (0,5) B → C C (0,1) B→b (0,9) C → A B (0,2) C→a (0,8) La frase s = bbab tiene dos posibles árboles de análisis. En la siguiente figura aparecen ambos árboles, en cuyos nodos internos aparece como subı́ndice la probabilidad de las reglas mediante la cual generan los subárboles que encabezan. La probabilidad de cada árbol serı́a: P (t1 ) = 0,9 ∗ 0,9 ∗ 0,5 ∗ 0,5 ∗ 0,5 ∗ 0,9 ∗ 0,25 = 0,02278 P (t2 ) = 0,9 ∗ 0,9 ∗ 0,5 ∗ 0,5 ∗ 0,9 ∗ 0,2 ∗ 0,75 = 0,02733 Y la probabilidad ds s es P (s) = P (t1 ) + P (t2 ) = 0,02278 + 0,02733 = 0,05011 5.4.2. Caracterı́sticas de las gramáticas estocásticas Permiten determinar la probabilidad de cada árbol de análisis en caso de tener varias alternativas. Esto es útil en gramáticas muy complejas donde la posibilidad de ambigüedad es muy alta, porque nos permite, en lugar de ofrecer todos los análisis posibles, seleccionar el que tiene asociada una mayor probabilidad. Un método muy utilizado para la construcción de gramáticas complejas es la inferencia a partir de un corpus. Aunque lo usual es partir de un corpus anotado, también es posible utilizar uno sin anotar. En este caso, es necesario 16 utilizar ejemplos negativos (gramaticalmente incorrectos) para poder inferir una GIC. Tales ejemplos negativos no son necesarios si el objetivo es obtener una GIC estocástica. Las gramáticas estocásticas representan un buen compromiso de robustez. En muchos casos, estas gramáticas son aprendidas a partir de corpora, en donde aparecen, junto a textos correctos, los errores más comunes cometidos por los hablantes. Si esos errores se utilizan en el proceso de entrenamiento para generar la gramática, darán lugar a reglas (erróneas) con probabilidades muy bajas, que servirán para analizar frases o textos conteniendo esos mismos errores. Existen idiomas para los que nos n-gramas (con n > 1) podrı́an constituı́r un modelo de lenguaje mejor que las gramáticas estocásticas. Los n-gramas tienen en cuenta ciertas dependencias contextuales entre elementos concretos del léxico que, en general, las gramáticas no usan. Las gramáticas estocásticas no son del todo imparciales. En primer lugar, la probabilidad de un árbol pequeño es mayor que un árbol grave, asignándose mayor masa de probabilidad a los árboles pequeños que a los grandes. Además, los sı́mbolos no terminales con un número bajo de posibles reescrituras (aparecen en la parte izquierda de un pequeño número de reglas) se ven favorecidos frente a los no terminales con un gran número de posibilidades, ya que las reglas idividuales de estos últimos tendrán probabilidades más bajas. Las gramáticas independientes del contexto, incluso las estocásticas, no parecen representar bien ciertos fenómenos tı́picos de los lenguajes naturales. Si las producciones de una gramática estocástica cumplen la restricción de que las probabilidades de todas las reglas con la misma parte izquierda sumen 1, cabe esperar que: X X P (s) = P (t) = 1 t s∈L(G) es decir, la suma de las probabilidades de las frases reconocidas por la gramática es 1, al igual que la suma de probabilidades de sus árboles de análisis. En realidad, esto sólo ocurre si las masa de probabilidad de las reglas se acumula en un número finito de árboles de análisis. Ejemplo: Sea una gramática estocástica G con N = {S}, Σ = {a} y P = {S → a ( 31 ), S → SS ( 32 )} Esta gramática genera frases de la forma a, aa, aaa, . . . . Sin embargo, las probabilidades de estas frases son: P (a) = 31 2 P (aa) = 23 ∗ 31 ∗ 13 = 27 P (aaa) = ( 32 )2 ∗ ( 13 )3 ∗ 2 = .. . 17 8 243 2 La probabilidad del lenguaje L(G) serı́a la suma de la serie infinita 13 + 27 + 1 8 + . . . , la cual tiende a 2 . Por tanto, la mitad de la masa de probabilidad ha 243 desaparecido en en conjunto infinito de árboles que no generan frases de este lenguaje. Distribuciones de probabilidad como la del ejemplo anterior se denominan normalmente distribuciones inconsistentes. En la práctica, la posibilidad de distribuciones inconsistentes no presenta grandes problemas, dado que lo que interesa en en análisis sintáctico estocástico es la comparación de probabilidades entre diferentes análisis, y, además, está demostrado que si los parámetros de una gramática estocástica son obtenidos a través de un corpus anotado (bancos de árboles) siempre se puede obtener distribuciones de probabilidad consistentes. 5.4.3. Relación entre gramáticas estocásticas y HMMs Las mismas preguntas fundamentales que se han planteado para los Modelos de Markov, son también aplicables a gramáticas estocásticas. De hecho, un HMM puede ser visto como una gramática regular estocástica. Preguntas fundamentales de las gramáticas estocásticas: 1. Dada una frase s y una gramática G, ¿cuál es la probabilidad P (s|G), es decir, la probabilidad de la frase s de acuerdo con la gramática G? 2. ¿Cuál es el argmaxt P (t|s, G), es decir, el árbol de análisis más probable para la frase s? 3. ¿Cómo podemos elegir el argmaxG P (s|G), es decir, las probabilidades de las reglas de G que maximizan la probabilidad de una frase s? Primera pregunta: la probabilidad de una frase de acuerdo con una gramática se puede calcular como la suma de las probabilidades de todos sus árboles de análisis. Sin embargo, una simple suma no es un buen método de cálculo, porque el número de análisis puede crecer exponencialmente con la longitud de la frase. Para solucionar este problema, existen algoritmos especializados para realizar esta cálculo de una manera más eficiente como el algoritmo de las probabilidades externas y el algoritmo de las probabilidades internas, que se apoyan en las siguientes definiciones de probabilidad de un nodo del árbol: j P robabilidades externas : αj (p, q) = P (w1(p−1) , Npq , w(q+1)n |G) j P robabilidades internas : βj (p, q) = P (wpq |Npq , G) j donde wik es la secuencia de palabras wi , wi+1 , . . . , wk y Npq es el subárbol j encabezado por el sı́mbolo no terminal N que produce la secuencia de palabras wpq . El algoritmo de probabilidades externas es un algoritmo de programación 18 dinámica similar al algoritmo hacia adelante de HMMs, mientras que el algoritmo de probabilidades internas es similar al algoritmo hacia atrás. Segunda pregunta: existe un algoritmo especializado para buscar el análisis más probable para una frase, parecido al algoritmo de Viterbi para buscar el camino más probable a través de un HMM. Sin embargo, lo más habitual es tomar un algoritmo de análisis sintáctico ya existente y modificarlo para tener en cuenta la presencia de probabilidades. Tercera pregunta: existen algoritmos de entrenamiento de gramáticas estocásticas. Se asume que la estructura previa de la gramática (conjuntos sı́mbolos terminales, no terminales y reglas) se conoce de antemano, de modo que proceso de entrenamiento sólo intenta optimizar las probabilidades de las reglas. Para respetar la restricción de que las probabilidades de las reglas con la misma parte izquierda sumen 1, se pueden determinar las probabilidades como: veces que aparece A → α P (A → α) = P β veces que aparece A → β con A ∈ N y α, β ∈ (N ∪ Σ)∗ En un banco de árboles, estas probabilidades pueden calcularse directamente. Si no se tiene un corpus anotado, se puede utilizar un algoritmo EM (Expectation-Maximization) que toma una gramática estocástica inicial y un corpus no anotado, y ajusta las probabilidades de las reglas de la gramática de manera que las frases de dicho corpus obtengan la máxima probabilidad posible. 5.4.4. Algoritmo de Earley Una forma de responder a las preguntas fundamentales 1 y 2 es utilizar un algoritmo de análisis sintáctico para GICs y modificarlo para tener en cuenta el cálculo de las probabilidades de los árboles. El algoritmo de Earley puede contemplar las probabilidades de las reglas con las siguientes modificaciones: • Se añade a la estructura del ı́tem un nuevo campo con la probabilidad del análisis hasta el momento. • El operador predictor añade items con probabilidad 1. • El operador scanner añade un item con la misma probabilidad que el ı́tem de partida. • El operador completer calcula la probabilidad del ı́tem resultante de de su aplicación como el producto de las probabilidades de a) el estado final, b) la regla del estado final y c) el ı́tem en espera del reconocimiento del no terminal. 19 • Si sólo que quieren obtener el/los árbol/es de análisis más probables: ◦ Introducir un test de incorporación de un ı́tem a su entrada de chart correspondiente, parecido al del algortimo de Lyon: si ya hay un item igual a él en la regla de la gramática, posición del pto y punteros, pero con probabilidad diferente, nos quedamos con el item con mayor probabilidad. ◦ Prescribir un orden de aplicación de completer análogo al del algoritmo de Lyon: orden descendente de puntero de retroceso y descendente de probabilidad. 5.5. Gramáticas de Adjunción de Árboles 20