5. analizador cyk - upmlorien.die.upm.es/juancho/pfcs/dpf/capitulo5.pdf · se ha dicho, el...

30
Capítulo 5. Analizador CYK Pagina 50 5. ANALIZADOR CYK En este capítulo, se va a describir el funcionamiento del analizador sintáctico que va a ser objeto de nuestro estudio, así como el algoritmo de análisis que utiliza. En esta primera parte, nos vamos a centrar en el sistema de reconocimiento de una lengua natural (el castellano), que fue resultado del desarrollo de un proyecto fin de carrera anterior al que nos ocupa, y que fue realizado por Juan Manuel Montero Martínez y cuyo título es: "Desarrollo de un entorno para el análisis sintáctico de una lengua natural: aplicación al castellano." (Montero[92]). Sentaremos las bases sobre las que vamos a trabajar, y en el siguiente capítulo desarrollaremos las nuevas posibilidades que se le han dado al mencionado analizador. 5.1 INTRODUCCIÓN. Este analizador, utiliza el método de "parsing" para analizar un texto. Este método, que consiste en el reconocimiento de que una cadena pertenece a un lenguaje, admite más posibilidades al usarse gramáticas de contexto libre que el reconocimiento de lenguajes regulares mediante autómatas, donde la única variación consiste en construir un autómata como la unión de muchos otros subautómatas. Se va a disponer de un fichero de reglas sintácticas. La forma más inmediata de análisis, consiste en convertir cada regla en un procedimiento o función. La parte izquierda de dicha regla, da nombre a la función y la derecha, nos indica qué procedimientos y en qué secuencia debemos llamarlos para verificar la aplicabilidad de la regla. Como los símbolos terminales no tienen procedimiento asociado, al encontrarnos uno, comprobaremos si coincide con el símbolo que estábamos esperando reconocer. De ser así, avanzaremos al símbolo siguiente y proseguiremos el análisis hasta poder devolver un código de aceptación; en el caso de haber diferido, intentaremos aplicar otra regla que, por tener el mismo símbolo no terminal a la izquierda, estará integrada en la misma función. Si no existieran más reglas o no fuesen aplicables, devolveremos a la función que nos llamó, un código de error. En cualquier lenguaje de programación moderno, es fácil diseñar así un compilador de compiladores (un programa que genera un programa que reconoce cadenas acordes con una gramática dada), pero: La complejidad, debida al retroceso causado por los errores, es exponencial con la longitud en caracteres de la cadena en estudio. La posibilidad de tener que generar diversos análisis para una misma frase multiplica aún más la lentitud del "parsing". El ordenamiento de las reglas influye en los resultados: las reglas recursivas a izquierdas, deben ser las últimas en ser usadas a la hora de comparar patrones

Upload: others

Post on 15-May-2020

4 views

Category:

Documents


1 download

TRANSCRIPT

Capítulo 5. Analizador CYK Pagina 50

5. ANALIZADOR CYK

En este capítulo, se va a describir el funcionamiento del analizador sintácticoque va a ser objeto de nuestro estudio, así como el algoritmo de análisis que utiliza. Enesta primera parte, nos vamos a centrar en el sistema de reconocimiento de una lenguanatural (el castellano), que fue resultado del desarrollo de un proyecto fin de carreraanterior al que nos ocupa, y que fue realizado por Juan Manuel Montero Martínez ycuyo título es: "Desarrollo de un entorno para el análisis sintáctico de una lenguanatural: aplicación al castellano." (Montero[92]).

Sentaremos las bases sobre las que vamos a trabajar, y en el siguiente capítulodesarrollaremos las nuevas posibilidades que se le han dado al mencionado analizador.

5.1 INTRODUCCIÓN.

Este analizador, utiliza el método de "parsing" para analizar un texto. Estemétodo, que consiste en el reconocimiento de que una cadena pertenece a un lenguaje,admite más posibilidades al usarse gramáticas de contexto libre que el reconocimientode lenguajes regulares mediante autómatas, donde la única variación consiste enconstruir un autómata como la unión de muchos otros subautómatas. Se va a disponerde un fichero de reglas sintácticas. La forma más inmediata de análisis, consiste enconvertir cada regla en un procedimiento o función. La parte izquierda de dicha regla,da nombre a la función y la derecha, nos indica qué procedimientos y en qué secuenciadebemos llamarlos para verificar la aplicabilidad de la regla. Como los símbolosterminales no tienen procedimiento asociado, al encontrarnos uno, comprobaremos sicoincide con el símbolo que estábamos esperando reconocer. De ser así, avanzaremos alsímbolo siguiente y proseguiremos el análisis hasta poder devolver un código deaceptación; en el caso de haber diferido, intentaremos aplicar otra regla que, por tener elmismo símbolo no terminal a la izquierda, estará integrada en la misma función. Si noexistieran más reglas o no fuesen aplicables, devolveremos a la función que nos llamó,un código de error.

En cualquier lenguaje de programación moderno, es fácil diseñar así uncompilador de compiladores (un programa que genera un programa que reconocecadenas acordes con una gramática dada), pero:

• La complejidad, debida al retroceso causado por los errores, es exponencialcon la longitud en caracteres de la cadena en estudio.

• La posibilidad de tener que generar diversos análisis para una misma frasemultiplica aún más la lentitud del "parsing".

• El ordenamiento de las reglas influye en los resultados: las reglas recursivas aizquierdas, deben ser las últimas en ser usadas a la hora de comparar patrones

Capítulo 5. Analizador CYK Pagina 51

para evitar bucles infinitos, o bien, debemos limitar la profundidad derecursión, método siempre arriesgado, conflictivo y un tanto arbitrario.

Entre las ventajas, destaca lo directo que es añadir rasgos al "parsing", ya que noserán sino parámetros de las llamadas a las distintas funciones.

Frente a este procedimiento descendente, existe otro ascendente, con el cual, apartir de los símbolos terminales que componen el texto, iremos sacando otros noterminales que permitan generar a los primeros. De esos símbolos no terminales,obtenidos en el paso anterior, conseguiremos otros no terminales igualmente, y asísucesivamente hasta que consigamos el axioma con lo cual llegaremos a la conclusiónde que la frase analizada, pertenece al lenguaje. Si no se consigue el axioma, sedevolverá un código de error.

La complejidad de ambos procesos, es similar. El proceso ascendente, no espredictivo lo que dificulta la labor de guiado del reconocimiento léxico. Aún así, existealgún artículo donde se ha empleado para extraer las oraciones gramaticalmentecorrectas, contenidas en una celosía de palabras alineadas (Miller[88]).

Un procedimiento descendente así llamado fue el LL(k), que genera una tabla,similar a la de descripción de un autómata, que permite reconocer en tiempo O(n) ,donde seguimos la clásica notación con O mayúscula para denotar el comportamientomedio del algoritmo al variar la longitud de la cadena que tenemos en estudio. VerGrosz[86].

Las gramáticas LL(1) son insuficientemente potentes para tratar el lenguajenatural (ver Sanchis[88], cap. 7 y su referencia a Knuth para más detalles):

• Dado un símbolo de entrada en una determinada posición, debe existir unsolo camino gramatical que lo lleve al axioma.

• No existe algoritmo que transforme una gramática cualquiera a gramáticaLL(1).

• La existencia de ambigüedades, ralentizará notablemente el "parsing".

Sin embargo, dada su sencillez, podría ser útil en lenguajes de comandossencillos, con características de notación prefija. Por ejemplo, la gramática BNF prefija,es LL(1): existen unos prefijos que nos indican qué tipo de frase está siendo analizada.

En el caso del analizador CYK del Grupo de Tecnología del Habla, se optó porutilizar un proceso ascendente basado en el algoritmo de Cocke-Younger-Kasami, elcual será descrito en el siguiente apartado.

5.2 ALGORITMO DE COCKE-YOUNGER-KASAMI

Hays atribuye a Cocke la aplicación de la programación dinámica al análisissintáctico. Posteriormente, Kasami, independientemente, lo redescubrió y Younger

Capítulo 5. Analizador CYK Pagina 52

demostró que su complejidad era cúbica. Valiant, mostró que equivalía a la operaciónde cerrar transitivamente una matriz, y que con unas constantes de proporcionalidadenormes, podía ser evaluado en tiempo subcúbico. Ruzzo, finalmente, dejó en O(log(n))la complejidad para la versión paralela asíncrona.

Este algoritmo, que abreviadamente se llamará CYK, es el que emplea, como yase ha dicho, el analizador que se ha evaluado en la realización de este proyecto.

5.2.1 Preproceso

Para usar este algoritmo CYK, en cualquiera de sus formas, las reglas de lagramática de contexto libre que tengamos, son necesarias transformarlas en FormaNormal de Chomsky (a la cual, nos referiremos a partir de ahora como FNC) sin cadenavacía. Para ello, las reglas deben tener uno de los dos siguientes formatos:

A = B C

A = a

donde “A”, “B” y “C” son símbolos no terminales, y donde “a” es un símboloterminal. Las reglas que inicialmente, no tengan uno de estos formatos habrá quetransformarlas, mediante el algoritmo que se muestra en el cuadro 5.1.

BeginP’:=0añadir a P’ todas las reglas de la forma A=BCañadir a P’ todas las reglas de la forma A=aalmacenar aparte aquellas reglas del tipo A=B

para todas las reglas del tipo A=X1 X2 X3...Xkbegin

for (i:=1 to k-2)begin

si Xi es NoTerminalañadir la regla A=Xi A’i

si nobegin

crear la regla X’i=Xiañadir A=X’i A’i

endend

end

Cuadro 5.1. Algoritmo que pasa una gramática en formato extendido a FNC.

Capítulo 5. Analizador CYK Pagina 53

Para la eliminación de la cadena vacía de un lenguaje, que no la admita comosímbolo terminal, en Sanchis[88] se muestra un algoritmo.

Hay que dejar claro, que no todas las gramáticas, pueden ser puestas en FNC sincadena vacía y sin eliminar reglas unitarias del tipo A=B. Por ello, les daremos untratamiento diferenciado al aplicar CYK.

Es obvio, que esta conversión multiplicará ostensiblemente el número de reglasaplicables, lo cual no lleva consigo un “parsing” linealmente más lento, ya que lasreglas serán muchas más pero su uso será mucho más sencillo, sin necesidad de recorrerlos símbolos de su parte derecha ya que sólo tiene dos. Eso sí, es necesario ordenar lasreglas por su parte derecha, y guardar con cada símbolo, cuál es la primera regla quecontiene dicho símbolo como primero en su parte derecha (si no, la velocidad dependedirectamente del número medio de reglas, multiplicándose por veinte o treinta el tiempode reconocimiento de una frase). Esta ordenación se almacenará en uno de los ficherosque se usarán en tiempo de ejecución (.cyk).

Como las reglas de los dos tipos permitidos, no se aplican conjuntamente, unaextensión regular de las reglas originales (las que permiten paréntesis...) disminuye elnúmero de reglas en FNC creadas.

Los símbolos generados durante el proceso de transformación de las reglas,serán, como es obvio, totalmente transparentes al usuario, no apareciendo en los árboles,ni en pantalla, ni en disco.

5.2.2 CYK en forma matricial

CYK es un algoritmo ascendente y orientado a anchura (breath-first). Tras irrellenando una matriz que llamaremos ‘chart’, con cada uno de los símbolos terminalesque voy obteniendo de la lectura de la frase en las casillas chart[n,n-1], donde n es laposición del símbolo terminal en la frase, la ascensión, en notación matricial, hastaalcanzar el axioma, comprendería dos pasos:

• Aplicación de las reglas tipo A=a para traducir las categorias sintácticasterminales a no terminales:

chart[n,n-1]=a, entonces, chart[n,n]=A

• Aplicación de las reglas tipo A=BC , desde i=N hasta i=0 y de A=B.

i<j<k, chart[i,k]=B, chart[k,j]=C, entonces, chart[i,j]=A

chart[i,j] incluído en B, entonces, chart[i,j] incluído en A

Si tras realizar los cálculos en chart[0,n] hemos conseguido incluir el axioma,entonces se concluirá que la cadena pertenece al lenguaje y por tanto, será aceptada.Existen dos formas de rellenar esta matriz de la que estamos hablando: de formaasíncrona y de forma síncrona.

Capítulo 5. Analizador CYK Pagina 54

5.2.3 CYK en forma asíncrona

Esta ha sido la forma en que se decidió programar este analizador CYK,basándose en criterios de simplicidad principalmente.

Aquí, se empezará a realizar el proceso de ascensión dentro de la matriz, una vezque tengamos todos los símbolos terminales que forman la frase. Cuando hayamosllenado la diagonal principal de la matriz con los símbolos terminales mencionados, seempezarán a aplicar las reglas de la gramática (las cuales han sido previamenteconvertidas a FNC), rellenándose con los símbolos, no terminales en este caso,resultantes de esas reglas las casillas superiores de la matriz hasta alcanzar, si es posible,el axioma, lo que querrá decir que hemos realizado con éxito el análisis de la frase.

Este proceso, traducido a pseudocódigo, dará lugar al cuadro 5.2.

5.2.4 CYK en forma síncrona.

El algoritmo en forma síncrona, difiere del de en forma asíncrona, en que eneste, se va desarrollando la matriz, según se va recibiendo la cadena de entrada. Cadavez que recibamos un elemento de la frase, se irán aplicando tantas reglas gramaticalescomo sea posible, monarias o binarias, según se use el último símbolo de entrada por sísolo, o por la combinación de éste con los obtenidos anteriormente respectivamente.

La ventaja de este algoritmo con respecto al anterior, es que este será unalgoritmo predecible en tanto en cuanto, al haber obtenido todas las combinacionesposibles de análisis sintáctico, de lo que se lleva recibido de la frase de entrada,podremos predecir los símbolos que pueden seguir a la cadena analizada. Sin embargo,el grado de complejidad será el mismo para ambos sistemas de análisis. Estacomplejidad será cúbica con respecto a la longitud de la cadena de entrada.

Cuadro 5.2. Algoritmo CYK asíncrono.

for j=1 to nchart[j-1,j] = {A / existe regla A = a}

for i= tofor j= to

for k= tochart[i,j] = {A / existe regla A = BC,

con chart[i,k] que incluye B y con chart[k,j] que incluye C }

Capítulo 5. Analizador CYK Pagina 55

El algoritmo en pseudocódigo, que se obtiene de la aplicación de este procesoestá en el cuadro 5.3.

5.2.5 Algoritmo de reconstrucción.

Este algoritmo, creará todos y cada uno de los árboles sintácticos posibles paracada análisis, a partir del axioma, que será el nodo raíz. Dicho algoritmo, se ilustra en elcuadro 5.4.

Este proceso desarrollará como ya he dicho, cada árbol sintáctico a partir delaxioma, es decir, que va a desarrollar los árboles sintácticos de aquellas frases que

Cuadro 5.3. Algoritmo CYK síncrono.

for j=1 to nbegin

chart[j-1,j] = {A / existe regla A = a}for i=j-1 to 0

for k=i+1 to j-1chart[i,j] = {A / existe regla A = BC, con chart[i,k] que incluye B y con chart[k,j] que incluye C }

end

Cuadro 5.4. Algoritmo recursivo de reconstrucción sin ambigüedades.

Reconstruye (i, j, A, nodoAnterior)begin

nodoA = CreaNodo(A, NodoAnterior)for k=i+1 to j-1

beginpara cada símbolo B de la casilla chart[i,j]

para cada símbolo C de la casilla chart[k,j]si existe una regla A = BC

beginnodoB = Reconstruye(i,k,B,nodoA)nodoC = Reconstruye(k,j,C,nodoA)

endend

para cada nodo B de chart[i,j]

Capítulo 5. Analizador CYK Pagina 56

pertenecen al lenguaje. Esta análisis se llevará a cabo deshaciendo las reducciones, estoes, siguiendo el camino opuesto al de reconocimiento. Al crear todos los posiblesárboles, podremos ver todos los caminos que llevan al análisis de la frase. Si estoscaminos son muchos (habrá una variable que determine si hay demasiados análisis ono), se dirá que existe ambigüedad. Uno de los objetivos de este proyecto, será tambiénel de reducir el número de ambigüedades tanto como sea posible.

Dentro de este algoritmo, tendremos otro similar, que reconstruirá la diagonalprincipal. Esto nos permitirá aislar dentro de un proceso, el tratamiento diferente quedeben recibir la diagonal principal y la casi principal, debido a que están ligadas a reglasdel tipo NoTerminal=Terminal.

5.2.6 Ejemplo de reconocimiento.

Vamos a analizar como ejemplo demostrativo, una frase, utilizando unagramática, que si bien no se ajusta a los objetivos de este proyecto, nos va a valerperfectamente para observar cómo se aplican cada uno de los algoritmos que han sidoexplicados en los anteriores apartados. Hay que dejar claro, que el algoritmo dereconocimiento de la cadena de entrada será el que se usa en el analizador CYK (CYKasíncrono), por lo que el algoritmo CYK síncrono, no será recogido en el desarrollo deeste ejemplo.

Partimos de una gramática (cuadro 5.5) que no está en FNC, por lo que el primerproceso que el analizador debería realizar, sería la conversión de dicha gramática a otracuyas reglas estén en FNC (cuadro 5.6), lo cual es totalmente necesario para un análisissintáctico de estas características.

Se puede observar, que partiendo de la descripción que se ha hecho de lo que esuna FNC, las siguientes reglas:

SintagmaNominal= Determinante Nombre SintagmaPreposicionalSintagmaPreposicional= Preposicion Determinante Nombre

no están en FNC, por lo tanto habrá que transformarlas siguiendo el algoritmodescrito en el cuadro 5.1:

1. SintagmaNominal= Determinante1 SintagmaNominal1, donde

Cuadro 5.5. Gramática inicial.

Oracion= SintagmaNominal SintagmaVerbalSintagmaNominal= Determinante Nombre SintagmaPreposicionalSintagmaVerbal= VERBO SintagmaAdjetivalVERBO= VerboSintagmaAdjetival= AdjetivoSintagmaPreposicional= Preposicion Determinante Nombre

Capítulo 5. Analizador CYK Pagina 57

Determinante1= Determinante,SintagmaNominal1= Nombre1 SintagmaPreposicional, yNombre1= Nombre

2. SintagmaPreposicional= Preposicion1 SintagmaPreposicional1,dondePreposicion1= Preposicion, ySintagmaPreposicional1= Determinante1 Nombre,Determinante1= Determinante

Una vez hemos realizado el proceso, obtenemos la gramática en FNC.

Ya tenemos la gramática en FNC, ahora vamos a emplearla para analizar lafrase: "La casa de la colina es grande". Es una frase muy simple en su estructurasintáctica, pero que ayudará, sin duda, a entender mejor el proceso de relleno matricial,así como el de reconstrucción y creación del árbol. La matriz, que hemos llamado chart,que se obtendrá, al aplicar el algoritmo CYK asíncrono, una vez insertados en ladiagonal principal los símbolos terminales que componen la cadena de entrada, será lasiguiente:

j i

1 2 3 4 5 6 7

0 Determinante, Determinante1

SP1 SN O

1 Nombre, Nombre1

SN1

2 Preposicion, Preposicion1

SP

3 Determinante, Determinante1

SP1

4 Nombre, Nombre1

5 Verbo, VERBO

SV

6 Adjetivo, Sadj

Cuadro 5.6. Gramática en FNC.

Oracion= SintagmaNominal SintagmaVerbalSintagmaNominal= Determinante1 SintagmaNominal1SintagmaNominal1= Nombre1 SintagmaPreposicionalSintagmaVerbal= VERBO SintagmaAdjetivalSintagmaAdjetival= AdjetivoSintagmaPreposicional= Preposicion1 SintagmaPreposicional1SintagmaPreposicional1= Determinante1 NombreDeterminante1= DeterminanteNombre1= NombrePreposicion1= PreposicionVERBO= Verbo

Capítulo 5. Analizador CYK Pagina 58

Como se puede ver en la matriz resultante, se ha conseguido llegar al axioma enla casilla chart[0,7], por lo que la cadena analizada pertenece al lenguaje, y por lo tantose puede llevar a cabo la reconstrucción para conseguir de esta manera, todos losárboles sintácticos posibles resultantes del proceso de análisis.

La reconstrucción será:

1. Reconstruye(0,7, Oracion, NULL)2. nodoSintagmaNominal= Reconstruye(0,5, SintagmaNominal, nodoOracion,

1)3. nodoDeterminante1= Reconstruye(0,1, Determinante1,

nodoSintagmaNominal, 1)4. nodoDeterminante= ReconstruyeDiagonal(0,1, Determinante,

nodoDeterminante1, 1)5. nodoSintagmaNominal1= Reconstruye(1,5, SintagmaNominal1,

nodoSintagmaNominal, 1)6. nodoNombre1= Reconstruye(1,2, Nombre1, nodoSintagmaNominal1, 1)7. nodoNombre= ReconstruyeDiagonal(1,2, Nombre, nodoNombre1, 1)8. nodoSintagmaPreposicional= Reconstruye(2,5, SintagmaPreposicional,

nodoSintagmaNominal1, 1)9. nodoPreposicion1= Reconstruye(2,3, Preposicion1,

nodoSintagmaPreposicional, 1)10. nodoPreposicion= ReconstruyeDiagonal(2,3, Preposicion, nodoPreposicion1,

1)11. nodoSintagmaPreposicional1= Reconstruye(3,5, SintagmaPreposicional1,

nodoSintagmaPreposicional, 1)12. nodoDeterminante1= Reconstruye(3,4, Determinante1,

nodoSintagmaPreposicional1, 1)13. nodoDeterminante= ReconstruyeDiagonal(3,4, Determinante,

nodoDeterminante1, 1)14. nodoNombre= ReconstruyeDiagonal(4,5, Nombre,

nodoSintagmaPreposicional1, 1)15. nodoSintagmaVerbal= Reconstruye(5,7, SintagmaVerbal, nodoOracion, 1)16. nodoVERBO= Reconstruye(5,6, VERBO, nodoSintagmaVerbal, 1)17. nodoVerbo= ReconstruyeDiagonal(5,6, Verbo, nodoVERBO, 1)18. nodoSintagmaAdjetival= Reconstruye(6,7, SintagmaAdjetival,

nodoSintagmaVerbal, 1)19. nodoAdjetivo= ReconstruyeDiagonal(6,7, Adjetivo, nodoSintagmaAdjetival,

1)

El árbol sintáctico producto de este proceso de reconstrucción es el que semuestra en la ilustración 5.1.

Explicado con palabras, el proceso de reconstrucción se desarrolla, obteniendo,de izquierda a derecha, que es el orden natural de lectura de la frase en nuestro idioma,cada rama del árbol sintáctico, pasando por todos los niveles del mismo, del mayornivel, que será el nodo en el que estará el axioma, al menor, que serán los símbolosterminales correspondientes a los que equivalen cada una de las palabras queconstituyen la cadena de entrada. Esto se puede entender mejor, si se observa condetenimiento la ilustración mencionada en el párrafo anterior.

Capítulo 5. Analizador CYK Pagina 59

5.2.7 CYK con predicción

Sería especialmente interesante, que dispusiéramos de un algoritmo con el quefuese posible predecir, tras haber aplicado todas las reglas a cada palabra que se valeyendo, y a la combinación de ésta con las que la preceden (CYK síncrono), cuáles sonlas posibles siguientes.

Para ello, es necesario precompilar la gramática, y saber para cada símbolo noterminal de la gramática en FNC, cuáles son los símbolos terminales que los puedenencabezar. El procedimiento para la predicción de símbolos, sería el que estádesarrollado en el cuadro 5.7, e integrando este procedimiento en el CYK síncrono,tendríamos como resultado el algoritmo del cuadro 5.8.

Ilustración 5.1. Árbol sintáctico.

Oración__________________________________|__________________________________

| |SintagmaNominal SintagmaVerbal

_________________|____________ _____|______________ | | | |Determinante1 SintagmaNominal1 VERBO SintagmaAdjetival _____________|___________ | | Determinante Nombre1 SintagmaPreposicional Verbo Adjet | ____________|____________ | | Nombre Preposicion1 SintagmaPreposicional1 ________|________ | | Preposicion Determinante1 Nombre

Determinante

"La" "casa" "de" "la" "colina" "es" "grande"

Capítulo 5. Analizador CYK Pagina 60

Cuadro 5.8. Algoritmo de predicción integrado en el CYK síncrono.

for j = 1 to nbegin

para cada regla B = bbegin

Incorporar B a chart[j-1,j]para cada regla A = B

Incorporar Cabecera[C] a Predicción[]end

for i = j-1 to 0for k = i+1 to j-1

beginpara cada símbolo B de chart[i][k] y cada C de chart[k][j]

si existe regla A = BCbegin

Incorporar A a chart[i][j]para cada regla D = AE

Incorporar Cabecera[E] a Predicción[]end

para cada símbolo B del chart[i][j]si existe regla A = B

Incorporar A a chart[i][j]end

end

Cuadro 5.7. Algoritmo para el cálculo de las Cabeceras terminales de los símbolos noterminales.

para cada regla A = aañadir el terminal 'a' a la Cabecera[A]

Nuevos = FALSOhacer

beginpara cada regla A = BCbegin

añadir a Cabecera[A] la Cabecera[B]si ha habido nuevos

Nuevos = VERDADEROend

end

Capítulo 5. Analizador CYK Pagina 61

5.3 ALGORITMO DE EARLEY

Simplemente a nivel informativo, mencionar la existencia de otro importantealgoritmo para el análisis sintáctico, construído por J. Earley como resultado de su tesisdoctoral en Carnegie Mellon. Es el primer algoritmo de parsing basado en una “chart”activa, no llena de símbolos sino de reglas activas (parcialmente reconocidas) y reglascompletas.

Partiendo del concepto de estado que Knuth introdujo en su trabajo sobregramáticas LR, Earley desarrolló un algoritmo descendente, que podía reconoceroraciones, por medio de una gramática de contexto libre sin restricciones de formato oeliminación de la cadena vacía.

Si la gramática es ambigua, el tiempo de reconocimiento será proporcional alcubo de la longitud de la cadena de entrada, aunque para ciertas gramáticas, el tiempomedio se puede reducir a cuadrático, o incluso lineal. Usando arquitecturas paralelascon numerosos procesadores, esto es factible para cualquier gramática.

5.4 FUNCIONAMIENTO GENERAL

En este apartado, nos vamos a centrar en el funcionamiento general delanalizador "sintax" del Grupo de Tecnología del Habla. No vamos a entrar endescripciones al detalle de todas y cada una de las funciones que utiliza este analizadorpara llevar a cabo un análisis sintáctico de un texto cualquiera (una explicación dedichas funciones, del entorno, etc., se puede obtener en Montero[92], cap.VIII), sinoque se describirá por encima, las operaciones más importantes, así como los principalesficheros que son necesarios para la realización de dichas funciones.

5.4.1 Descripción de los ficheros de entrada

Los ficheros necesarios, a partir de los cuales va a partir el análisis de una frase,son los siguientes:

• Fichero .CMT (gramática de contexto libre CoMenTada).• Fichero .DIC (DICcionario).• Fichero .REG (interfaz entre diccionario y gramática).• Fichero .AUX (interfaz entre diccionario y gramática).

En los próximos apartados se explicará la composición, así como la utilidad deestos ficheros en un análisis sintáctico de un texto. Hay que decir, que todos los ficherosgramaticales tendrán el mismo nombre, debido a que así, se simplificará notablementeel acceso a los mismos y la velocidad de ejecución del programa será mayor. El nombrede dichos ficheros, será el de la gramática, es decir, el mismo que el que tenga el ficherode extensión .CMT.

Capítulo 5. Analizador CYK Pagina 62

Siguiendo un enfoque formal no lexicalista, se decidió aislar al máximo loscomponentes léxico y sintáctico; entre el diccionario y la gramática de contexto libre,existirá un interfaz de traducción con objeto de que los cambios en uno, afectenmínimamente al otro y viceversa. Un cambio en las categorías presentes en cualquierade los dos, debido quizás a la sustitución del diccionario por una base de datosmorfológica o semántica o por uno de esos robustos módulos de categorización léxicapresentes en los sintetizadores texto-habla, debería suponer tan sólo unos pequeñoscambios en el interfaz. Cuando se añada a la gramática un nuevo símbolo terminal, sedeberán modificar, aunque mínimamente, los archivos con extensión .REG, .AUX,.DIC.

5.4.1.1 Fichero .CMT

Es aquel que tiene las reglas gramaticales, esto es, la definición de la gramáticade contexto libre. Para la definición de la gramática, se ha usado un lenguaje sencillocuya sintaxis es la del cuadro 5.9.

El formato que se ha empleado en la elaboración de la gramática, es muyparecido al formato BNF, descrito anteriormente. Algunas diferencias son, que ennuestra gramática no se permite la anidación de paréntesis, estructuras del tipo(Términos)+, o (Términos)*, ni la inclusión de barras disyuntivas en el interior de losparéntesis. La razón hay que buscarla, en la "regularización" (la notación se hacecompacta y formateada, como la ideal para un lenguaje regular) y desestructuración quepuede suponer para la gramática de contexto libre su uso. Por ejemplo:

• Lo incluido dentro de un paréntesis, si tiene una estructura compleja orecursiva, bien merece la definición de un nuevo símbolo no terminal.

• Si un paréntesis pudiera contener varias alternativas, es que esas diversasalternativas, realizan una misma función sintáctica que convendríaespecificar.

• La posibilidad de equivocarse al escribir una regla complicada es grande.• La revisión o modificación de una regla complicada, si ha dado problemas en

el análisis, por parte de otros ingenieros o incluso por el mismo que laescribió será una tarea ardua y difícil, que es conveniente ahorrar alcorrector.

Por todas estas razones, se optó por no emplear la potencia de la BNF alcompleto.

Capítulo 5. Analizador CYK Pagina 63

Los símbolos terminales sólo podrán aparecer a la derecha del igual '=', y los noterminales, podrán aparecer indistintamente a ambas partes, a excepción del axioma,que evidentemente sólo se encontrará a la izquierda del igual de la primera regla. Enotro caso, cuando se compruebe la gramática, se obtendrá un error. Si deseamos más deun axioma, la primera regla debe ser del tipo:

Axioma=Axioma1 | Axioma2 | ...

El carácter espacio en blanco ' ' será considerado separador de símbolos, al igualque la barra disyuntiva '|', el signo de igualdad '=' y el retorno de carro. Otros caracterespredefinidos, serán '+', '*', '(' y ')', los cuales deberán llevar intercalado un separadorantes del siguiente símbolo.

Para utilizar uno de los caracteres anteriormente citados dentro de un símbolocualquiera, deberá ir precedido de la barra de división '/'. No se deben usar tabuladoresni barra hacia atrás '\', aunque el verificador lo permita. Éste distingue entre mayúsculasy minúsculas.

El significado de los caracteres predefinidos, será el siguiente:

• La barra disyuntiva, separará entre diferentes opciones a las que puedeequivaler el símbolo no terminal que está a la derecha del igual en la reglacorrespondiente.

• El signo '+', irá siempre pospuesto a un símbolo terminal o no, o una serie desímbolos entre paréntesis, ya que si no hay paréntesis sólo afectará al últimosímbolo que se encuentre delante suyo.

• El '=' separará el símbolo no terminal correspondiente de la cadena desímbolos terminales y/o símbolos no terminales que lo definan o a los cualesequivalga.

• El carácter '*', indicará que el símbolo que lo precede, puede estar repetido,en la posición en la que se encuentra en la regla, cero o más veces. Es decir,que puede estar (incluso varias veces) o no, dentro de una de lasconstrucciones que definen al símbolo no terminal correspondiente.

Cuadro 5.9. Sintaxis del lenguaje de definición de la gramática.

SimboloNoTerminal=Expresión_1Expresión_1=Expresión_1 | Expresión_2Expresión_1=Expresión_2Expresión_2=Expresión_2 TérminoExpresión_2=TérminoTérmino=Término2Término2=SímboloTérmino2=Símbolo*Término2=Símbolo+Término2=Símbolo Término2Términos=Término2Símbolo=CadenaVacía

Capítulo 5. Analizador CYK Pagina 64

• El '+' indica lo mismo que el '*', con la diferencia de que en este caso, elsímbolo que precede al carácter '+', debe estar al menos una vez presente enla estructura con la cual se llega al símbolo no terminal que hay a laizquierda del igual.

• Por último, un símbolo entre paréntesis, será opcional en la regla en la que seencuentra, es decir, la regla podrá desarrollarse tanto con su concurso comosin él.

Los comentarios que describirán cada una de las reglas para una mejorcomprensión de quien las interprete, se escribirán en las líneas que comiencen por loscaracteres '<<'. Los ejemplos que en teoría se usarían para el análisis de la regla quetienen encima, se escribirán en las líneas que comiencen por '‡‡', con los ejemplos, secreará un fichero .TXT que se podrá analizar con nuestra gramática y así podremoscomprobar, si realmente se han usado las reglas que se esperaban al analizar cada una delas frases de ejemplo, así, se podrán detectar fallos en la regla o ambigüedades si es quese ha usado otra regla diferente además de la esperada. Las líneas que tengancomentarios o ejemplos, pasarán inadvertidas para el verificador de la gramática.

Un ejemplo del formato del fichero .CMT, lo ofrecemos en el cuadro 5.10.

Cuadro 5.10. Ejemplo de parte del fichero .CMT que se usa en el analizador.

O= SEGMENTO+ << todo enunciado es una secuencia de segmentos con o sin sentido;

<< cada segmento es un sintagma o un seudosintagma‡‡ ideas verdes incoloras duermen furiosamente.

SEGMENTO=SEGMENTO1

SEGMENTO1=SEGMENTO2

SEGMENTO2=SNSinDETNum|SNSinDETAnyo|SNSinDETMes|SNSinDETDiaSEGMENTO2=SN|SNNum|SNDia|SNMes|SNCant|SNComp|SNConMas...SEGMENTO2=SP_NOM|SPMes|SPAnyo|SPCant|SPHora|SPConMasSEGMENTO2=SAdj

<< A estos segmentos, se podrá llegar en el primer análisis, de todas las<< formas que conduzcan a él.

...

SN=SN0SN0=SN1 | SNSinDET0 | SNAdjSNSinDET0= SNSinDET1SNSinDET1=SNSinDET11

<< diferenciamos entre SN que pueden llevar cualquier determinante, ...SNSinDET11= (SAdj) N (NUM) (PosNucleo)SN1= DETpos (SAdj) N (NUM) (PosNucleo)

<< Estructura típica de un sintagma nominal‡‡ la quinta maravillosa mesa cinco verde.

Capítulo 5. Analizador CYK Pagina 65

A partir de este fichero, se generará otro con extensión .GRA, que será idénticoal .CMT en lo que respecta a su funcionalidad, pero prescindiendo de todos loscomentarios y todos los ejemplos. Así, tendremos la gramática de una manera más claray sobre todo más manejable.

5.4.1.2 Fichero .DIC

Es el fichero donde tendremos nuestro diccionario. Para que una frase pueda seranalizada, todas las palabras de la misma deberán estar incluidas en este archivo, estapalabra tendrá asociada un número que equivaldrá a una categoría léxica (la conversiónde categorías léxicas a números se hará en el fichero .AUX). Si alguna de estas cosasfalla, se generará un fichero de error donde habrá un mensaje que nos diga qué palabrafalta, o qué palabra no tiene asociada un número específico.

Si alguna palabra de nuestro diccionario, puede tener varias categorías léxicas(como por ejemplo "vale", lo cual puede ser nombre o verbo), se escribirán tantas líneascomo categorías léxicas tenga la palabra.

El formato del fichero con el diccionario está en el cuadro 5.11.

El número de líneas del fichero nos lo dará la siguiente ecuación:

TotalLin = ∑=

TotalPal

iicasNumCatLexi

1

donde "TotalLin" será el número total de líneas, "TotalPal" será el número totalde palabras y "NumCatLexicasi " será el número de categorías léxicas de cada palabra.

Cuadro 5.11. Ejemplo del fichero .DIC.

" 50& 1, 411990 86? 85a 14abono 6abundantemente 4accidental 5...voz 6válidamente 4y 23y 30ya 37yo 13

Capítulo 5. Analizador CYK Pagina 66

Se puede deducir que un diccionario que sea completo de castellano, ocupará una grancantidad de bytes, lo cual provocará un aumento en el tiempo de búsqueda de cadapalabra en el mismo.

En este fichero, por tanto, tendremos tantas líneas como nos indique la fórmulaanterior, en las cuales tendremos la palabra seguida de un espacio en blanco y éste,seguido del número correspondiente a la categoría léxica de la palabra.

Este diccionario, tendrá que estar ordenado alfabéticamente ya que de locontrario, el verificador nos dará un error. El orden que debe seguir es el marcado por elequivalente ASCII de cada una de las palabras.

5.4.1.3 Fichero .REG

Es el que contendrá la equivalencia entre categorías sintácticas y categoríasléxicas. Para esta transformación, se ha usado una conversión muy sencilla que nosfacilitará la identificación de las categorías equivalentes.

La conversión consistirá en poner en minúscula la primera letra de la categoríasintáctica, obteniendo así la categoría léxica. Evidentemente, tendremos como norma,nombrar a todas las categorías sintácticas mediante un identificador que comience poruna letra mayúscula.

Las categorías sintácticas son lo que hasta ahora conocíamos como símbolosterminales, los cuales aparecen en las reglas escritas en el fichero .CMT. En este ficheropues, deberán estar traducidos todos los símbolos terminales que tomen parte en ladefinición de reglas gramaticales, a categorías léxicas, si esto no es así, se obtendrá unmensaje de error que nos especificará que hay un símbolo terminal que no estransformado en el fichero .REG, y por supuesto, el mismo mensaje, nos dirá a quésímbolo se está refiriendo.

Un ejemplo del fichero .REG, lo tenemos en el cuadro 5.12.

Cuadro 5.12. Formato del fichero .REG.

Poses=posesArtic=artic interrogativoDemostr=demostrPreArtTodos=preArtTodosAdverb=adverb adverbSi adverbTemp adverbEspac...Verbo=verbo verboEstar verboSer verboHaber palHaceVerboHaber=verboHaberVerboSer=verboSerVerboEstar=verboEstarGerundio=gerundioParticipio=participio

Capítulo 5. Analizador CYK Pagina 67

Como podemos ver, el formato será de la forma:

CategoríaSintáctica=CategoríaLéxica,

o si equivale a más de una categoría léxica

CategoríaSintáctica=CategLéxica1 CategLéxica2...

siempre usamos un formato lo más simple posible, que nos facilite el trabajo conel analizador.

5.4.1.4 Fichero .AUX

Aquí, se producirá la conversión de categorías léxicas a números naturales, estoestará ordenado por orden creciente de numeración, que no tienen por qué coincidir conel orden alfabético que usamos para ordenar el fichero del diccionario, como podemosver en el cuadro 5.13, donde se ofrece las primeras conversiones de nuestro fichero.AUX.

El formato del fichero, es exactamente el mismo que el que se ha usado para laconfección del fichero .REG:

CategoríaLéxica=NumeroCatLéxica

sin dejar espacios al escribir. Aquí no cabe la posibilidad de asignar a unacategoría léxica, varios números naturales. La correspondencia es unívoca.

En este fichero, se les debe asignar un número natural a todas y cada una de lascategorías léxicas que se han definido en el fichero descrito en el apartado anterior, esdecir, el fichero .REG. El hecho de que halla alguna sin número asociado, causará unerror a la hora de verificar la gramática.

Cuadro 5.13. Ejemplo de las conversiones que realiza el fichero .AUX.

poses=1artic=2preArtTodos=3adverb=4adjet=5sust=6participio=7ordin=8num=9infin=10adverbNo=11indef=12pronSujeto=13

Capítulo 5. Analizador CYK Pagina 68

Cada vez que tengamos que añadir una nueva equivalencia entre categoría léxicay número natural asociado, se le asignará a aquella, el número natural siguiente alúltimo asignado en el fichero .AUX, de cara a mantener el buen ordenamiento delarchivo. Si no se cumple con el ordenamiento descrito, también se producirá un fallo enla compilación de la gramática.

5.4.2 Compilador de gramáticas

Debido a que es necesario tener todos los archivos de entrada en el formatodemandado, es decir, correctamente escritos para su posterior procesamiento, y de caraa que no se produzcan desbordamientos de memoria al cargar los datos interesantes deestos ficheros, o más bien, a limitar la cantidad de memoria ocupada con las reglasgramaticales y las diferentes conversiones con las que contará nuestro analizadorcuando se disponga a analizar texto, se construyó un compilador de gramáticas, el cualse ocupará de que todo esto no se produzca, así como de generar otros ficheros a partirde los que hemos descrito en el apartado anterior.

Cuando se ejecuta el compilador de gramáticas, se nos muestra por pantalla unmenú con dos opciones:

• Compilar gramática.• Salir del compilador.

5.4.2.1 Compilar gramática

Si elegimos la primera opción, se nos dará a elegir entre los ficheros conextensión .CMT (aquellos con una gramática de contexto libre), que se encuentren en elmismo directorio en el que está el ejecutable del compilador, que queremos compilar.Una vez elegida nuestra opción, el programa empezará a "compilar" la gramática.

En este proceso de compilación, se procederá a verificar la corrección en cuantoa formato de los archivos de entrada (.CMT, .DIC, .REG, .AUX), se comprobará que nose ha producido ningún error en la escritura de los mismos (los posibles errores quepuede haber en cada fichero, ya se comentaron cuando describimos cada uno de ellos:símbolos predefinidos donde no tienen que estar, mal ordenamiento...). En el caso deque se encuentre alguno, se creará un fichero donde se describirá el errorcorrespondiente. Se va a distinguir entre dos clases de errores:

• Errores graves: Aquellos que abortarán la ejecución del programa.• Avisos: Aquellos que no van a impedir el correcto funcionamiento del

programa.

Entre los errores graves, se encuentran los siguientes:

• Cualquier variación en el formato de los ficheros, el cual debe ser respetado,ya que de otra forma, el programa no entenderá el significado de dicho

Capítulo 5. Analizador CYK Pagina 69

fichero. Como el error que se produzca va a ser descrito por pantalla, estostipos de errores se solventarán corrigiendo la escritura del fichero que se nosindique.

• La no conversión de algún símbolo terminal de la gramática en el fichero.REG a su respectiva categoría léxica. El mensaje de error, nos informará decuál es el símbolo o categoría sintáctica que falta por convertir, sólo nosqueda incluirlo y el fallo estará solventado. Dentro de este tipo de error,también se incluyen las no conversiones de categorías sintácticas acategorías léxicas en el fichero .AUX, las cuales se solucionarán del mismomodo.

• En el diccionario deberá haber, al menos una palabra para cada categoríaléxica que halla sido definida en el archivo .AUX, si esto no ocurre, semostrará un mensaje de error por pantalla que nos dirá, aquella categoríaléxica que no se use en el diccionario. Por tanto, tendremos que buscar unapalabra cuya categoría léxica sea la mencionada, e incluirla en el diccionario.

• Cualquier escritura de los componentes del fichero, que no respete las reglasde ordenamiento explicadas en apartados anteriores. Si hay algún fallo en elordenamiento de algún fichero, se comunicará cuál es mediante un mensajepor pantalla. Aunque a primera vista, no parezca que esto sea un error por elcual sea necesario abortar la compilación de la gramática, un error de estaclase hará que el grado de complejidad de los algoritmos que usan estosficheros, crezca exponencialmente debido al retraso que se produciría en lasbúsquedas.

• Todos los desbordamientos de memoria. El compilador de gramáticas,cargará en memoria las reglas gramaticales, su conversión a FNC... Para ello,se declararán unos arrays donde se cargará toda la información necesaria,éstos tendrán una capacidad, la cual no podrá ser desbordada. Lascapacidades, estarán marcadas por una serie de constantes definidas en unode los módulos cabecera que componen el programa. Debido a que unamejora del analizador, implica la inclusión y modificación de nuevas reglasgramaticales, añadir nuevos símbolos terminales y por tanto nuevascategorías léxicas, lo que lleva consigo completar el diccionario con palabrasque tengan la nueva categoría léxica como equivalente, tendremos queaumentar (en algunos casos considerablemente), muchas de las constantesque definen la capacidad a utilizar a la hora de cargar gramáticas, símbolosterminales...

Entre los avisos podemos destacar:

• Falta de comentarios o ejemplos en alguna de las reglas de la gramática quetenemos en el archivo .CMT.

• Observaciones sobre la transformación de las reglas gramaticales a FNC.

Estos errores tendrán su descripción en alguno de los siguientes ficheros desalida:

• Ausentes.AUX, Ausentes.DIC y Ausentes.REG: Nos informarán acerca de laausencia de alguna categoría léxica, de alguna palabra que tenga comocategoría léxica una de las definidas en el archivo .AUX, o de algunacategoría sintáctica respectivamente.

Capítulo 5. Analizador CYK Pagina 70

• HayAviso.AUX, HayAviso.DIC, HayAviso.REG y HayAvisos.GRA: Quenos describirán los avisos que se produzcan en cualquiera de los ficheros conla misma extensión.

• HayError.AUX y HayErrores.GRA: Detalle de los errores que hayaninterrumpido la ejecución de la compilación de la gramática.

Una vez que el programa no detecte errores, se procederá a la compilación. Eneste proceso, los símbolos terminales se convertirán a números naturales y se cargaránen una variable llamada 'Tabla', facilitando así la labor de búsqueda de símbolosterminales permitidos (esto es, los que se usan en la gramática), se cargarán en memorialas reglas gramaticales que halla escritas en .CMT (una vez convertidos los símbolos anúmeros, esta es también, una forma de ahorrar memoria), se ordenarán guiándose porel primer símbolo a la derecha del igual (ya se dijo en este capítulo, que de esta forma sereducirá ostensiblemente el grado de complejidad del algoritmo de análisis), y seconvertirán a FNC, con las reglas resultantes, se creará un fichero de salida.

También se generarán ficheros con la gramática sin comentarios ni ejemplos(.GRA), con los ejemplos del fichero .CMT (el cual, como ya se ha comentado, se podráanalizar, lo que nos servirá para probar la gramática), este fichero tendrá extensión.TXT...

Los ficheros más importantes que se generarán, serán los que mencionamos acontinuación:

• Fichero .CYK: Contiene las reglas gramaticales convertidas a FNC, perocon notación numérica, es decir, con los símbolos transformados a suequivalente numeral el cual está almacenado en 'Tabla'.

• Fichero .GRA: Reglas gramaticales sin comentarios ni ejemplos. Segúnestán escritas en el .CMT, antes de ser transformadas a FNC.

• Fichero .TAB: Archivo con todos los símbolos terminales, situados en ordende aparición en el fichero .CMT. El número de línea en el que esté cadasímbolo, será el que le corresponda en su traducción numérica.

• Fichero .TXT: Aquí se guardarán todos los ejemplos del fichero con ladescripción de la gramática de contexto libre (.CMT). Como ya se ha dicho,servirá como prueba para nuestras reglas.

En el cuadro 5.14, hay una muestra del formato de estos ficheros.

Otros ficheros que se obtendrán como salida del compilador de gramáticas, seránlos que se citan a continuación. No serán tan importantes como los ya descritos, aunquesí imprescindibles para el correcto discurrir de la compilación.

Entre estos, estarán: .CAB (nos asocia cabeceras de regla con símbolos noterminales, esto es, que todos los símbolos no terminales tienen asociada la cabeceracon la cual puede empezar una regla que los defina), .BAC (es el inverso al anterior,todas las cabeceras tienen asociado un símbolo no terminal), .EQI (define los símbolosno terminales que son equivalentes, por ejemplo SN=SN0), .EXT (todas las reglasordenadas por el primer símbolo que aparece a la derecha del igual, este ordenamientoes en orden creciente tomando como referencia el número al que equivale elmencionado símbolo), .INV (es el archivo inverso del .EQI), .LEX (contiene las todas

Capítulo 5. Analizador CYK Pagina 71

las categorías LÉXicas que aparecen en el .AUX y el/los número/s a que equivale sucorrespondiente/s categoría/s sintáctica/s. Es un resultado del procesamiento de losarchivos .REG y .AUX), .LIS (todas las reglas desarrolladas tal y como están en elarchivo .CMT o .GRA, pero con la traducción numérica), .OPC (reglas OPCionales,rellena el array de 'Reglas_Anulables', es importante en el análisis sintáctico, siutilizamos el algoritmo de earley), .ORG (nos dice de qué regla OriGinal proviene cadauna de las extendidas), .TRD (TraDucción de los símbolos que aparecen en el .TAB asu equivalente numérico. Lista de todos los números que tienen un terminal asociado),.DAT (reglas gramaticales extendidas), .SMB (contiene todos los SiMBolos y losposibles numerales a los que puede equivaler dicho símbolo mediante la aplicación delas reglas gramaticales), .Y (reglas expuestas en formato YACC o BISON, seránecesario cuando utilicemos uno de estos compiladores).

Estos últimos archivos, son totalmente transparentes al usuario, por lo que el nocomprender exactamente su utilidad dentro del analizador no debe ser un signo depreocupación. Sólo alguien que reprograme el compilador, deberá conocerperfectamente el contenido y el porqué de ese contenido de los mismos.

Capítulo 5. Analizador CYK Pagina 72

En la ilustración 5.2 mostramos un esquema de esta fase.

Cuadro 5.14. Ejemplo de algunos de los ficheros de salida.

.CYK (reglas en FNC y ordenadas por el primer símbolo de la derecha)2 5 230 8 1151427 13 142834 13 143234 13 143330 14 11531 14 11631 14 1402

.GRA (traducción de lo anterior)O= SEGMENTO+INSERTABLE=SAdvSEGMENTO=SEGMENTO1SEGMENTO1=SEGMENTO2SEGMENTO2=SN|SNNum|SNDia|SNMes|SNCant|SNComp|SNConMasSEGMENTO2=SP_NOM|SPMes|SPAnyo|SPCant|SPHora|SPConMasSEGMENTO2=Sadj

.TABO 1 0 0 0 0SEGMENTO+ 1 0 0 1 1INSERTABLE 1 0 0 3 0SAdv 1 0 0 4 0SEGMENTO 1 0 0 26 0SEGMENTO1 1 0 0 27 1SEGMENTO2 1 0 0 28 1SNSinDETNum 1 0 1 63 0

.TXTideas verdes incoloras duermen furiosamente.furiosamente duermen incoloras ideas verdes.no se los como.come , ha comido , está agotado, yo como.

Capítulo 5. Analizador CYK Pagina 73

5.4.2.2 Salir del programa

Una vez se halla compilado con éxito la gramática, podremos salir del programamediante la opción de salir del programa. Cuando la hayamos seleccionado, se nospedirá que confirmemos si queremos abandonar el compilador, para confirmarlopulsaremos la tecla 's', en caso contrario pulsaremos la tecla 'n'.

Otra forma de salir del programa será pulsando directamente la tecla 'Esc'.También de esta forma se pedirá confirmación.

5.4.3 Cargar gramática

Básicamente, cuando accedemos a la opción de cargar gramática, se hacen lasmismas operaciones que cuando compilamos. Evidentemente, si la compilación no hatenido éxito, la carga tampoco lo tendrá. Por tanto, es imprescindible que la gramáticahaya sido compilada correctamente para poder cargarla.

.CYK

.GRA

.TAB

.TXT

.BAC

.CAB

.DAT

.EQI

.EXT

.INV

.LEX

.LIS

.OPC

.ORG

.TRD

.SMB .Y

COMPILADORDE

GRAMÁTICAS

.CMT

.REG

.AUX

.DIC

OK

Ausentes.AUXAusentes.DICAusentes.REGHayError.AUX

HayErrores.GRA

Error

Ilustración 5.2. Esquema del funcionamiento del compilador.

Capítulo 5. Analizador CYK Pagina 74

Sabiendo esto, una vez consigamos compilar correctamente la gramática decontexto libre seleccionada, y tengamos todos los ficheros que se generan como salida,se procederá a cargar la gramática en memoria.

En el paso previo, lo que se hacía era confeccionar una serie de ficheros a partirde los cuatro ficheros de entrada (recordamos que eran .CMT, .REG, .AUX y .DIC).Según se iban creando, se verificaba la corrección de estos ficheros de entrada. Ahoracon esta opción, vamos a cargar en memoria a través de una serie de variables, toda esainformación obtenida en la compilación.

Por tanto, a esta altura del análisis, se almacenará en disco la siguienteinformación:

• Reglas del fichero .CYK (es decir, en FNC). Serán las que se utilicen en elanálisis sintáctico.

• Tabla de símbolos. Se guardará la información de los ficheros .TAB y .TRD,que serán los fundamentales, así como aquella en la que se describe todo elproceso de transformación de símbolos terminales a números.

• Las reglas más características producidas por las diferentes transformacionessufridas: reglas anulables (partes de la regla entre paréntesis), reglas enformato extendido (aquellas reglas que tienen una barra disyuntiva la cualpermite opciones, pero desarrollada)...

Se puede notar, que todos estos datos ya han sido desarrollados cuando secompiló la gramática, por lo que ahora sólo hay que copiarlos dentro de las variablesque se dispongan a tal efecto, para así conseguir una mayor velocidad de análisis alacceder a memoria y no a los diferentes ficheros.

En resumen, en esta parte del proceso, se pasa información de ficheros amemoria. Aquí se va a seguir controlando la corrección del formato de los diferentesficheros, como también se comprobará que no se produzca desbordamiento en lasdiferentes variables donde almacenaremos los datos que se consideren necesarios sobrela gramática.

Cuando se halla finalizado el proceso de carga correctamente, se indicará através de una variable booleana ('HayGramatica') que nos informará si la carga se haproducido con éxito o no.

5.4.4 Análisis de texto

A esta opción sólo se puede acceder con una gramática cargada en disco. Portanto es de obligado cumplimiento el paso por el proceso descrito en el apartado anteriorantes de acceder a este. En consecuencia, cuando elegimos analizar texto, lo primeroque se hace, es chequear la variable 'HayGramatica'. Si ésta nos dice que no haygramática cargada, se nos mostrará un mensaje por pantalla que nos lo notificará, encaso contrario, se procederá al análisis de un texto cualquiera que nosotros elijamos.

Capítulo 5. Analizador CYK Pagina 75

Una vez que la variable 'HayGramatica' nos informe de que tenemos unagramática cargada en el disco, se nos presentará una pantalla, donde se nos mostrarántodos los archivos con texto analizable (extensión .TXT), que se encuentren en elmismo directorio desde el que estamos ejecutando el analizador. Cuando elijamos unode los textos, el cual deberá tener el mismo nombre que los ficheros gramaticales, seprocederá al análisis sintáctico del mismo.

Por tanto, como entrada para esta operación, tendremos el fichero de texto.Como salida, obtendremos una serie de ficheros con los resultados del análisis, lailustración 5.3 nos muestra un esquema de esta fase.

El proceso de análisis, será un bucle que realizará las siguientes fases:

• Lectura del texto.• Categorización del texto leído.• Análisis sintáctico.• Generación de ficheros con resultados.

En el cuadro 5.15, se pueden observar las llamadas a estas funciones dentro delprograma principal. A continuación, vamos a describir las acciones que se llevan a caboen cada una de estas fases.

5.4.4.1 Lectura del texto

Llamada a la función "LeeTextoFichero". En ella, se leerá una frase del ficherode entrada con el texto para analizar (FPLect), se guardará en memoria (CadenaIn) y sedevolverá un código de éxito o error, el cual se reflejará en la variable 'OK'.

Cuadro 5.15. Extracto del programa principal del analizador.

while ((feof(FPLect)==0 || TextoGuardado)&& FPLect!=NULL) //Mientras halla texto, se leerá.{...OK=LeeTextoFichero(FPLect,CadenaIn,&TextoGuardado);...OK=Scan(CadenaIn,CadenaOut,LongitudDePalabra);...OK=AnalizaCYKRapido((Ambig *)&CadenaOut,I,&AnalisisIncompleto,UtilizaElRaton);...ImprimeCYK(FPEscr1,AnalisisIncompleto);PantallaArbolesImprimeCYK(FPEscr3,LongitudDePalabra);ImprimeArbolesCYK((int *)&LongitudDePalabra,CadenaIn,UtilizaElRaton);ImprimeErroresCYK(FPEscr2,I);...} //Fin del bucle

Capítulo 5. Analizador CYK Pagina 76

La lectura se realizará línea a línea. Si en uno de esos accesos, se lee más allá delpunto, que será el carácter de finalización de frase, el fragmento que sobra para analizar,se guardará en la variable 'TextoGuardado', y de esta forma, estará disponible para elsiguiente análisis ya que se recuperará en la siguiente llamada a "LeeTextoFichero".

5.4.4.2 Categorización del texto

Ya tenemos el texto que vamos a analizar en 'CadenaIn'. Ahora, debemoscategorizar cada una de las palabras que componen la frase leída, esto es, asignarle acada palabra, la o las categorías sintácticas que pueda tener. Esto se hace, accediendo aldiccionario de palabras en el cual estará el número de categoría léxica al que equivalecada palabra y luego, mediante el interfaz de transformación de categorías léxicas asintácticas (archivos .REG y .AUX), se obtendrá la categoría sintáctica buscada.

Ya tenemos el nombre del símbolo terminal que identifica a la palabra, ahora, através de los archivos .TRD y .TAB, y la función "InTabla" (la cual comprueba si elterminal al que hemos llegado es uno de los que se utilizan en la descripción de reglas,los cuales se integraron en los ficheros mencionados en el proceso de compilación),conseguiremos el número asociado a la categoría o símbolo terminal obtenido con lacategorización, éste se incluirá en la posición de la variable 'CadenaOut' que secorresponda con la que tenga la palabra categorizada, en la frase de la que forma parte,esto se hará con todas las categorías sintácticas que tenga una misma palabra, por lo quese requiere que 'CadenaOut' sea un array de dos dimensiones.

Si no se encuentra en el diccionario la palabra que queremos categorizar, se nosmostrará un error por pantalla, en el que se nos comunicará la palabra que el programa

NO

Mensaje

MENU Analizar Texto HayGramaticaSI

.TXT

LeerTextoCategorizadorAnalizador.ERR.ETQFinFichero

NO

SI

Ilustración 5.3. Esquema del funcionamiento del analizador.

Capítulo 5. Analizador CYK Pagina 77

no encuentra. Para solucionar el problema, se añadirá la palabra conflictiva aldiccionario, con su correspondiente categoría léxica, cumpliendo los criterios deordenamiento alfabéticos y el formato del diccionario. Como el diccionario no se cargaen memoria al cargar la gramática, no será necesario ni compilar ni cargar de nuevoantes de volver a analizar.

Un error en el interfaz de transformación de palabra a categoría sintáctica, sólose podrá producir en el diccionario, ya que el resto del interfaz, ya se ha verificado enlos procesos anteriores de compilación y carga.

A la vez que se categoriza una palabra, ésta se incluirá en la variable 'Palabras', ala cual se accederá cuando se generen los ficheros donde se escribirá el análisissintáctico resultante. Una palabra se incluirá en la variable 'Palabras', sólo si no seprodujeron errores en la categorización. Si se produce un error, el programa abortará ymostrará el mensaje que corresponda.

Obtenida la categorización del texto completo, se procederá al análisis sintácticopropiamente dicho.

5.4.4.3 Análisis sintáctico

La parte conflictiva de esta fase es el algoritmo de análisis que utiliza (algoritmoCYK), el cual está explicado más arriba en este capítulo.

Por lo demás, usando dicho algoritmo CYK, descrito en este mismo capítulo ylas reglas en FNC, se generará la variable 'TablaRecon' donde se guardan todos lossímbolos no terminales que se producen, resultado de las reducciones de diverso nivelhechas a partir de la cadena con la frase categorizada (CadenaOut). Si se logra llegar ala última fase de reducciones (casilla (0,n) de la matriz chart), indica que la cadena sepuede reducir al axioma, lo que significa que la frase analizada pertenece al lenguaje.

Si la frase no se puede analizar (no se consigue llegar al axioma), se generará unfichero con las frases no analizadas (extensión .ERR), en el que se indicarán losfragmentos de mayor tamaño que se han logrado analizar dentro de esa frase, lo cual nosservirá para la identificación y posterior depuración del fallo.

Si ha sido posible analizar la frase completa, se generará en memoria el árbolsintáctico resultante, que luego traducido a un código al que nos referiremos comoparéntesis etiquetados, será dibujado en otro de los ficheros de salida (.ETQ).

Los árboles sintácticos construidos en memoria, se mostrarán en pantalla o no,según el modo en el cual se esté ejecutando el programa. Hay dos posibles modos deejecución del programa:

• Modo normal: Se analiza el texto frase a frase, deteniéndose al término decada análisis para mostrar, si el usuario lo conviene, uno o varios de losárboles sintácticos resultantes. Después de observar o no la estructura de losárboles elegidos, se continuará con el proceso.

Capítulo 5. Analizador CYK Pagina 78

• Modo Batch: Se realizará el análisis del texto completo, sin parar para dar aconocer la estructura de los árboles sintácticos. En este modo, sólo podremosanalizar los resultados que figuren en los dos archivos de salida que son,como ya se ha comentado, aquellos con extensión .ERR y .ETQ, y con elmismo nombre que el del fichero de donde hemos leído el texto.

Evidentemente, y como ocurre siempre, cada modo tendrá sus ventajas y susinconvenientes, las ventajas de uno serán los inconvenientes del otro. El modo normal,tendrá como ventaja, que el resultado del análisis se estudia más fácilmente mediante laobservación directa de la estructura del árbol sintáctico, el cual la ofrece de una maneraclara y precisa. Por el contrario, tendrá como inconveniente la lentitud que requiere estetipo de ejecución, parando después de cada análisis.

El modo batch, por el contrario, será más veloz, pero la detección de erroresdentro de una frase que ha logrado ser admitida por la gramática de contexto libre, serámás complicada al no disponer de la estructura de árbol. Este tipo de errores, puedenser: sintagmas nominales que no deben serlo, palabras mal categorizadas que sinembargo, son parte de una frase que pertenece al lenguaje, aún a pesar de esa malacategorización...; errores que, al fin y al cabo, deben ser corregidos aunque noconduzcan a un rechazo por parte de la gramática hacia la frase analizada. Serán malosanálisis, los cuales, es preciso que sean corregidos.

Capítulo 5. Analizador CYK Pagina 79

5. ANALIZADOR CYK ...................................................................................................................505.1 Introducción. .........................................................................................................................505.2 Algoritmo de cocke-younger-kasami......................................................................................51

5.2.1 Preproceso .....................................................................................................................525.2.2 CYK en forma matricial .................................................................................................535.2.3 CYK en forma asíncrona................................................................................................545.2.4 CYK en forma síncrona..................................................................................................545.2.5 Algoritmo de reconstrucción. .........................................................................................555.2.6 Ejemplo de reconocimiento. ...........................................................................................565.2.7 CYK con predicción ......................................................................................................59

5.3 Algoritmo de earley...............................................................................................................615.4 Funcionamiento General........................................................................................................61

5.4.1 Descripción de los ficheros de entrada............................................................................615.4.1.1 Fichero .CMT ............................................................................................................625.4.1.2 Fichero .DIC..............................................................................................................655.4.1.3 Fichero .REG.............................................................................................................665.4.1.4 Fichero .AUX ............................................................................................................67

5.4.2 Compilador de gramáticas..............................................................................................685.4.2.1 Compilar gramática....................................................................................................685.4.2.2 Salir del programa......................................................................................................73

5.4.3 Cargar gramática............................................................................................................735.4.4 Análisis de texto ............................................................................................................74

5.4.4.1 Lectura del texto ........................................................................................................755.4.4.2 Categorización del texto .............................................................................................765.4.4.3 Análisis sintáctico ......................................................................................................77