ISSN: 1139-8736
Depósito Legal: B-8714-2001

6.3.2 Descripción General

Análisis de la robustez de este tipo de Gramáticas

Se debe tener en cuenta la no utilización de la información intra-conceptual durante la fase del análisis estructural. Sólo información inter-conceptual es analizada. Ello permite que la robustez alcanzada durante la fase de decodificación o segmentación conceptual no se vea afectada por este análisis. Podemos seguir teniendo frases mal reconocidas o conceptos con estructuras internas alteradas, sin afectar a la estructura global de la frase.

Debe de tenerse en cuenta que, este tipo de arquitecturas o sistemas, están basadas en la hipótesis de que muchos de los errores se producirán dentro de los conceptos, y que serán, en muchos casos, debidos a errores de reconocimiento acústico de palabras función (artículos, pronombres, etc), a la inclusión de coletillas o expresiones que no aportan información relevante para la comprensión de la frase, o cambios en la estructura interna de un concepto, debido a la posibilidad de expresar de varias formas alternativas una misma idea o concepto de la frase. En esos casos, es el segmentador conceptual quién absorberá esos errores, haciéndolos transparentes al analizador estructural (parser).

Es posible que existan algunos casos en los que la variabilidad del lenguaje dé lugar a un cambio estructural, es decir, la posibilidad de expresar una misma consulta produciendo una alteración sustancial en el orden de los conceptos. O también, la necesidad de incorporar nueva funcionalidad en el sistema. En estos casos, sí que será necesario modificar el conjunto de reglas utilizadas. Sin embargo, el lector puede darse cuenta de la facilidad de incluir nuevas reglas o de modificar el pequeño conjunto desarrollado.

Es interesante destacar que la obtención de la estructura de una frase, aislando las funciones, permite disponer de la posibilidad de implementar funciones que no pueden ser traducidas a SQL, e incluso decidir, si las que pueden traducirse, se gestionan de forma externa al query SQL formulado y ejecutado. Esto redunda en la flexibilidad y la capacidad del sistema de comprensión.

El Analizador Estructural. Descripción del algoritmo de Earley.

J. Earley diseño e implementó el primer algoritmo de análisis gramatical basado en la idea de una tabla o ‘chart’ activa, como resultado de su tesis doctoral. Esta tabla activa no está rellena de símbolos sino de reglas activas (parcialmente reconocidas) y de reglas completas. Partiendo del concepto de estado que Knuth introdujo en sus trabajos sobre gramáticas LR, Earley desarrolló un algoritmo de análisis descendente que podía reconocer cadenas de símbolos pertenecientes a un lenguaje representable mediante una gramática libre del contexto sin restricciones de formato o eliminación de la cadena vacía. En caso de que la gramática fuese ambigüa (algo habitual en gramáticas del lenguaje natural), el tiempo de reconocimiento será proporcional al cubo de la longitud de la cadena de entrada, aunque para ciertas gramáticas el tiempo medio se puede reducir a cuadrático e incluso lineal.

El algoritmo de Earley se basa en tres operaciones o acciones que se realizan iterativamente a lo largo del análisis de la cadena de entrada:

  • Predecir. Si tenemos un estado {A --> ... ·B ..., i} es que necesitamos desarrollar B, y por tanto, debemos recorrer las reglas del tipo B --> ... para predecir lo que buscamos.
  • Completar. Si hemos llegado a un estado completo {A --> ...·, i}, algún estado previo debe haber predicho A y necesitará que le avancemos el puntero · quedando {B --> ...A·..., i}.
  • Avanzar. Una vez realizadas todas las posibles predicciones de símbolos terminales, debemos comprobar que la cadena de entrada posee alguno de ellos y avanzar el puntero correspondiente del elemento {A --> ...a·..., i).

A continuación se incluye una descripción del algoritmo de Earley en su forma básica, en una notación más adecuada para su implementación computacional:

[Inicialización]
   Para cada regla S --> ...
        Nuevos = AñadirElemento({S --> ·...,0}, Agenda[0])

Realizar
    Nuevos = 0
    Para cada elemento {A --> ...·B...,0} de Agenda[0]
        Para cada regla B --> ...
            Nuevos = AñadirElemento({B --> ·...,0}, Agenda[0])
    Para cada elemento {A --> ...·,0} de Agenda[0]
        Para cada elemento {B --> ...·A...,0} de Agenda[0]
            Nuevos = AñadirElemento({B --> ...A·...,0}, Agenda[0])

mientras Nuevos = 1

[Iteración]
Para
    Nuevos = 0
    Para cada elemento {A --> ...·a...,i} de Agenda[j-1]
        Si a pertenece a Entrada[j]
            Nuevos = AñadirElemento({A --> ...a·...,i}, Agenda[j])

    Si Nuevos = 0
        Devolver ERROR

    Realizar
        Nuevos = 0
        Para cada elemento {A --> ...·B...,i} de Agenda[j]
            Para cada regla B --> ...
                Nuevos = AñadirElemento({B --> ·...,j}, Agenda[j])
        Para cada elemento {A --> ...·,i} de Agenda[j]
            Para cada elemento {B --> ...·A...,k} de Agenda[i]
                Nuevos = AñadirElemento({B --> ...A·...,k}, Agenda[j])

    mientras Nuevos = 1 

Si existe algún elemento {S --> ...·,0} en Agenda[N]
    Devolver BIEN
si no existeÇ
    Devolver ERROR

La cadena vacía requiere un tratamiento especial, será un símbolo no terminal que no necesita de la operación completar para el avance de su puntero. Cada vez que añadamos un elemento a Agenda[i] del tipo {A --> ...· ..., j} donde el puntero · queda a la izquierda de una cadena vacía, añadiremos también el elemento {A --> ... · ..., j}. Al reconstruir la estructura de la cadena de entrada, en el bucle que recorre los símbolos de la parte derecha de una regla B --> B1 ... Bm debemos distinguir no sólo los terminales y no terminales sino también la cadena vacía, y al llegar al símbolo nulo del elemento {A --> ... ..., j} reduciremos sólo k y proseguiremos.

Todo algoritmo de análisis gramatical necesita de un algoritmo de construcción del árbol asociado a la cadena de entrada, si el análisis termina correctamente. Los algoritmos de construcción dependen del algoritmo de análisis deben ser capaces de tratar las ambigüedades, generando todos los árboles de análisis posibles. Veamos a continuación el algoritmo de reconstrucción del árbol sintáctico del algoritmo de Earley en ausencia de ambigüedades:

Reconstruye({A --> B1 B2 ... Bm ·,i}, j)
    Añade a ListaDeReglas el elemento (A --> B1 B2 B3 ... Bm)

    k = m
    l = j

    Realizar
        Si Bk es terminal
            k = k-1
            l = l-1
        si no
            Si existe en Agenda[l] un {Bk --> ·, r} tal que en
            Agenda[r] esté {A --> B1 B2 ...·Bk, i}
                Reconstruye({B --> ·, r}, l)
                k = k-1
                l = r

    mientras k>0

Árboles Conceptuales: Salida del Proceso de Análisis Estructural.

Los paréntesis etiquetados son el medio para representar los árboles (en caso de ambigüedad gramatical) de una frase segmentada de entrada.

Anterior   I  Siguiente   I  Índice capítulo 6   I  Índice General


ISSN: 1139-8736
Depósito Legal: B-8714-2001