Blogia
Sailor Worlds

Ciencia , programación

La Máquina parlante

La Máquina parlante

Cuando hace unos años me propuse hacer un programa que conversara no era con la idea de inventar algo si no con la misma que me mueve a trastear con la música, el video y casi cualquier cosa. De hecho hoy en día prácticamente todo está hecho y la sabiduría reside en las págs de las webs para que los más sabios las encuentren a pocos clicks. Evidentemente esta perspectiva tiene sus puntos buenos pero también no tanto en el sentido en que el conocimiento desde abajo se va perdiendo. La rapidez y lo pragmático se impone al conocimiento a que se llegaba cuando se planteaba y resolvía desde abajo, pues es en el camino y en sus cruces donde ponemos a prueba y reafirmamos el conocimiento. Tan importante es a veces saber cómo, como el saber cómo no. Es verdad que no aprovechar las ventajas que ofrece esta era sería aún más de género bobo (que diría mi madre).

La idea como digo merecía la pena en sí. El reto que me planteaba era bastante grande para mis escasos conocimientos de programación y de la lengua española en cualquier caso inabarcable por la cantidad de matices que tiene. Después de unos años y comentando con mi colega Oscar, con quien disfruto a veces este lujo de conversaciones, se prodigaron un par de días intensos en los que hablamos seriamente del tema, tratando de concretar algo más. Digo hablamos seriamente porque el lápiz y papel estuvieron presentes y activos, con lo que se avanza bastante más que charlando.

Después de este par de sesiones tuvimos la oportunidad de juntarnos con el Pillo, para el que habría que empezar un escalón más arriba y ver qué había hecho ya (que sabio es mi amigo Pillo al que una vez más le abrumé con preguntas sobre la teoría de la relatividad y del caos..). A la vez que buscábamos algo parecido en la red salió el tema de las redes neuronales, en las cuales hay varios centros de procesamiento que evalúan y ponderan los resultados independientemente y entre ellas para llegar a un resultado final a veces sorprendente. El ejemplo que siempre sale cuando rozamos el tema es el de un programa que se hizo para diseñar circuitos. Se plantearon las reglas básicas para que el programa fuera capaz a través de la experiencia y probando millones de combinaciones de ir observando los resultados  e incluso de corregir sus reglas básicas. El programa diseñó algunos circuitos sorprendentes que los ingenieros no comprendían pero que funcionaban increíblemente bien.

Ese día no encontramos nada parecido en internet (otro día Oscar consiguió echar un vistazo a un par de ellos sacando una impresión regular). Yo he encontrado un par de ellos: El “IntelEnte” (que no conseguí descargar) y el “EnTLk” que se puede probar por 30 días y que merece la pena probar, al menos para situarnos. Después de probarlo creo que está muy bien, aunque supongo que aún nos queda mucho para superar el temido “Test de Turing”. Alan Turing es considerado padre de la AI (Inteligencia artificial) y allá por los cincuenta definió una prueba que medíría el grado de inteligencia de un ordenador(ya que en este proceso del habla se dan muchos aspectos que la pueden definir como veremos). Consistía básicamente en un juez, un ordenador, y otra persona. Se separaba en una habitación distinta al juez y éste formulaba preguntas. Al evaluar las respuestas escritas de ambos se definiría el grado de inteligencia de un ordenador. Me da la impresión que aún seguimos lejos para conseguirlo aunque un poquito más cerca. Las utilidades o el fin de un programa, si bien implican limitaciones en el mismo, reducen las posibilidades y complejidad exponencialmente. Aún así pensemos hoy en los traductores de idiomas que aún hoy no han conseguido suplantar al hombre. “Eliza” era el nombre de un programa con la función de simular a un psicoanalista. El  resultado, aunque admirable dista mucho de acercarse también al grado de inteligencia que tendría que tener para engañar a un hombre o simularlo.

   He visto algunos planteamientos en el  “EnTLk” que no había contemplado como la necesidad de traducir a su punto de vista que en un primer escalón evitaría de alguna manera. Segurísimo que hay ya muchos programas mas que resuelven la idea del conversador pero a qué nivel ?. Estamos habituados a utilidades relacionadas como los identificadores de voz (algo que es otro programa distinto que se podría añadir a posteriori), la corrección de palabras en procesamiento de textos o los reconocedores de palabras en los móviles, pero sin duda un programa que afronte una conversación tiene que ser algo más complejo.

Todos los elementos para que se haya una comunicación los tenemos en principio salvo el interés por tenerla/mantenerla. Imaginemos que alguien escribe “la casa es roja”. ¿Qué debería hacer el programa? ¿Contestar en relación al comentario, o bien no contestar, o bien cambiar de conversación? .También hace evidente la necesidad de que entienda (codifique) de alguna manera el mensaje recibido. ¿Qué es para él una “casa”? ¿Y “roja”? ¿Y “ser”?.

 

Para empezar debería analizar la información que recibe procesándola en dos grandes bloques, el sintáctico y el semántico ( si es que está ya todo inventado! )

Dentro del campo de las reglas para formular una oración o procesarla tendría incorporadas ya las conjugaciones por ejemplo, la necesidad de búsqueda de los distintos elementos de la frase y varios conceptos básicos que simularían la experiencia en un adulto o el ADN quizás. Dentro de este bloque estarían también las operaciones matemáticas por ejemplo. Convendremos también a que es una cuestión de palabras y relaciones entre ellas. Estas funciones ayudarían a identificar datos necesarios para la comprensión del mensaje, por lo que estará relacionado con el bloque de lo semántico. Son como las dos partes del cerebro con las distintas neuronas voy a aventurar la primera aproximación y voy a dividir las palabras en bloques según una idea:

 
Nombres (Pronombres),Sustantivos   El concepto,sujeto. La parte con más peso
 Verbos  Indican la acción a evaluar
 Adjetivos y adverbios  Dan colorido y determinación a veces
 Preposiciones,artículos determinativos,cojunciones  Juntan palabras. Dan información - peso
  

Aparte de las excepciones y reglas de cada grupo es interesante señalar dos cosas. La primera sería que las relaciones entre los distintos bloques expuestos tiene una dirección (el adjetivo añade al sustantivo en cuanto a significado quizás una determinación aunque en otros casos añade “sólo” (¡) matices). Podríamos definir esas flechas como las relaciones entre conceptos para ayudar con la parte del significado aunque habría que definir el significado en sí como la codificación de cada concepto en distintas variables que permitieran conseguir el entendimiento en sí. Esto nos lleva en primer lugar a las palabras en sí.

Cada una de ellas tiene significado propio y en unión con los demás elementos. Sólo habría que codificar todas las palabras en tantas variables como fueran necesarias para conseguir soluciones que serían procesadas a varios niveles o neuronas por seguir con el hilo. Para ello primeramente debemos tener un listado mínimo de palabras. Cuando empezamos a divagar sobre ello se ocurrieron varias líneas con respecto a las palabras y formación que no me resistiré a contar aunque se salgan algo de la línea principal.

Se nos ocurrieron varias formas de afrontar la creación de palabras, e incluso imaginamos un lenguaje de palabras posibles en plan Borges que no eran utilizadas mezclado todo en un sinfín de normas y conjeturas que resumiré en:

 
  • Junta todas las letras y las mezcla en todas las combinaciones posibles para formar palabra de hasta un total de 9 letras por ejemplo.

Realmente este problema se me planteó cuando hice un programa para desbloquear las claves de los archivos excel y curiosamente el otro día un amigo (juanma) me preguntó por algo así. No es más que una rutina que va probando combinaciones de letras a ver si cuela y si no la siguiente hasta tener éxito en el empeño. Pero, cuántas combinaciones de letras hay?. Depende en el caso del excel del número de variables que entren en juego. Es curioso comprobar como crecen exponencialmente hasta el hecho que un elemento de más o de menos puede significar mucho. En el caso del desprotector haríamos así las cuentas:

 COMBINACIONES POSIBLES
N LetrasMinúsculas+Mayúsculas
          1                                     27                                   54  
          2                                   729                              2.916  
          3                              19.683                           157.464  
          4                             531.441                        8.503.056   
          5                        14.348.907                     459.165.024  
          6                      387.420.489                24.794.911.296  
          7                  10.460.353.203            1.338.925.209.984  
          8                282.429.536.481          72.301.961.339.136  
          9             7.625.597.484.987     3.904.305.912.313.340  

COMBINACIONES POSIBLES
+Números+Acentos
                                  64                                     74  
                             4.096                                5.476  
                          262.144                             405.224  
                     16.777.216                        29.986.576  
                 1.073.741.824                    2.219.006.624  
               68.719.476.736                164.206.490.176  
          4.398.046.511.104            12.151.280.273.024  
       281.474.976.710.656          899.194.740.203.776  
  18.014.398.509.482.000     66.540.410.775.079.400  

En otras palabras una burrada de combinaciones, que dependiendo de la velocidad a que se procese daría un resultado siempre muy alto. En mi P3 según mis cálculos estaríamos hablando de varios años en casos de 6 letras creo recordar. Siempre está la posibilidad de fragmentar la búsqueda en varios ordenadores, pero aún así. Nos podemos hacer una idea de la importancia reañadir un número a una clave o un carácter raro.

  • Junta grupos de palabras posibles, monemas o sílabas lo que hace disminuir las combinaciones frente a las palabras. Nos pareció que la mejor opción de las dos  sería la de las sílabas en cuanto a juntar combinaciones, definibles mediante la pura observación. Así definimos reglas para sílabas de hasta 4 letras , planteando los distintos escenarios de una, dos, tres, cuatro letras; vocal + vocal+consonante. Aunque bastantes opciones se puede acabar reduciendo bastante. Cuando corrimos el programa nos quedamos con un total de 1849 sílabas posibles según nuestras reglas, si bien se podía hacer una criba que intuitivamente debería rondar las 1200 sílabas, ya que se podían quitar bastantes más. Un problema añadido era que para algunas combinaciones de palabras como “OC”, si bien te me ocurren “Octeto” u “Octavo” y 50 más añadirán muchísimas más combinaciones absurdas que válidas, lo cual hace inmanejable la propia base de datos aparte de su inutilidad para nuestro propósito. Se puede ver las diferencias entre las combinaciones que saldrían de sólo palabras con las de sílabas:
N SílabasN combinacionesComparación letras (9)%
          1                                1.200     
          2                          1.440.000     
          3                        38.880.000     
          4                    1.049.760.000     
          5                  28.343.520.000   -        7.597.253.964.987    - 99,63 % menos
  • Para la cuestión de los monemas (tb sílabas) pero también para las palabras en sí sería un programa que a partir de págs de internet o bien documentos que se le faciliten pudiera sacar y descomponer las palabras. Con esto tendríamos bastantes menos seguro y desde luego es lo que más sentido tiene. Buscando información pudimos leer sobre un programa que habían utilizado para hacer un diccionario de castellano en todo el mundo. Había estado durante 10 años alimentándose de págs de internet, TV , conferencias, anuncios y folletos y en fin de casi cualquier fuente de palabras. La edición que publicaban era de creo recordar 3.000.000 habiendo resgintrido términos de poca aparición en esos años. Como cosa curiosa advertía el hecho que una palabra que hace 10 años no tenía uso prácticamente, ahora estaría quizás incluida en dicho diccionario y al revés. El ejemplo que se citaba era el término “talibán”.

Una vez resuelta la fuente de las palabras deberíamos de retomar el tema del significado de un concepto en sí.  Cada palabra debe tener varias clasificaciones y dentro de cada una varias variables que ayuden a ponderar decisiones pero cuántas. Ya hemos hecho alguna clasificación general y ahora se trataría de acercarse un poco más al fondo. Cada ”neurona” luego actuaría con los valores de cada término. Podríamos decir que una palabra que tuviera toda la información en las variables debería estar definida y tener un sentido. Después y según la experiencia adquirida se irían afinando los parámetros. Esto establecería palabras de varios niveles según la información contenida o el sentido que se le pudiera dar por la información de que dispone, y es la búsqueda de esta información una de las razones que debe seguir el programa para intentar mejorar, o para en otras palabras tener un primer interés en que la comunicación se produzca. Por seguir razonando en este sentido, pudiéramos decir que el programa debe tener una especie de memoria de sinsentidos sobre la que puede volver y con objeto de clarificar conceptos y relaciones o conflictos entre ellos. Pero sigamos matizando en los conceptos y las variables que deberían componer un significado claro de por sí. Podríamos coger por ejemplo los sustantivos y empezar la clasificación a ver qué tal:

Sustantivos   
 Contador 
NombreReferenteUsoFrecuencia 
Para mí   
Colectivo   
Para otro   
   

 Nivel emocional/Connotación 
 Interesante  Práctico  Bonito  Abstracto/Incontable 
LugarPosesiónReflexivo Grande 
 Valor económico  Número  Slang  significado propio 
 Acción  Reacción  Sinónimo  Antónimo 
 Esfuerzo  Movimiento  Contenible  Género 

Una parte importante podría ser el referente, o bien para quién tiene sentido una información. No significa lo mismo para mí que para ti y seguramente cuando sea así podamos hablar de matices dentro del concepto. Así cada palabra tendría tres niveles de significado y uno sólo según la ponderación que se haga. Por otra parte ayudaría a sopesar y comparar el concepto lo cual siempre viene bien. Del contador nos ocuparemos en seguida, pero baste por ahora decir que tiene mucho que ver con la memoria. En cuanto al nivel emocional y de significado decir que se pueden encontrar varios más y que muchos vendrán dados por la necesidad a la hora de ir codificando las distintas palabras y posibilidades. Sería la hora de ir viendo las posibilidades y que implican cada una.

El tema de la memoria merece ser tratado también aparte ya que mediante ella vamos a dotar de relaciones a los conceptos. Ya hemos hablado en el principio de las relaciones entre conceptos y como tenían una dirección. Este vector resultante de unir varios conceptos iría quedando en un rango de memoria con objeto de no perder la pista. Así hablaríamos de relaciones con distintas ponderaciones según se ha procesado en el momento con ellas y por tanto un posible significado con una fecha concreta que podría formar parte de la inconsciencia, del prejuicio a veces o estereotipos mal formados. La  estructura del vector de memoria sería un registro que almacenaría la id de concepto, la fecha, la dirección de la frase almacenada (otra porción de memoria en otro rango en el que permanecería hasta haber despejado todas las dudas  –mencionado tb anteriormente-) y las distintas direcciones (relaciones ) a conceptos con su signo correspondiente de dirección y referidas a las variables que hayamos definido de cada concepto. Debería ser capaz también en cada una de las valoraciones de modificar los parámetros de medición por medio de la experiencia, con lo que aparte de las preguntas dirigidas a esclarecer hechos o relaciones, estableceríamos también un proceso paralelo que  fuera capaz de actualizar datos en la memoria aunque fuera mínimamente y matizando los casos.

Otra de las partes importantes a considerar sería con quién se está hablando. No es lo mismo hablar con un humano, que sea a través de págs de internet o con otro humano distinto. Hace pensar sobre la necesidad de crear distintos usuarios que podrían estar codificados también en variables tales como fiabilidad, contesta, nivel de ayuda…

Faltan como escollos bastantes temas más. Fenómenos como la Polisemia / Homonimia (palabras con más de un significado –cabo; de ejército o de vela- y palabras que suenan igual con diferente significado –vino; de venir o de beber- respectivamente). La metáfora (es una joya ; vale mucho) y la metonimia (quiero otra copa-más bebida) por no hablar de otras muchas figuras literarias o bien de las frases hechas, para las cuales habría que tener alguna codificación y almacenaje.

Por último hablar de alguna utilidad curiosa que estaría bien que pudiera hacer un programa de este tipo:

  • Dándole a procesar un libro podría hacer resúmenes, o al ser preguntado podría haber entendido algo…(capacidad relacional de un nivel impensable)
  • Podría almacenar los datos importantes de una historia y responder a preguntas con objeto de intentar averiwar la historia que esconde, como el juego de los chavales en campamentos.
  • Uno de los que más me gustaría hacer sería uno que hiciera versos…
 

En fin, mi impresión es que nos queda un montón de detalles que plantear pero por algo se empieza siempre. Igual estas líneas sirven para plantear más cuestiones.