jueves, 16 de octubre de 2014

He alcanzado el siguiente nivel de abstracción

En la publicación del 22/04/2012 ya explicaba a lo que me estoy refiriendo.

Por cada tipo de palabra e incluso subtipo se tenía que programar una lista específica.

El siguiente nivel pretendía usar una lista común a todas independientemente de sus propiedades.

En su momento propuse usar un árbol de propiedades, y no iba mal encaminado.


Mediante árboles de propiedades:

La vez anterior no me fue posible porque no tenía el apoyo de un autómata:

Ya hemos hablado de que el autómata ya era capaz de reconocer naturales, enteros o reales, entre otros muchos más.  Ya he mencionado tres propiedades. Si se organizan en forma de árbol podríamos pensar en uno del que desde la raíz cuelga un nodo etiquetado con número matemático,  y de éste otros tres nodos con las propiedades mencionadas.

La estructura de datos cuyo elemento básico Cadena compuesta por la cadena de texto, el tipo y posteriormente subtipo, pasan a desaparecer éstos últimos y en su lugar el árbol de propiedades específico de la cadena.

Entonces, dada una cadena, primero consulta si ya existe en la ED. En caso contrario el autómata reconoce la forma mediante ERs y nos dice las propiedades.  Por ejemplo,  para '1' nos dirá que se trata de un dígito, número natural,  número entero y número matemático. Sin embargo para '12.7' nos dirá que se trata de un número real y número matemático. Se guarda la información en la ED.

La ED ya existente nos proporciona encontrar una cadena concreta y a su vez obtener su árbol específico de propiedades. Ahora se le añade un árbol genérico de propiedades en la que en cada nodo hay una lista de cadenas con todas las cadenas con una misma propiedad. Todo entrelazado con la anterior ED.


Mediente un grafo y listas de propiedades:

Implementé todo lo descrito anteriormente y llegó a funcionar, el problema era que no era automático, es decir, hay que introducir las ER y luego generar manualmente el árbol global de propiedades basándonos en las ER. Al ser un árbol, no todas las propiedades se podían introducir

Lo llevé a un punto más allá. La solución fue cambiar en la cadena el árbol de propiedades por una simple lista de propiedades (que justo da la ED ya existente al reconocer una ER) y el árbol global de propiedades por un grafo de propiedades.

El resultado es que conforme se insertan las ERs en la ED se va generando el grafo automáticamente.


Evolución:

La cadena ha pasado de tener un campo tipo y después añadirsele otro llamado subtipo.

El la ED estaba organizado paralelamente a los diccionarios especiales, unas listas específicas por cada tipo o subtipo.

La siguiente evolución fue gracias al potente motor de los autómatas. Éste nos puefe informar de las propiedades de una cadena si se insertan las ERs correctas. Para organizar todo, se introduce el concepto de árbol de propiedades. Uno global en conjunto con la ED ya implementada (sin las listas de tipos) y otro específico en cada cadena sustituyendo al tipo y subtipo.

Funcionaba pero se quedaba corto. Es al introducir un grafo de propiedades como estructura global y las listas de propiedades en las cadenas cuando de verdad se ha automatizado todo en lo referente de gestion y almacenaje de las cadenas trabajadas por los autómatas dándonos la posibilidad de consultar por cadena o incluso obtener listados completos de cadenas que cumplan propiedades.

Esto implica que el mayor peso recae sobre el autómata. Las ERS deben de ser correctas, sin fallos de paréntesis y simplificadas.  Aún así a más ERs más tarda en arrancar aunque luego las consultas sean inmediatas.

El autómata es dinámico hasta cierto punto. Se pueden insertar tantas NUEVAS ERS en tiempo real como queramos. Pero al modificar ya alguna se tiene que recalcular por completo (o por lo menos en la actualidad).

Le he añadido un simple JFrame como ventana principal. Tiene un area de texto donde aparece todo lo que se va haciendo, tanto lo que el usuario escribe como los resultados que da la aplicación. Otra area de texto donde el usuario escribe y una barra de proceso. Para que ésta funcione correctamente he modificado el código de generación de los autómatas y carga de información en hilos para que trabajen de modo concurrente. 

Tengo que seguir modificando y añadiendo funcionalidad a una ED cada vez más robusta:

Con vista a guardar la información procesada (ha perdido esta funcionalidad al cambiar las estructuras) he pensado en añadir un booleano en los nodos de propiedades para que me informe si en su lista de cadenas hay alguna nueva desde la última vez que se guardó todo. Las nuevas ER también hay que guardarlas pero siempre respetando el orden en el que fueron creadas. 

Al introducir por ejemplo con las ERs de los numerales introducidos:

menos quince con siete entre dos

El automata lo reconoce y nos dice que es:

Numeral, numeral fraccionario. 

E inserta en los nodos del grafo del nuneral y del numeral fraccionario la cadena completa. 

El siguiente cambio sería que almacenase en el grafo lo que va reconociendo parcialmente:

Quince, siete, dos, menos quince y menos quince con siete. 

Quince, siete y dos: numeral natural, numeral entero positivo, numeral.

menos quince: nuneral entero negativo,  numeral.

menos quince con siete: numeral real positivo,  numeral.

Todo esto ya lo hace el autómata y el grafo tiene todos sus nodos ya preparados para manejar todas las propiedades.  Ahora sólo falta hacer que según reconozca cada elenento lo inserte en el grafo sin esperar al resultado final. 

Al fin y al cabo,  son expresiones regulares reconocidas que nos dan propiedades. 

También quiero, cuando me vea con fuerzas, hacer que descomponga la generación de autómatas en diferentes hilos,  uno por cada sigo +, para que de forma paralela trabaje e intentar reducir el tiempo de arrancado y posteriormente,  modificado de ERs ya procesadas. 

No hay comentarios:

Publicar un comentario