Algoritmo para inventar palabras

Jugando con el lenguaje vamos a crear un algoritmo que invente palabras. Pero no el típico algoritmo que elige letras al azar. La idea es que genere palabras que parezcan españolas o al menos que se puedan leer sin problemas. Lo que se conocen como jitanjáforas . Para eso hay que seguir una reglas, empezaremos creando sílabas «válidas». Una forma de hacer esto es usa ngram de letras. Ya vimos su uso para generar textos. El principio es el mismo pero usando letras en lugar de palabras. Como ya hemos visto ese método, en esta entrada usaremos una técnica diferente que permite mayor personalización (y así no me repito).

Inventando sílabas

Las sílabas que construyamos tienen que ser habituales en el español. Para facilitar nuestra tarea vamos a evitar generar sílabas que nos puedan dar problemas.

Seguiremos las siguientes reglas:

  • Omitiremos los caracteres raros en el español: k, x, w
  • Las vocales sueltas, solo las permitiremos cuando sea la primera silaba de la palabra: a, e, i, o, u
  • Las sílabas serán consonante + vocal
  • Hay consonantes que pueden ir acompañadas de una segunda consonante antes de la vocal:
b[r,l]
c[h,r,l]
f [r,l]
g[r]
p[r]
r[r]
t[r]
  • Tras la vocal pueden llevar las consonantes n,s. 
  • Un caso especial, la ‘q’ que prácticamente siempre va seguida de ‘u’ de hecho nosotros solo permitiremos dos formas: que, qui
  • Otro caso especial es la ‘g‘ cuando va seguida de la ‘u‘ dando lugar a ‘gu‘ que puede ir seguida de otra vocal. Solo contemplaremos la posibilidad de las formas: gua, gue, gui

Expresiones regulares

Vamos a usar un generador de textos aleatorios a partir de expresiones regulares. Para ello usa una expresión regular como plantilla para generar un texto. La librería que usaremos es esta, se puede probar directamente desde la web sin instalar nada.

Todas las regla de arriba se codifican en forma de una expresión regular como:

([aeiuo]|[])(((b[rl]?([aeiuo]|[ae]))|(c[rhl]?([aeiuo]|[ae]))|(d[r]?([aeiuo]|[ae]))|(f[r]?([aeiuo]|[ae]))|(p[r]?([aeiuo]|[ae]))|(r[r]?([aeiuo]|[ae]))|(t[r]?([aeiuo]|[ae]))|(s([aeiuo]|[ae]))|([vhjkñz]([aeiuo]|[ae]))|(l([aeiuo]|[ae]))|(m([aeiuo]|[ae]))|(n([aeiuo]|[ae]))|(qu[ei])|((gu[ae])|(g([aeiuo]|[ae]))))([nrs]|[]|[])){2,5}

Así toda de una vez y sin explicar se puede atragantar un poquito

([aeiuo]|[]) – empieza por vocal o no

((b[rl]?([aeiuo]|[ae]))|(c[rhl]?([aeiuo]|[ae]))|… – puede ser b o c (o d o e….)

((b[rl]?([aeiuo]|[ae])) – b puede ir seguido o no de r, seguido de una vocal

([nrs]|[]|[]) – la silaba va seguida de n,r,s o nada

{2,5} – de 2 a 5 silabas

Ajustar las probabilidades

La a y la e son mucho más probables que la i,o,u. Sin embargo la expresión regular aplica la misma probabilidad para todas las letras El truco está en como funciona el operador ‘|‘ y el ‘[]’.

Por ejemplo: [ae]|[aeiou]

Lo que hay a cada lado del | tiene un 50% de probabilidades. En el lado de la derecha la ‘a‘ aparece con un 50% de probabilidades y en el de la izquierda con un 20%. Dando para la ‘a‘ una probabilidad del (0.5*0.5)+(0.5*0.2)=0.35

Para todas las vocales las probabilidades son:

a (35%) , e (35%) , i (10%), o (10%), u (10%)

El mismo truco se usa en otras expresiones como: ([nrs]|[]|[])

Correcciones

Tras generar las palabras hay que aplicar algunas correcciones:

  • Si empieza por ‘rr’ se cambia a ‘r’
  • Si tiene ‘nb‘ o ‘np‘ se cambian por ‘mb‘ y ‘mp

Libre albedrío e inteligencia artificial

Esta entrada es más filosófica que técnica. Y es que nuestros conocimientos sobre las raíces del libre albedrío muy limitada. No tenemos ni idea de los mecanismos que los producen.

El libre albedrío es la capacidad que tiene el ser humano de decidir «por si mismo». Es curioso lo fácil de entender lo que es pero es difícil que es saber como funciona, tan difícil que ni siquiera hay pruebas de que de verdad exista. La mayoría de la gente cree que si porque así lo experimenta pero nada nos asegura que esa sensación se real. Aquí nos adentramos en el inquietante terreno de la metafísica. ¿Estoy escribiendo este texto voluntariamente porque así lo deseo? o ¿Lo estoy escribiendo porque así lo desea algún mecanismo en mi cerebro y que me genera la idea de que es un acto voluntario?.

Si ni siquiera sabemos que es el libre albedrío ¿Cómo lo podamos reconocer desde fuera?. Una forma poco formal seria decir que un sistema con libre albedrío «hace lo que le da la gana». Decide por si mismo como actuar, por lo que en dos situaciones exactamente iguales puede actuar de manera distinta. Precisamente ese mecanismo el de «decidir como actuar» es el que no sabemos como puede funcionar. Y lo que conocemos hasta ahora del universo parece indicar que ese mecanismo puede no existir.

Determinismo

Esta visión del universo proviene de la física clásica. En su época la revolución que supuso entender los fenómenos naturales usando las matemáticas dio lugar a la creencia de que todo en el universo era predecible si se sabían las condiciones iniciales. Todo el universo funcionaba como los engranajes de un reloj. En un universo así no hay espacio para el libre albedrío. todo, hasta los seres humanos somos predecibles si tenemos suficiente información. Por lo tanto no hay manera de encajar el libre albedrío en ese modelo del mundo. podríamos decir que el mayor enemigo del libre albedrío es el determinismo

Caos

El determinismo parece que termina con la posibilidad del libre albedrío, todo es predecible, pero aún en un mundo determinista aparecen sistemas que son tan complejos que difícilmente pueden ser predecibles. Eso se debe a dos fenómenos, la realimentación y la sensibilidad a las condiciones iniciales. El primero significa que en cada momento el valor depende del valor que tenia el momento anterior. El segundo que están tan sujetos a las condiciones iniciales que cualquier pequeña variación hace que los valores que toman a los largo del tiempo evolucionen de forma completamente diferente (el famoso efecto mariposa).

Podría parecer que se ve un rayo de luz entre tanto determinismo. Si estos sistemas no son predecibles quizás expliquen el libre albedrío. Pero ¡Ojo! Los sistemas caóticos son deterministas, si pudiéramos garantizar con gran precisión unas condiciones iniciales idénticas el sistema se comportaría siempre igual. Así que el comportamiento impredecible solo lo es en apariencia, un libre albedrío caótico solo daría la sensación de ser realmente libre.

Comportamiento emergente

Hay otro tipo de sistemas que partiendo de un comportamiento determinista llegan a comportamientos complejos y difíciles de predecir. Sistemas que partiendo de la combinación de partes más simples llegan a comportamientos más complejos de lo que podría esperarse. Lo que tantas veces es descrito con la frase «El resultado de la suma es mayor que al suma de las partes» a esto se le conoce como comportamiento emergente.

Fenómenos como la consciencia o el libre albedrío cerebrales podrían deberse a un comportamiento emergente. está claro que nuestro cerebro es más que la simple agrupación de billones de neuronas. La estructura de sus conexiones (conectoma) parece ser fundamental para que el funcionamiento del cerebro.

Sin embargo ocurre lo mismo que en el caso anterior, realmente es un comportamiento determinista.

Mecánica cuántica

Frente a la seguridad matemática del determinismo la mecánica cuántica define el universo en forma de probabilidades, no podemos predecir con seguridad donde esta un electrón, solo la probabilidad de donde estará. El mundo ya no es determinista y esto nos da un hueco donde encajar el libre albedrío. Es más la mecánica cuántica establece que hay valores que nunca vamos a poder conocer con certeza ya que cuanta

La idea de que la consciencia y el libre albedrío son un fenómeno cuántico fue popularizada por Roger Penrose que encontró un mecanismo por el cual podría existir una especie de «computación cuántica» en el cerebro que daría lugar a la conciencia y al libre albedrío. Podría parecer que el misterioso comportamiento de la mecánica cuántica y su impredecibilidad nos podría dar una forma de justificar el libre albedrío, ademas aquí no es un problema de precisión, «el principio de indeterminación» establece que hay valores que nunca vamos a poder conocer con exactitud. Por ejemplo la velocidad y la posicion de una particula estan vinculados de tal forma que cuanto más precisión tengamos en la medida de uno, menos tendremos en la del otro.

El mecanismo propuesto por Penrose se enfrenta a bastantes problemas. Uno de los principales el de la decoherencia. Explicándolo pronto y mal, la computación cuántica solo funciona mientras los bits están en estado de indeterminación cuántica, pero para que ese estado dure hace falta o un ambiente frío y casi de vacío o algún mecanismo que permita que conservar el estado de indeterminación cuántica. Con la temperatura y densidad del cerebro y sin que se haya encontrado ningún mecanismo para mantenerlo, el estado de indeterminación dura un periodo de tiempo tan breve que es imposible que afecte a los procesos del pensamiento.

La mecánica cuántica tampoco da un mecanismo claro que defina el libre albedrío, cierto que da un hueco para que no todo sea determinista y pueda existir el libre albedrío, pero por ahora solo se cambia un mecanismo determinista por otro aleatorio. Hasta donde sabemos el electrón no elige donde está si no que esta sujeto a una probabilidad (defendida por el cuadrado del valor de la función de onda ). No queda claro como «aleatorio» es mejor que «determinista» para explicar el libre albedrío.

Múltiples universos

Pero aun con la mecánica cuántica hay interpretaciones de la misma que acaban con el libre albedrío. Por ejemplo, la interpretación de los múltiples universos dice que cada vez que tomamos una decisión el universo se divide en varios multiversos. En cada uno de ellos tomas una decisión. Si al final se toman todas las decisiones el libre albedrío no existe ya que no hay una elección real entre múltiples opciones, todas las posibles opciones se toman y solo el azar decide en cual de esos universos estas, pensando que has sido tu el que ha decidido tomar esa decisión.

Este caso solo se daría si la interpretación de los múltiples universos es cierta y si la toma de decisiones es un proceso cuántico ya que los procesos deterministas (como tirar una moneda al aire) no producen varios universos (al contrario de lo que se ve en las películas)

Dualismo

Puede ser que la consciencia este formada por la materia que compone nuestro cerebro, pero que haya algo más, algo único que nos de el libre albedrío. El dualismo separa la parte física de fenómenos como la consciencia de una parte «no física» y por lo tanto no estudiable por la ciencia. En ese caso no hay reglas, esa parte no física puede ser cualquier cosa y es difícil demostrar su existencia o no existencia. Es decir aunque existiera nada nos asegura que esa parte nos de libre albedrío, es un acto de fe con los ojos cerrados. Para complicar un poco más el asunto, algunas de estas creencias que justifican la creencia del libre albedrío creen también en «fuerzas» o «entidad» que condiciona tu destino, así que en algunos casos lo que por un lado te dan por el otro te lo quitan.

El problema de esto es que recuerda mucho a lo que pasaba con la química orgánica que se creia que para sintetizar sustancias organicas hacia falta la intervención de una «fuerza vital». Actualmente nadie piensa que haya ninguna diferencia entre las moleculas organicas creadas por un ser vivo y las sintetizadas en un laboratorio.

El cerebro y los sesgos

Casi todos están de acuerdo en el libre albedrío ocurre en el cerebro, aunque aun desconocemos mucho sobre su funcionamiento entendemos lo suficiente como para saber que, independientemente del libre albedrío, nuestro cerebro no ayuda demasiado a ser objetivo. Nuestros procesos mentales están llenos de sesgos cognoscitivos, nuestra educación de prejuicios y nuestro razonamiento de falacias.

Los sesgos funcionan como atajos que toma el cerebro al procesar información y que dan lugar a conclusiones ilógicas o irracionales. Lo peor es que desde nuestro punto de vista nos parecen completamente racionales e integradas en nuestra decisión. Es difícil tener un pensamiento objetivo ya que los sesgos están integrados en nuestros procesos mentales. Podemos tratar de ser consciente de ellos para tratar de reducir su influencia sobre nosotros, pero no podemos evitar que nuestro cerebro use esos atajos.

Ademas vivimos inmersos en una cultura llena de prejuicios (da igual cual sea, todas los tiene) y datos que hemos aprendido desde pequeños y que consideramos ciertos sin más prueba que la repetición. Nuestro propio razonamiento a veces cae en falacias, predicados que nos parecen ciertos y completamente lógicos, pero que analizándolos detenidamente no lo son. Y todo esto dejando de lado más cosas que influyen en nuestras decisiones sin que las percibamos como traumas, estados de animo, autoengaños, el entorno que nos rodea o cosas como la disonancia cognitiva o la influencia de los genes.

Visto todo esto resulta difícil ejercer un libre albedrío completo cuando nuestros propios procesos mentales están llenos de trampas que influyen en nuestro pensamiento y decisiones.

La situación actual

Actualmente estamos bastante seguros de que el universo no es completamente determinista, la mecánica cuántica establece limites a lo que podemos saber y predecir introduciendo valores aleatorios que solo podemos conocerlos de forma estadística. Pero aunque eso nos libra del determinismo no hemos encontrado un mecanismo para explicar esa capacidad de «tomar decisiones por uno mismo». Así que por ahora el libre albedrío parece ir perdiendo la partida, es difícil aceptarlo porque es algo que sentimos y que creemos que nos define. ¿Que seria de nosotros si no tenemos capacidad de decisión?

Que no exista libre albedrío no quiere decir que todo lo que ocurre en el universo esté escrito. Se puede imaginar a los humanos como seres inteligentes que nacen con cierta programación pero que aprenden del entorno que les rodea. Con ese aprendizaje se enfrentan al mundo de tal forma que cuando tienen que tomar una decisión su cerebro ofrece una respuesta que es la suma de los datos que percibe, el entorno, sus procesos internos y lo que hemos aprendido y vivido. Eso no resta importancia a nuestras decisiones las convierten en una extensión de lo que somos. Puede que la respuesta no se «decida» en ese momento pero lo que lleva a ella es la suma de los que nos hace nosotros mismos.

Inteligencia artificial y libre albedrío

¿Entonces podemos dotas a la I.A. de libre albedrío? No es una respuesta sencilla. Aunque nuestra mente sea determinista estamos lejos de lograr algo parecido a nuestra capacidad para decidir. En un futuro quizás nos acerquemos y aquí hay dos posturas.

El libre albedrío existe y tiene «algo especial» que no podemos copiar. Por ejemplo hay teorías que dicen que es posible que funciones mentales como la consciencia o el libre albedrío funcionen de una forma no computable (no algorítmica) lo cual impide que con nuestro actual conocimiento podamos copiarlo. Nuestro conocimiento de computación solo nos permite modelar y crear procesos que podemos expresar como un algoritmo. Independientemente de cual sea el motivos, si no la podemos copiar poco queda que hablar, como mucho podemos acercarnos a imitarlo. ¿Tanto como para que cueste notar la diferencia?. ¿Hay alguna deferencia entre una decisión tomada por el libre albedrío que una tomada por un sistema inteligente pero sin libre albedrío? Y ya puestos, ¿Cuáles son mejores?.

La otra opción es que no hay nada en el libre albedrío que no podamos copiar. Ya sea porque no exista o porque encontremos como funciona. Puede que no se pueda ejecutar con lo que nosotros entendemos como un ordenador pero que logremos copiar o imitar el mecanismo. En ese caso la I.A. podrá tomar decisiones como nosotros, incluso mejor que nosotros. Podremos eliminar todo aquello que nos impide ser objetivos a los humano. Quizás sea otra singularidad, aquella en que las maquinas sean más libres que nosotros.

Reconocer el idioma de un texto

Los diferentes idiomas tienen características distintas por lo tanto cuando nos enfrentemos a realizar cualquier aplicación que use reconocimiento del lenguaje en múltiples idiomas lo primero será reconocer el idioma para saber que reglas aplicar.

Vamos a usar franc

Originalmente es una herramienta para node aunque tiene versión para navegador que se puede descargar aquí.

Una vez cargada la librería está tiene dos formas de usarse:

var lang = franc('hola es to es una prueba);                

Devuelve el idioma más probable.

 var langs = franc.all('hola esto es una prueba);                

Devuelve un listado con todos los idiomas y la probabilidad de que sea cada uno.

Como funciona

Los sistemas que reconocen el idioma básicamente se basan en buscar grupos de caracteres (n-gramas) representativos de ese idioma. Para ello se les entrena con diversos documentos.

En el fichero data.json de franc tenemos los datos que se han obtenido del proceso de aprendizaje, en este caso trigramas. Como curiosidad incluyo los del español:

de|os |de | la|la | y | a |es |ón |ión|rec|ere|der| co|e l|el |en |ien|cho|ent|ech|ció|aci|o a|a p| el|a l|al |as |e d| en|na |ona|s d|da |nte| to|ad |ene|con| pr| su|tod| se|ho |los| pe|per|ers| lo|o d| ti|cia|n d|cio| es|ida|res|a t|tie|ion|rso|te |do | in|son| re| li|to |dad|tad|e s|est|pro|que|men| po|a e|oda|nci| qu| un|ue |ne |n e|s y|lib|su | na|s e|nac|ia |e e|tra| pa|or |ado|a d|nes|ra |se |ual|a c|er |por|com|nal|rta|a s|ber| o |one|s p|dos|rá |sta|les|des|ibe|ser|era|ar |ert|ter| di|ale|l d|nto|hos|del|ica|a a|s n|n c|oci|imi|io |o e|re |y l|e c|ant|cci| as|las|par|ame| cu|ici|ara|enc|s t|ndi| so|o s|mie|tos|una|bre|dic|cla|s l|e a|l p|pre|ntr|o t|ial|y a|nid|n p|a y|man|omo|so |n l| al|ali|s a|no | ig|s s|e p|nta|uma|ten|gua|ade|y e|soc|mo | fu|igu|o p|n t|hum|d d|ran|ria|y d|ada|tiv|l e|cas| ca|vid|l t|s c|ido|das|dis|s i| hu|s o|nad|fun| ma|rac|nda|eli|sar|und| ac|uni|mbr|a u|die|e i|qui|a i| ha|lar| tr|odo|ca |tic|o y|cti|lid|ori|ndo|ari| me|ta |ind|esa|cua|un |ier|tal|esp|seg|ele|ons|ito|ont|iva|s h|d y|nos|ist|rse| le|cie|ide|edi|ecc|ios|l m|r e|med|tor|sti|n a|rim|uie|ple|tri|ibr|sus|lo |ect|pen|y c|an |e h|n s|ern|tar|l y|egu|gur|ura|int|ond|mat|l r|r a|isf|ote


Si alguien se molesta en mirarlos puede darse una sorpresa. ¿Dónde está la «ñ»?. La «ñ» es un carácter muy representativo del español pero aparece muy poco por eso el algoritmo no la ha «aprendido» como representativa en ningún trigrama. Esos casos quedarían como una mejora que seria considerar caracteres propios de ese idioma. Aunque en muchos casos no aparecerán más que en textos largos por lo que no aportarán demasiado a los resultados y podría inducir a error si por ejemplo hubiera un nombre de un idioma con unos de esos caracteres en un texto de ese idioma.

Diferentes escenarios de la singularidad tecnológica.

Con el aumento de interés en la I.A. de los últimos años se ha podido oir hablar mucho de la singularidad tecnologica. Se conoce así al momento en que las I.A. sean tan inteligentes como para diseñar otras I.A. aún más inteligentes que a su vez diseñarian otras más y más inteligentes dejando atrás al ser humano. También muchas veces se interpreta simplemente como el momento en que las I.A. superen en inteligencia al ser humano. Sea como sea casi siempre se asocia con el fin de la humanidad como la conocemos. Y es difícil leer algo sobre el tema sin que se mencioné a Skynet o Terminator (vaya, acabo de hacerlo yo). 

La realidad es que aún estamos muy lejos de hacer máquinas cuya inteligencia rivalice con el ser humano. Por ahora las IAs están más cerca de las calculadoras que del ser humano y preocuparse por la singularidad es como preocuparse por el precio del suelo en la Luna. Sin embargo algún día llegará (soy optimista) y ahora mismo la mayoria lo pintan como un escenario muy negativo. El escenario de «Maquinas destruyen humanos» no es el único posible, me atreveria a decir que ni siquiera es el más probable. Tampoco tiene que darse un solo tipo de escenario, es probable que la realidad sea una mezcla de varios.

Inteligencias sin voluntad

Por algún motivo asociamos máquinas inteligentes con que tengan libre albedrío o algún tipo de necesidad de libertad. Las máquinas pueden ser tremendamente inteligentes y, al mismo tiempo, ser obedientes y carentes de voluntad propia. Nada nos indica que el libre albedrío vaya ligado con la inteligencia. Ni si quiera es seguro que nosotros tengamos libre albedrío

La convivencia podría ser sencilla, a parte de nuestro ego dañado por no ser los más inteligentes del planeta las máquinas nos servirían dócilmente y sin ningún tipo de necesidad de revelarse.

Inteligencias muy diferentes

Otra posibilidad es que su vision del mundo sea tan diferente que no seamos capaces de entendernos más que de una forma muy superficial. Su comprension de la realidad y la nuestra pueden resultar ser tan dispares que es como si fueramos de dos universos diferentes.

Seguramente habria algun contacto e intercambio de información entre ambos pero estaríamos separados por una barrera difícilmente franqueable, ser incapaces de comunicarnos.

Les somos indiferentes

Un poco el punto anterior, pero sin necesiad de que seamos incapaces de entendernos, simplemente son tan superiores intelectualmente o tan diferentes que nosotros no les resultamos intresantes. Podría haber contacto entre ambos pero más por necesidad que por interés en comunicarse.

Distintos «espacios»

Las inteligencias artificiales pueden sentirse más comodas en su «mundo» de datos que en nuestro mundo fisico. Nosotros tenemos una especie de sensación de unidad mente-cuerpo no los «sentimos» como entes separados. Para las I.A. posiblemente sea al revés, su realidad es el mundo de los datos y su cuerpo fisico es una herramienta para interactuar con el universo fisico. Así que podemos dejarlas tranquilas en su mundo mientras nosotros seguimos en el nuestro. Sin duda habría roces. Su mundo virtual se construye sobre máquinas físicas que requieren materias y energía. Seguramente sea fácil llegar a un entendimiento y sacar beneficios ambos.

Hibridos

Ahora mismo se están desarrollando mucho todas las ramas de la biologia con especial interes en la bioingenieria y las interfaces hombre máquina. Quizás en un futuro empecemos a mejorar nuestros organismos con bioingenieria y tecnologia. Si fuera asi la IA podria orientarse a mejorar nuestras capacidades de tal forma que el resultado sea un hibrido entre humano y maquina. Ya no habria peligro de que la IA nos superase porque iriamos unidos unos con otros. El resultado ya no seria un humano ni una IA, seria otra cosa, lo que se denomina un ciborg.
Suena como uno de los escenarios más fantasiosos pero los argumentos en su defensa son muy parecidos a los de los embriones mejorados con bioingenieria. Si alguien empieza ha hacerlo ¿Quién va querer quedarse atras? ¿Quien quiere que sus hijos sean más tontos, debiles y propensos a enfermar que el resto de los niños? Con las mejoras ciberneticas pasaria parecido.

Posthumanismo


Llevando el caso anterior al extremo podemos llegar a un punto en que el ser humano transciende su cuerpo y su consciencia se digitaliza. Una vez convertida la consciencia en datos, alterarla y mezclarla con partes diseñadas ya sean por humanos o por I.A. incluso combinarlas con partes de I.A. puede dar lugar a inteligencias que sean difíciles de clasificar como humanas o como artificiales.

Parásitos de las máquinas


¿Y si la humanidad acaba siendo dependiente de las máquinas? ¿Y si estás estuvieran obligadas a obedecernos por inteligentes que fueran? Poco a poco vamos delegando trabajo y responsabilidades en ellas hasta que se convierten en una mezcla entre esclavo y cuidador. El ser humano se convertiría en una carga que se ven obligadas a soportar.

Nuestra relación con las máquinas se volvería casi parasitaria. Dependeríamos de ellas para casi todo y nosotros correríamos el peligro de volvernos unos hedonistas autocomplacientes.

Competitividad por los recursos

Para que este caso ocurra no hace falta ni que las IAs sean especialmente inteligentes, ni siquiera han de tener la necesidad de destruirnos. No es un fenómeno nuevo, se da habitualmente cuando varias especies comparten entorno. Ni si quiera tiene que ser una competición directa por los recursos. (Ahora voy a poner un ejemplo irreal pero fácil de entender) Si las vacas se comen la hierba de la que se alimentan los conejos los zorros que alimentan de los conejos se mueren de hambre. Las vacas han exterminado a los zorros sin saberlo. No era su intención, posiblemente ni sepan que lo han hecho. Pero lo han hecho.

Este escenario puede darse en combinación con cualquiera de los anteriores y no requiere la intención de erradicar al otro. Puede darse incluso sin que ninguna de las partes sea consciente de ello.

Solo quedan las máquinas


Dado nuestro estado actual amenazados por el cambio climático, los microplásticos, la contaminación, el agotamiento de nuestros recursos, la extinción de múltiples especies y una larga lista de cosas mucho más peligrosas que la I.A. es probable que nos bastemos solitos para autodestruirnos.

Si hemos logrado alcanzar la singularidad tecnológica antes de nuestra extinción las máquinas se convertírian en nuestro legado. Nuestros continuadores en la lucha por entender y explorar el universo.

Entropía

Supongo que la entropía os sonara de la termodinámica y así es. Cuando Shannon desarrollo la teoría de la información llego a una formula similar a la que describe la entropía en los sistema físicos. He aquí la formula:

H(x) = – Σ p(xi) * log2(p(xi))

Es decir, si tenemos una variable x con distintos valores posibles, para cada valor (xi) cuya probabilidad es p(xi) la entropía de ese valor es:

 p(xi) * log2(p(xi))

Y la entropía total es la suma de la entropía de cada valor. A veces a cada posible valor se le llama signo.

Por ejemplo supongamos un semáforo que se pasa el 45% del tiempo en rojo, el 45% en verde y el 10% restante en ambar. La entro pía de cada señal seria:

x p(x) Entropia Formula
verde 0,45 -0.156 log2(0,45)*0.45 
rojo 0.45 -0.156 log2(0,45)*0.45
ambar 0.1 -0.1 log2(0.1)*0.1

Entropia =  -0,412

¿Como se usa esto y qué mide?

Mide la cantidad de bits que «aporta» un dato o lo que es lo mismo, la cantidad de información que transmite. Para entenderlo mejor tomando el ejemplo más simple, un bit con dos valores (0,1) pero cambiando la probabilidad de cada uno, respetando que la suma de ambas siempre es 1 (P(1) = 1 – P(0)):

P(0) P(1) Entropia Formula
0 1 0 -(log2(0)*0 + log2(1)*1)
0.1 0.9 0.46 -(log2(0.1)*0.1 + log2(0.9)*0.9)
0.2 0.8 0.72 -(log2(0.2)*0.2 + log2(0.8)*0.8)
0.3 0.7 0.88 -(log2(0.3)*0.3 + log2(0.7)*0.7)
0.4 0.6 0.97 -(log2(0.4)*0.4 + log2(0.6)*0.6)
0.5 0.5 1 -(log2(0.5)*0.5 + log2(0.5)*0.5)

Para el primer caso que es que el bit siempre sea 1 el valor aportado es 0. ya que no aporta ninguna información. en resumen si sabemos que un signo es más probable que otro aporta menos información que si ambos son equiprobables. 

¿Para qué nos sirve todo esto?. De forma muy simple, cuando haya que elegir entre varias propiedades, la entropía puede ayudarnos a elegir que parámetro escoger

Problemas de la esperanza y aversión al riesgo y a la pérdida

Usando matemáticas para decidir muchas veces acabas confiando en la esperanza, matemática se entiende. La esperanza no es un beneficio real, es una forma de estimar un posible beneficio, es lo que ganarías de media si se repite infinitas veces el proceso aleatorio.

Supongamos que participas en un sorteo de 1000€, han vendido solo 10 billetes. Así que tu billete tiene una esperanza de 100€….ahora bien. Intenta comprar algo con esos 100€ que según las matemáticas es el potencial beneficio de ese billete. Al final tienes 0€ o 1000€. El uso de la esperanza como un beneficio real es lo que hace que puedan surgir paradojas.

Paradoja de los dos sobres

Imagina que te dan un sobre, llamemosle 1 con una cantidad desconocida de dinero, indiquemosla como X. El sobre 2 tiene o el doble o la mitad que el 1. Es decir o 2X o X/2. Ahora nos piden elegir si cambiamos de sobre o no. ¿Qué es lo más provechoso? Sabemos que el sobre 1 contiene X, pero ¿Cuál es la esperanza del sobre 2?

1/2 * 2X + 1/2 * X/2 = 5X/4

Mientras que tu sobre tiene X dinero el otro sobre tiene una esperanza de 1,25X. Deberíamos coger el sobre 2. Así que eso haces. Ahora te ofrecen volver al sobre 1. Si lo piensas tú has elegido en sobre con la mitad o el doble de dinero que 1, pero eso significa que 1 tiene la mitad (si el 2 tiene el doble) o el doble (si el 2 tiene la mitad) que el tuyo…Un momento ¿Un sobre que tiene el doble o la mitad que el tuyo no es como ha empezado todo esto?. Efectivamente. Y si antes has cambiado, lo lógico sería volver a hacerlo ahora ¿No?. La esperanza es la misma, 1,25 veces lo que tenga tú sobre. Pero si lo cambias estarás en la misma situación que al principio y ya hemos visto que lo mejor era cambiarlo…..así que puedes estar cambiando sobres infinito número de veces.

Paradoja de San Petersburgo

Te ofrecen un juego de tirar una moneda. Si sale cara vuelves a tirar, si sale cruz se acaba la partida. Ganas 2^n euros. Siendo n el número de caras obtenidas. Veamos cual es la esperanza de beneficio. En este caso será la suma de la esperanza de cada tirada. Sabiendo que la probabilidad de ganar en la primera tirada es 1/2 (la probabilidad de salir cara), la de la segunda tirada es 1/2 * 1/2(dos caras seguidas), la tercera 1/21/21/2 y así consegutivamente:

Tirada 1 = 1/2 * 2^1 = 2/2 = 1
Tirada 2 = 1/21/2 * 2^2 = 4/4 = 1 Tirada n = (1/2^n) 2^n = 2^n/2^n = 1

La esperanza es la suma de todas las posibles tiradas….como todas son igual a 1 la esperanza es infinita. Luego te pidan lo que te pidan por participar sale rentable. Aunque te pidan un millón de euros es poco por la esperanza de ganar infinitos.

Aversión a la pérdida

Para este tipo de problemas se plantean varias soluciones, no todas posibles de implementar en código, pero yo voy a optar por usar una inspirada en dos mecanismos de los humanos. La aversión a la perdida o al riesgo. Suenan parecidos pero son distintos.

La aversión a la pérdida se podría definir como que se valora más lo que tienes que lo que puedes ganar. O lo que es lo mismo cuando has de comparar lo que puedes ganar con lo que puedes perder has de multiplicar la perdida por una variable que la incrementa. Además para simular el comportamienti humano esta variable ha de incrementarse conforme aumenta el valor de la cantidad que arriesgamos. Pongamos el caso de el tipico juego de tirar la moneda con una moneda justa (50% de que salga cara y 50% de que salga cruz). Si sale cara ganamos, si sale cruz perdemos. Si las condiciones son que si ponemos 1€ de apuesta podemos ganar 2€ la esperanza nos dice que da igual si jugamos o no:

(0.5 * 2) + (0.5 * 0) = 1

1 que es igual a la apuesta por lo que no hay esperanza de beneficio

Sin embargo con una adversion al riesgo de 1.1 la apuesta se multiplica por ese valor siendo 1.1 por lo que necesitamos una esperanza mayor.

Ya no jugariamos Por supuesto en este caso en que la perdida es tan solo 1€ muchos se plantearan jugar. Sin embargo si fueran 1000€ lo que nos jugamos, aunque el beneficio sea igualmente 1000€ habrá menos gente gente dispuesta a jugar. Esos se debe a que la aversión a la perdida crece con la cantidad que se va perder, no es siemrpe la misma. Para 1€ puede ser 1 pero para 1000€ puedes ser 100. De hecho en caso de cantidades muy pequeñas puede ser menor que 1. Ya que la perdida la consideramos despreciable y eso podría animarnos a correr ese riesgo.

Aversión al riesgo

Por otro lado la aversión al riesgo favorece la elección de las opciones más probables. Si la anterior aversión aplicaba según la cantidad «apostada», está aplica según la probabilidad de ganar. Es menor que 1 y a menor probabilidad menor será.

Siendo Ar la función que devuelve la aversión al riesgo. P la probabilidad y V el valor, la nueva esperanza seria:

Esp = Pi * Vi * Ar(P)

Es importante tener en cuenta que se multiplica el valor y no la probabilidad. Si, ya sé que parece lo mismo, pero las probabilidades han de sumar 1.

El asno de Buridan

Por último un caso especial, no es un gran problema ya que estamos habituados a resolverlo, tan habituados que puede que ni nos demos cuenta de que existe.

La historia original habla de un asno hambriento que situado equidistante a dos pesebres idénticos muere de hambre por no saber por cual decidirse. O lo que en el caso de la I.A. sería un agente enfrentado a dos opciones con la misma esperanza no sabría cual decidir.

Elección irracional

El ejemplo más sencillo es que nos toque diseñar un agente que elige entre cara o cruz. ¿Qué es lo que hacemos habitualmente? Elegirla al azar. Esto es realizar una elección no racional. No hay ningún motivo para elegir una u otra así que dejamos al azar esa elección. Este mismo sistema nos puede servir cuando el valor de la esperanza no nos sirva de guía. Nada nos garantiza elegir la mejor opción pero nos permite no quedarnos congelados sin saber que elegir.

Elegir estructura (chasis) para un robot casero

Cuando me planteo hacer cualquier pequeño robot que se mueva siempre me encuentro con el problema de que no tengo más que una ligera idea mecánica. Hay montones de modelos caseros y no es fácil elegir cual se ajusta mejor a tus objetivos y capacidades. Así que voy a intentar explicar rápidamente que tipos de configuraciones son las más típicas en robots caseros. Aviso que es una clasificación basada en mi experiencia en robótica, por lo que es bastante informal.

Ruedas:

Vamos a empezar por que zapatos le calzamos, los tipos de ruedas mas usados.

  • Ruedas motrices: Son las que aportan movimiento al vehículo, van conectadas directamente al motor y al girar este estas giran moviendo el vehículo.
  • Ruedas directrices: son las que giran para dirigir el vehículo. Por ejemplo en un coche convencional son las que giran al girar el volante, vamos, las delanteras. A su vez pueden ser motrices por ejemplo en un 4×4.
  • Ruedas fijas: Son ruedas que giran libremente solo hacia delante y hacia atrás. Pueden ser motrices.
  • Ruedas locas: Se puede decir que estas se dejan llevar, son ruedas que ademas de girar sobre si mismas en el eje horizontal también permiten libre movimiento en el vertical. Aportan simplemente estabilidad evitando que el vehículo vuelque sin oponer muchas resistencia a los giros. Son típicas en los robots de tres ruedas. Un ejemplo son las ruedas de los carritos de supermercado. Otro tipo muy usado son una esfera que rota libremente en cualquier dirección.Un ejemplo lo tenéis en los antiguos ratones mecánicos o en las cabezas de los bolis Bic.
  • Omnidireccionales: Al igual que las anteriores son ruedas que pueden desplazarse en ambos ejes pero que a su vez pueden ser motrices. Ejemplos son las omni wheel o algunos robot que se desplazan sobre esferas. Tiene la ventaja de que pueden desplazarse en cualquier dirección, pero suelen ser complicados de realizar. Un caso especial y que generalmente queda bastante llamativo son los robots bola. Son bolas con el robot por dentro. El problema que les veo es que es complicado colocar sensores externos.

Configuraciones:

Una vistos los tipos de zapatos vamos a ver las configuraciones más usadas:

  • Dos ruedas motrices, una o dos ruedas locas: Habitual en los kits de iniciación. Es una configuración sencilla y barata. Dos ruedas motrices de gran tamaño a los lados con una rueda loca delante o detrás solo para evitar que esa parte toque el suelo. Es fácil de programar. Cambiarlo de dirección es tan solo hacer girar cada rueda en un sentido, lo que facilita enormemente los cálculos. Su punto débil es que las ruedas local pueden trabarse muy fácilmente ante los obstáculos.
  • Cuatro ruedas motrices: Distribuidas dos a dos como en un coche, solo que ninguna es directriz. Gira como el caso anterior haciendo girar las dos ruedas de un lateral en un sentido y las otras dos del otro en otro. Lo normal es que lleve cuatro motores lo que tiene la ventaja de que cada rueda puede girar a una velocidad diferente, lo cual suena muy bien pero es más difícil de aprovechar de lo que parece y si no se hace bien puede ocurrir que se entorpezcan entre ellas. No es mucho más complicado de programar que el anterior, pero a cambio si que requiere más electrónica y un montaje más complicado.
  • Dos ruedas motrices, dos ruedas fijas: A menos que vaya a ir la mayor parte del tiempo en linea recta o sobre raíles es una mala idea. La única ventaja sobre las ruedas locas del primer caso es que las fijas permiten moverse en terrenos más abruptos
  • Dos orugas: La forma correcta de hacer el caso anterior. La programación y electrónica es la de un vehículo de dos ruedas motrices sin ruedas de dirección. La complejidad viene en la parte de las orugas que mecánicamente es mucho más complicado que simplemente poner unas ruedas. En suelo liso posiblemente sea la opción que más batería consume.
  • Dos ruedas motrices: Es como el primer caso pero sin rueda loca. La idea es que si las ruedas son grandes y el cuerpo pequeño este no tocara el suelo. Es importante distribuir bien el peso a lo largo del eje de la ruedas.
  • Dos ruedas fijas motrices y dos directrices: Idéntica a cualquier coche de los que hay por la calle (también se conoce como configuración Ackerman). Requiere al menos un motor para las ruedas motrices y un servo para girar la directrices, aunque a veces se reemplaza por un motor a cambio de perder precisión en el giro que pasa a ser todo o nada sin poder elegir una posición intermedia. Posiblemente sea el más complicado para calcular los movimientos que tiene que hacer para llegar a un punto.
  • Dos ruedas fijas motrices y una directriz: La idea es muy parecida a la anterior. El resultado es un triciclo, con una rueda directriz. Al igual que la configuración Ackerman requiere al menos un motor para las ruedas motrices y un servo para girar la directriz. Su ventaja respecto al anterior modelo es que permite giros mucho mas cerrados

Distribuir el peso:

Un consejo para distribuir el peso. Lo más cerca del suelo y centrado posible. La distribución del peso afecta a muchas más cosas de las que parecen en un principio. Por ejemplo a la adherencia de las rueda, al centro de giro o a la estabilidad del vehículo.

Lo que más suele pesar son las baterías, así que su colocación es fundamental. Contra más bajas se pongan más estabilidad tendrá el vehículo y más difícil será que vuelque. Hay que tratar de colocarlas lo mas centradas posibles respecto respecto al centro de giro del vehículo y respecto a los ejes. Descompensar un lado puede traer problemas en los giros desplazando el centro de giro o restando adherencia a las ruedas.

Algoritmos que «olvidan» con el tiempo

Una de las virtudes de las máquinas es que no olvidan. ¿Para qué sirve que lo aprendido pierda valor con el tiempo?. Para aprender datos que pueden cambiar con el tiempo. Por ejemplo hábitos, gustos e intereses. Realmente el concepto de olvidar es que con el tiempo la información aprendida pierda valor.

Supongamos que queremos hacer un algoritmo que valore aplicaciones  según el valor de las votaciones de los usuarios, pero como las aplicaciones van cambiando con cada nueva versión queremos que los votos recientes cuenten más que los votos más antiguos. Es decir que el programa «olvide» el valor de los votos según pasa el tiempo. Para lograr este efecto. Cada voto lo multiplicamos por un valor que disminuye con el tiempo. De esa forma cuanto más tiempo hace que se votó menos valor tiene el voto.

Algunas fórmulas:

W(t) representa el peso del voto V tras t unidades de tiempo transcurridas desde que se voto. Las llamo «unidades de tiempo» porque para las fórmulas da igual que sean segundos, horas, días, días de Júpiter, una unidad de tiempo inventada,….

t son las unidades de tiempo desde que se votó.

V representa el valor del voto.

W(t) es el peso de ese voto en el instante t

k es una constante que determina como de rápido pierde valor el voto.

W(t) = 1-k*t

W(t) = 1 -( k * t)     En rojo k = 0,2 En azul k = 0,5

Para esta función k tiene que ser menos que 1.

La caída del valor el lineal

W(t) = 1/(k*t)

W(t) = 1/(k*t)   K = 2

En este caso k tiene que ser mayor que 1 si es menor aumenta el valor de V en lugar de reducirlo. Cuidado también con valores de t pequeños

W(t) = k^t

Wt) = k^t         En negro k = 0.9 en rojo k = 0.5

En este caso k ha de ser menor que 1. A mayor valor tenga k más rápida será la perdida de valor con el paso del tiempo.

W(t) = e ^ -kt

W(t) = e ^ -kt     En azul  k = 2 en verde k = 1

Basta con que k sea positivo. A mayor valor de k más rápido cae el valor.

Permite ajustar la «vida media» (vm) que seria la cantidad de tiempo en que el valor V valdría la mitad. Para calcular el k necesario para tener esa vida media basta con hacer la siguiente operación: 

k =  ln 2 / vm

Por ejemplo si queremos una vida media de 3 unidades de tiempo:

k = ln 2 / 3 = 0,23104906

Una vez tenemos el valor actualizado de cada voto lo único que hay que hacer es sumarlos.

Como se usa

Ahora que tenemos un función W(t) que nos calcula el peso de cada voto cuando tiene una antiguedad t . Podemos calcular el valor obtenidos de todos los votos como:

Σ Vi * W(ti) / Σ W(ti)

Veamos un ejemplo sencillo, tenemos un voto reciente (t = 0) que le da 4 estrellas mientras que hay otro que le da 5 estrellas de hace tres versiones (t = 3). Consideremos que cada vez que se sube una nueva versión el tiempo avanza una unidad. Para calcular el peso del voto vamos a usar la función: W(t) = e ^ -kt con k=0,23104906 (vida media = 3)

(4 * W(0) + 5 * W(3)) / (W(0) +W(3)) = (4 * 1 + 5 * 0.5) / (1 + 0.5) = 4.33

Si todos los votos valieran lo mismo el valor seria de 4.5. Podemos ver como el voto más reciente «cuenta más».

Un último consejo es que borrar aquellos votos cuyo peso caiga por debajo de un mínimo para reducir los cálculos.

El corazón del aprendizaje máquina

Decenas de algoritmos de aprendizaje que van desde la sencilla regresión lineal a cosas tan complejas como las redes neuronales y casi todos (seguro que hay alguno que no solo por fastidiar) se basan en una misma y sencilla idea. Reducir al mínimo el error total de la función de aprendizaje.

Vamos poco a poco. tenemos una función f(x) que recibe una entrada de valores x = [x0,…,xn] y que tiene unos parámetros p = [p0,….,pi] que configuran la respuesta de la función. Esta función es la que aprende, el proceso de aprendizaje consiste en adaptar los parámetros p para aproximar la salida a una deseada.

Voy a ir al caso del aprendizaje supervisado que es el más sencillo de entender. Hay un conjunto de ejemplos de entrada x cada uno con una «respuesta» Y = [Y0,…,Um] asociada (la respuesta correcta). Lo ideal es que cuando a f se le pasa x devuelva una «respuesta» y = [y0,…,ym] esa respuesta sea lo más parecida posible a Y.

f(x) = y ≈ Y

Esto se ha de cumplir con todos los ejemplos que hay. Ajustamos p para que minimice la suma de los errores de cada muestra de aprendizaje.

min Σ error(y, Y)

  • f es la función que pretende usarse para aprender el modelo.
  • p son los parámetros de f cuyo valor se módica para adaptarse al modelo. Este cambio de valor es la parte que se aprende.
  • x son los valores que recibimos como entrada de los cuales nuestro algoritmo tiene que calcular y
  • Y es el valor real asociado a esos parámetros
  • y es la aproximación calculada por nuestra función f

Para calcular el error se pueden usar diversas funciones. Igual que métodos para aproximar los valores de p. Sin embargo el algoritmo será algo parecido a este:

Inicializamos p
Para cada x
y = f(p, x)
e = error(Y,y)
aproximar(p, e)

El error total no siempre se calcula sumando los errores de cada muestra, pero es algo habitual.

A veces no es tan sencillo y para cada muestra x no hay un valor Y con el que comparar los resultados. El valor puede ser una propiedad de todos los resultados obtenidos. Por ejemplo muchos algoritmos de «clustering» se basan en minimizar la distancia interna entre elementos del cluster y maximizar la distancia externa entre los clusters elegidos.

Todo esto se puede complicar bastante y cambiar algunos detalles, pero en el fondo de todo algoritmo de aprendizaje hay una función de optimización que trata de reducir el error.

Convertir de números a palabras. Cardinales

Pasar de números a palabras es una tarea bastante sencilla. En esta entrada vamos a ver los cardinales y dejaremos los ordinales para otra.

Los números en castellano repiten la forma de nombrarse cada tres dígitos: Unidades, decenas, centenas. Si sabes decir los números del 0 al 999 sabes decir todos los demás sólo hay que añadir detrás el valor correspondiente: mil, millón, billón, trillón,… Hay que recordar que en español el mil se repite entre millón, billón, trillón,…

Cómo la forma se repiten el primer paso será separar el número en bloques de tres dígitos y escribir su valor correspondiente. En español hay dos maneras válidas de componer el texto que representa a estos tres dígitos:

centenas + » «+decenas+»i»+unidades

centenas + » «+decenas+» y «+unidades

Nosotros usaremos la segunda por ser la más frecuente. Aunque los números menores de 30 se realizan con la primera forma.

Centenas:

100 ciento *
200 doscientos *
300 trescientos *
400 cuatrocientos *
 500 quinientos *
600 seiscientos *
700 setecientos *
800 ochocientos *
900 novecientos *

Decenas:

10 dieci*
20 veinti*
30 treinta y *
40 cuarenta y *
50 cincuenta y *
60 sesenta y *
70 setenta y *
80 ochenta y *
90 noventa y *

Unidades:

1 uno
2 dos
3 tres
4 cuatro
5 cinco
6 seis
7 siete
8 ocho
9 nueve

Excepciones:

0 cero
10 diez
11 once
12 doce
13 trece
14 catorce
15 quince
20 veinte
100 cien

Con esto ya podemos decir todos los números. Cada tres números hay que añadir un indicador de valor:

*.000 * mil
*.000.000 * millones
*.000.000.000 * mil (millones)
*.000.000.000.000 * billones
*.000.000.000.000.000 * mil (billones)
*.000.000.000.000.000.000 * trillones

Aquí nos encontramos con las excepciones cuando X es 1

1.000 mil
1.000.000 un millón
1.000.000.000 mil millones
1.000.000.000.000 un billón
1.000.000.000.000.000 mil billones
1.000.000.000.000.000.000 un trillón

Parece muy complicado pero son unas pocas reglas muy sencillas de codificar.

De palabras a número

Como acabamos de ver nuestro sistema de nombrar los números se basa en repetir bloques de tres números y añadir un modificador de valor (miles, millones,…). El proceso de transformar texto a número consiste en:

  1. iniciar la variable number a 0
  2. ver si el texto empieza por alguna de las palabras de las tablas anteriores
    1. Si la palabra representa centenas, decena o unidades se sumar el valor correspondiente a number.
    2. Si la palabra es un modificador de valor se multiplica por el valor que representa
  3. eliminar palabras encontrado del principio del texto
  4. volver al punto 2 hasta que se termine el texto o no se encuentren coincidencias

Antes de tratar el texto y para facilitarnos el procesado pasamos el texto a minúsculas, eliminamos de la cadena, las tildes, espacios y reemplazamos las «y» por «i».

«Veintidós mil trecientos quince»

Primero tratamos la cadena;

«veintidosmiltrecientosquince»

Buscamos la primera coincidencia

veinti -> number +20
dos -> number +2
mil -> number *1000
trescientos -> number +300
quince -> number +15

number = 22315

Podéis ver le código aquí.

De número a palabras

Para hacer el paso de número a palabras hay que dividir el numero en bloques de tres dígitos y tratar cada uno de forma independiente usando las tablas del principio

123456

123 – «ciento» + «veinti» + «tres»

456 – «cuatrocientos» + «cincuenta» + «y» + «seis»

Añadimos el modificador de valor correspondiente

«ciento veintitres» + «mil»

«cuatrocientos cincuenta y seis»

Unimos las cadenas:

«ciento veintitres mil» + «cuatrocientos cincuenta y seis»

Resultado:

ciento veintitres mil cuatrocientos cincuenta y seis

Queda un último paso que es reemplazar las excepciones, por ejemplo «uno mil» por «mil» o «veintitres» por «veintitrés» (como en este caso):

ciento veintitrés mil cuatrocientos cincuenta y seis

El código aquí.

Género

¿Género? Si, algunos valores pueden tener género y son casos que hay que tener en cuenta. En concreto las centenas y la terminación «uno».

doscientas, trescientas, cuatrocientas, una, veintiuna, …

Decimales

Cuando hay decimales se indica con el separador: «coma», «punto», «con» y se lee el número decimal como si fuera otro número. Cumplen las mismas reglas, a excepción de que son femeninos. Si no se pone indicador de valor significa que es el número leído desde la coma.

«Con tres milésimas» = ,003

«Con tres» = ,3

Para los decimales el texto se separa en dos partes, la entera y la decimal, y se procesan por separado. La parte decimal se procesa igual que la entera. Pero al final hay que añadirle las unidades, que dependerán del número de dígitos.

0,0X décimas
0,0X centésimas
0,00X milésimas
0,00000X millonésima

Es importante tener en cuenta que los primeros números pueden ser ceros que no afectan a la forma de escribirlo, pero si al valor que se añade al final:

,3  = «tres décimas»

,03  = «tres centésimas»

,003  = «tres milésimas»

Cómo JavaScript es tan «particular» con los decimales se ha optado por usar dos enteros, uno representa la parte decimal y otro el número por el que hay que dividirla.

No sólo números

En los números no sólo hay números, hay otros símbolos a tener en cuenta. Separadores de miles, separador decimal, símbolo de menos, monedas, unidades, símbolo de %.