La prueba de software y los special purpose languages

Publicado en

Parte 5.

En números anteriores hemos venido estudiando los lenguajes formales para tener herramientas que nos permitan hacer más eficiente el desarrollo de software. Permítanme en este número hacer una digresión para abordar brevemente el tema principal de este número, que considero podría serles de utilidad en el futuro próximo; prometo no entrar en detalle más allá de lo estrictamente necesario.

El tema “Lenguaje” es muy profundo y de muy largo alcance (y, debo confesar, es una de mis más profundas pasiones).

“Lenguaje” está fuertemente vinculado con “Aprendizaje” e “Inteligencia” (por cierto, durante la Segunda Guerra Mundial se utilizaron exitosamente exámenes de lenguaje para seleccionar posibles oficiales entre soldados rasos).

Hay quien ha llegado a escribir  “… el universo es lenguaje, y el lenguaje es universo.”,  una frase de profundo alcance.

En un número anterior comentamos que sólo hasta que aprendió sobre funciones recursivas, el científico C.A.R. Hoare pudo expresar su método de ordenamiento llamado “QuickSort”.  Eso evidencía que los constructos de un lenguaje de computación pueden limitarnos para expresar lo que tenemos en mente (al menos inicialmente). Pero, ¿acaso no ocurre lo mismo con nuestras habilidades lingüísticas, iniciando con nuestra lengua materna?

A lo largo del tiempo se han enunciado diversas “promesas” sobre las capacidades de una computadora para procesar lenguaje natural. Algunas capacidades sencillas ya pueden verse hoy en día comercialmente: hay asistentes personales que nos pueden ayudar a  realizar reservaciones en un Hotel, o “chatbots” para dar soporte.

Otras capacidades más sofisticadas han quedado pendientes. Quizás estemos cerca de ver algunas de ellas comercialmente. Hace algunas semanas asistí a unos eventos de la IBM relacionados con “computación cognitiva”:

  • Pude ver cómo un robot humanoide con varios grados de libertad obedecía instrucciones en Inglés medianamente complejas, a través de una conexión con Watson.

  • Me tocó ver la descripción de un producto para dar soporte de primer nivel, para el que, luego de recolectar 3,000 preguntas, se diseñaron 300 como “intended questions”, que se utilizan como llaves primarias en una base de datos para encontrar las respuestas correspondientes; si el usuario comenta que no recibió la respuesta adecuada, entonces pasa a comunicarse con un humano; se mencionó una “tasa de éxito” es de entre 30% y 70%.

  • Nos hablaron de un proyecto con el cual Watson podría apoyar a vendedores sugiriendo una propuesta de  venta, partiendo de un análisis de patrones de compra del cliente, de su historial de compras, de sus “sentimientos” en las redes sociales, y de noticias sobre él en fechas recientes.

Pero, hablando de aplicaciones que implican una interacción en lenguaje natural muy sofisiticada, a qué nos referimos cuando decimos que una computadora “entiende” el Español por ejemplo?    A que la máquina sea “inteligente”, que pueda “pensar”?

Como una primera aproximación para responder esas preguntas, ya en 1950 Alan Turing sugirió reemplazar la pregunta “¿Pueden las máquinas pensar?” por “¿Puede una máquina tener un buen desempeño en el ‘Juego de la Imitación’?”, juego que consistía en que un humano interrogaba de manera remota a un hombre y a una mujer que se encontraban en otro cuarto para determinar cuál respuesta había sido dada por el hombre y cuál por la mujer.

Si las computadoras pudieran entender nuestros idiomas tan bien como lo hace una persona promedio, podrían comprender muchísimo de lo que hay escrito en internet, así es que podríamos hablar con ellas sobre una inmensa cantidad de temas, y entonces, en muchos casos, sería difícil distinguir si estamos “hablando” con una máquina o con un ser humano muy inteligente y cultivado.

(Por cierto: si las computadoras entendieran bien lo que dices y escribes en tus redes sociales y tus correos, entonces una buena cantidad de organizaciones podrían saber más de tu vida de los últimos meses que tus seres queridos más allegados.  :-)  )

El que las computadoras entiendan el lenguaje natural puede tener muchísimas aplicaciones, no solo relativamente “sencillas” como las que mencionamos, sino otras de mucho mayor impacto. En los sistemas e-Learning, por ejemplo, podríamos tener “instructores” que jamás se desesperarían y que podrían enseñar a muchísimas personas, democratizando el conocimiento, y generando más oportunidades para todos; especialmente para los principiantes.

Tenemos 50 años diseñando lenguajes de programación para comunicarnos con las computadoras. Cabe preguntarse: ¿por qué no desarrollar también lenguajes naturales para comunicarnos con ellas?    

Ya hay antecedentes de ese trabajo; echémosle un ojo.

Lenguajes “naturales artificiales”

Llamamos “lenguajes naturales” a aquellos que son o fueron utilizados por una comunidad de seres humanos para comunicarse (como el Español, Inglés, Ruso, Latín, Arameo, etc.). A aquellos lenguajes naturales que son o fueron utilizados por una comunidad pero que fueron desarrollados artificialmente los llamamos “Lenguajes Planificados” (como los que se muestran más adelante).

Se considera que la historia de los Lenguajes Planificados comienza en el siglo XVII, con los trabajos de Descartes y de Leibniz.

Estos tipos de lenguajes parten de una clasificación de conceptos y construyen sistemas interconectados ordenados alrededor de conceptos fundamentales.

Después de esos trabajos se desarrollaron otros Lenguajes Planificados, en relativamente diferentes momentos y países, y partiendo de principios distintos:

  • Los llamados lenguajes “a priori” o “esquemáticos” o “meta-lenguajes”, que no incorporan características/construcciones de lenguajes naturales (al menos no intencionalmente), y que tienen una estructura altamente esquematizada, regular y lógica.

Este tipo de lenguajes fueron dominantes durante varios siglos, pero en las primeras décadas del siglo pasado sufrieron un rápido declive. Por otro lado, los que se describen enseguida ganaron un rápido crecimiento.

  • Los llamados lenguajes “a posteriori” o “naturalistas” que decididamente toman características de los lenguajes naturales (por ejemplo, la irregularidad tanto en la composición de las palabras y frases, como en declinaciones y conjugaciones), y que renuncian a esquemas y clasificaciones dadas a priori.

Una clase particular de estos lenguajes son los llamados “pseudo-lenguajes”, que mezclan elementos de lenguajes naturales como raíces y declinaciones (originales o modificadas) con elementos desarrollados artificialmente.

  • Los lenguajes naturales simplificados (“sean” vivos como el Español, el Ruso, Chino o “muertos” como el Latín y el Arameo), en los que los mecanismos de “construcción” del lenguaje en cuestión (conjugaciones, declinaciones, constitución de frases, etc.) son simplificados sistemáticamente (por ejemplo, haciendo regulares verbos que son originalmente irregulares).

 

En la siguiente tabla mostramos algunos de estos Lenguajes Planificados: 

Lenguajes “a priori” o “meta-lenguajes”

Lenguajes “a posteriori” o “naturalistas”

Lenguajes “a posteriori”  “pseudo-lenguajes”

Lenguajes naturales simplificados







 

Beobi (1920, Rusia)

 

Suma (1943, EEUU)




 

Unilingua (1965, Francia)




 

Semi-Latin (1910, Austria)




 

Romanid (1956, Hungría)

Volapük (1879, Alemania)

Esperanto (1887, Polonia)

Dilpok (1898, Francia)

 

Novesperanto (1910, Suiza)




 

Intal (1956, Alemania)

 

Malfalsito (1963, Francia)



 

Tutonish (1902, EEUU)

 

Simplo (1911, Italia)

 

Anglic (1930, Suecia)

Basic (1935, Gran Bretaña)

 

Dos de los Lenguajes Planificados más relevantes son: 

  1. Volapük

Fue desarrollado en Alemania por Johann Martin Schleyer, publicado en 1879, pensado para que lo usara la élite educada. Fue el primer Lenguaje Planificado en pasar de la teoría (sin una comunidad que usara el lenguaje) a la práctica (una comunidad amplia que lo usara y enriqueciera).

Luego de 10 años de su publicación, ya existían 283 Organizaciones de “Volapukistas”, 25 diarios en ese idioma, muchos libros de enseñanza traducidos a 25 lenguajes; así como una Academia de la Lenguaje, que por cierto no era muy abierta a aceptar o desarrollar reformas al lenguaje, lo cual, aunado a que el autor veía al lenguaje como algo de su propiedad, originó un gran debilitamiento del “Volapukismo”.

  1. Esperanto

Esperanto significa “un esperanzado” o “alguien que espera”, lo que da idea inicial sobre su autor, quien realizó las primeras publicaciones sobre el lenguaje bajo el seudónimo de “Dr. Esperanto”.

Su verdadero nombre era Lazarus Ludvig Zamenhof. De origen judío, nació en 1859 en Bialystok (hoy Polonia), en donde confluían rusos, polacos, alemanes y judíos; él vivía en un área socieconómicamente deprimida.

Zamenhof hablaba Ruso en casa y Polaco en la calle; en la preparatoria se distinguió en Alemán y Francés, así como en Latín y Griego; con su padre profundizó en el Hebreo.

Estudió medicina en Varsovia, y luego se especializó en Oftalmología.

Zamenhof era un humanista idealista que, viviendo en Europa pocos años antes de la Primera Guerra Mundial, quería con su “Lenguaje Universal” unir a la humanidad. Murió en 1917 pobre, en buena medida por sus inversiones en el desarrollo del Esperanto (publicaciones, viajes, actividades, etc.).

A diferencia de Schleyer con Volapük, Zamenhof no se apropió del Esperanto. Esperaba que el lenguaje contribuyera a una democratización del saber y la cultura, y a conectar las masas a nivel internacional sin necesidad de la élite educada.

Sabía que su “Lenguaje Universal” podía generar un movimiento social, y realizó también trabajos para desarrollar una “Religión Universal”.

 

Zamenhof diseñó Esperanto buscando que…

  • fuera tan fácil de asimilar, que cualquiera pudiera aprenderlo jugando;

  • pudiera ser usado rápidamente por un aprendiz, gracias a su estructura simple y lógica;

  • fuera usado por las masas.              

 

Objetivos que alcanzó gracias a que en Esperanto:

  • el vocabulario fue tomado de varios lenguajes naturales vivos;

  • la derivación y la flexión son regulares y estructuradas;

  • a cada letra le corresponde un solo sonido, y el vocalismo se limita a las 5 vocales;

  • las raíces de las palabras se tomaron en un 75% de las lenguas romances –especialmente el Latín (del que fueron escogidas por su internacionalidad, de manera que un ruso entendiera inmediatamente un 40%) y del Francés–, 20% de las lenguas germánicas, y el 5% restante del Griego, Hebreo, el Árabe, el Japonés, y las lenguas Eslavas;

  • se buscó una pronunciación con máxima internacionalidad.

Todo lo anterior originó que el Esperanto ganara mucha aceptación: la primera de las muchas publicaciones sobre el lenguaje fue “Linguo Internatia” en 1887; en 1905, en Francia, 668 personas de 20 países participaron en el primer Congreso Mundial; hasta antes de 1914 se realizaron unos 8 congresos. Sin embargo, en ese desarrollo se cruzaron las dos grandes guerras, y todas las consecuencias de las mismas debilitaron mucho ese movimiento.

Lingüística Computacional

Aún cuando la idea de desarrollar un Lenguaje Planificado que tenga la estructura adecuada como para hacer práctica la comunicación de un humano con un sistema de cómputo es “nice”, y viable en principio, eso no es lo que finalmente se busca; entre otras cosas porque los humanos tendríamos que aprender otro lenguaje natural, lo cual es una limitante, aún en nuestras sociedades modernas. Lo que se desea es entendernos con ella libremente en nuestra propia lengua.  Eso nos empuja a ver las cosas desde una perspectiva más amplia: la Lingüística Computacional.

La Lingüística Computacional es un campo interdisciplinario que comprende secciones de lingüística tradicional y teórica, lexicografía, psicología del lenguaje, filosofía analítica y lógica, procesamiento de texto, bases de datos, así como procesamiento de lenguaje hablado y escrito.

La computación numérica ha sido el enfoque predominante desde el nacimiento de las computadoras. En él, la comprensión del lenguaje natural ha estado restringida fundamentalmente al usuario: cuando uno quiere encontrar fragmentos relevantes en un texto largo relacionados con “problemas con autos rojos durante el periodo entre 1990 y 2000”, la palabra “rojos” es tratada sólo como un signo por la computadora, no con el significado que tiene para nosotros; si la computadora entendiera  no solo el significado de “rojos”, sino de la frase completa, nos mostraría también textos que incluyeran las frases “década de los 90s”, y “sedanes/automóviles/coches tintos”, entre otras.

Técnicamente dicho: en los sistema de cómputo actuales, el query anterior tiene una alta Precision (esto es: de los textos que son mostrados, el porcentaje que sí son relevantes)  pero tiene un bajo Recall (de todos los posibles textos relevantes, el porcentaje que representa los que sí son mostrados).

La llamada “Nouvelle Artificial Intelligece” no hace el típico procesamiento simbólico de la “traditional Artificial Intelligence” usando “computadoras numéricas”, sino que se enfoca al procesamiento de significado usando “Agentes Autónomos” (robots). La Lingüística Computacional hace uso de este tipo de tecnología.

El objetivo de la Lingüística Computacional es desarrollar componentes tecnológicos, que llamaremos “agentes cognitivos autónomos” (robots), con los que el humano pueda comunicarse libremente en natural lenguaje. Esto cual requiere del modelado de procedimientos y estados cognitivos, para lo cual es necesario tanto un modelo del hablante como del oyente.

Para efectos del desarrollo de un agente cognitivo autónomo, uno podría considerar como…

  1. “Prototipo Básico de Comunicación” el discurso que se presenta entre dos partes, “cara a cara”, hablando de objetos concretos, y en su ambiente inmediato.

  2. “Componentes de Comunicación Básica”…

  • La especificación del medioambiente de la tarea a realizar (a la representación interna actual del medioambiente se le suele llamar “Contexto” del agente).

  • La estructura del agente cognitivo, que representa su “cognición”; los datos que recibe (por ejemplo de sensores), que constituyen su “percepción”; y la clasificación de los mismos que se considera su “reconocimiento”.

  • La especificación del lenguaje en el cual se lleva a cabo la comunicación, que debería los siguientes elementos:

  1. Fonética: para facilitar la automatización de los procesos de articulación, acústicos y auditivos del habla.

  2. Léxico: en el cual tengamos por ejemplo, para cada concepto, sus hipónimos e hiperónimos, que nos permitan entender mejor el input recibido por el agente para generar un output de mejor calidad.

  3. Morfología: que nos facilite el análisis de las palabras del input y obtener sus constituyentes para eventualmente expandirlas antes de generar el output del agente.

  4. Sintaxis: que nos permita detectar si las estructuras en el input son correctas y generar las equivalentes en el output.

  5. Semántica: que nos permita por ejemplo entender frases con negaciones y detectar frases que tienen significados equivalentes.

  6. Pragmática: que nos permita entender el significado de frases genéricas como “aspectos revisados en la última junta” en contextos particulares.

Para ilustrar algunos de los elementos anteriores tomemos el caso de la traducción automática. A lo largo del tiempo se han desarrollado diferentes enfoques:

  • Traducción directa (50’s - 60’s): utilizando diccionarios, prácticamente se traducía palabra por palabra (o cuando mucho, utilizando su morfología), evadiendo el análisis del significado, pero buscando preservar los significados y proporcionar traducciones sintácticamente aceptables.

  • El enfoque “de Transferencia”, en el que se realiza un análisis léxico, sintáctico y morfológico del texto y se construye una representación del mismo; luego, utilizado esa representación y un diccionario que incluya aspectos sintácticos y morfológicos, se hace la traducción. Es un mejor enfoque que el anterior, pero aún no se entiende el significado del input, lo que generará problemas cuando:

  • un verbo en el lenguaje fuente (“to be” en Inglés) tiene dos traducciones en el lenguaje destino (“ser” y “estar” en Español), o

  • un pronombre en el lenguaje fuente (“they” en Inglés) tiene dos traducciones en el lenguaje destino (“ellas” y “ellos” en Español).

  • El enfoque ‘Interlingua’, en el cual, además del análisis léxico, sintáctico y morfológico, se realizan también el semántico y el pragmático, y se construye una “representación interlingüística” (por ejemplo, en Esperanto) rica en elementos para permitir generar una traducción de alta calidad.

  • Se han desarrollado también soluciones parciales como los “Restricted Languages”, que son lenguajes naturales simplificados altamente esquematizados y enfocados a un dominio específico, permitiendo con ello realizar traducciones de muy alta calidad.

 

(Después de lo anterior, qué no podría preguntarse uno: si el agente me entendiera a mí en Español y a ti en Alemán, en realidad “entendería” los dos idiomas; ¿por qué no habría de funcionar como nuestro traductor?)

El aspecto formal

Aún cuando en nuestra primera columna mencionamos un enfoque sobre lenguajes formales llamado Sistemas Lindenmayer (proveniente de la Biología), dado nuestro interés en encontrar mecanismos para eficientar el desarrollo de software, en números posteriores estudiamos los lenguajes formales utilizando principalmente los trabajos sobre gramáticas del lingüista Noam Chomsky, las cuales se conocen como Gramáticas Estructuradas por Frase, y en un número reciente presentamos una jerarquía de las mismas. Se presume que, en esa jerarquía, los lenguajes naturales se encuentran en la clase de los Lenguajes Sensibles al Contexto.

En realidad, las Gramáticas Estructuradas por Frase son un tipo particular de las llamadas Gramáticas Generativas, que son sistemas (“recursivos”) de reglas provenientes del trabajo en la Lógica Matemática.

Algunos de los enfoques más relevantes que han sido utilizados para abordar las Gramáticas Generativas son:

  1. Gramáticas Categóricas (“C-Grammars”): desarrolladas inicialmente en 1929 por el polaco Lesniesvsky. Aplicadas al los natural lenguajes por primera vez por Bar-Hillel en 1953.

  2. Gramáticas Estructuradas por Frase (PS-Grammars): basadas en los “Rewrite Systems” de Emil Post desarrollados en 1936, que fueron aplicadas a los lenguajes naturales por primera vez por Chomsky en 1957.

  3. Gramáticas Asociativas-por-la-Izquierda (Left-Assotiative-Grammars): desarrolladas en 1985 por Roland Hausser especialmente para procesar lenguajes naturales.

Los dos primeros enfoques presentan el problema de que los recursos requeridos (tiempo y memoria) para hacer el procesamiento de lenguajes naturales son demasiado grandes como para llevarlos a la práctica. El tercero muestra algunas bondades al respecto.

Formalmente, una Gramática-LA (del Inglés Left-Associative Grammar, LAG) es una séptupla de la forma:

〈 W, C, LX, CO, RP, SI , SF 〉    donde 

W es un conjunto finito de llamadas Word surfaces; 

C es un conjunto finito de Category segments ;

L⊃  ( W×C+ ) es un conjunto finito conteniendo el Lexico) ;

CO= ( co1, …, con-1 ) es una secuencia finita de funciones recursivas totales (entiéndase “programas”) de (C* ×C+) a (C* ∪{⊥})  llamadas Categorial Operations ;

RP= ( rp1, …, rpn-1 ) es una secuencia finita ( igualmente larga que CO ) de subconjuntos de n  ( donde n = { i | 0 ≤ i < n} )  llamada Rule Packages ;

SI= { ( cs1   rps1 ) … ( csk   rpsk ) } es un conjunto finito de eStados Initiales, donde cada c∈C+ y cada rp es un subconjunto de n llamado paquete de reglas de inicio;

SF= { ( cf1   rpf1 ) … ( cfk   rpfk ) } es un conjunto finito de eStados Finales , donde cada c∈C* y cada rp ∈RP .

 

Así como con las Gramáticas Estructuradas por Frase de Chomsky que estudiamos,  en el conjunto de lenguajes generados por Gramáticas-LA también tenemos subclases:

  • Las Gramáticas-LAgenerales, o A-LAGs, corresponden a la definición de arriba.

  • Las Gramáticas-LA limitadas (Bounded) linealmente, o B-LAGs (LAGs), son la subclase de las A-LAGs en las cuales la longitud de las categorías está limitada linealmente con respecto a la longitud de la cadena de entrada.

  • Las Gramáticas-LA limitadas por una Constante, o C-LAGs, son la subclase de las B-LAGs en las cuales la cantidad de cálculos requerida por operaciones categóricas individuales está limitada por una constante.

Dentro de estas C-LAGs tenemos las subclases de C3-LAGs , C2-LAGs , y C1-LAGs .

 

La siguiente es la relación de las LAGs con la Jerarquía de Chomsky (incluimos algunos aspectos de rendimiento, que eventualmente abordaremos en números posteriores).

El conjunto de Gramáticas-LA…

  • generales o A-LAGs, aceptan y generan todos los Lenguajes Recursivos (o “Decidibles”), algo relevante, pues como vimos en un número anterior, en la Jerarquía de Chomsky no había un tipo de Gramática que definiera este tipo de lenguajes.

  • bounded o B-LAGs, aceptan y generan todos los Lenguajes Sensibles al Contexto (LSC).

  • constant o C-LAGs, constan de 3 subclases:

  • C3-LAGs contiene los Lenguajes Libres de Contexto (LLC) más complejos y algunos LSC que son “NP-Complete” (la clase de problemas para los cuales no se han descubierto algoritmos eficientes que los resuelvan, y se piensan que no existen). Para procesar estos lenguajes se requiere tanto tiempo que los vuelve prohibitivos en la práctica (técnicamente requieren “tiempo polinomial”, lo que significa que pueden procesarse en un tiempo expresado como un polinomio de grado ≥ 2 en función de la cantidad de datos de entrada).

  • C2-LAGs contiene varios LLC “no-deterministas” (su procesamiento implica backtracking) y varios LSC simples. Para procesarlos también se requiere tiempo polinomial.

  • C1-LAGs contiene todos los LLC “deterministas” (no requieren backtracking para procesarlos) y varios LSC simples. Su procesamiento sólo requiere tiempo lineal, lo que los vuelve muy útiles en la práctica.

Se piensa que en esta jerarquía, los lenguajes naturales están dentro de la clase C1-LAG, lo cual significaría que su procesamiento puede realizarse de manera práctica, aún con altos volúmenes de input.

Ojalá y tengamos pronto una C1-LAG para el Español, que nos permita desarrollar verdaderos sistemas cognitivos y entendernos con las computadoras en nuestra lengua materna!  

Sistemas que nos hagan buenas traducciones, nos ayuden en el trabajo, y de paso, ¡ayuden a los niños con su tarea!  :-))))  

(¿Ven ahora por qué decimos que la Lingüística Computacional es de largo alcance?      :-)))  )

Bio

Luis Vinicio León Carrillo es Director General y co-fundador de e-Quallity. Fue profesor-investigador en la universidad ITESO. Realizó estudios de posgrado en Alemania, durante los cuales abordó temas relacionados con la prueba de software y los métodos y lenguajes formales.