Detección de género para nombres de personas (2)

Aprovechando las vacaciones y que ahora tengo una mejor idea de clasificadores automáticos, actualicé mi programa que indica si el nombre de una persona es de género masculino o femenino. Cambié la forma de representar los datos, el algoritmo de clasificación y la librería que utilizaba para implementarlo. El nuevo clasificador comete menos errores y es más facil de modificar.

Primero, la representación de los datos es muy sencilla: se basa en las últimas letras de cada nombre. Concretamente, por cada nombre se extraen tres partes que corresponden a la última, 4 últimas y cinco últimas letras. Por ejemplo, Daniel se representa como una secuencia de tres elementos: "l", "niel" y "aniel". Para nombres compuestos (como Manuel Darío) se hace lo mismo para cada nombre. Esta fue la combinación con la cual el clasificador obtuvo mejores resultados durante las pruebas.

Segundo, reemplacé el clasificador bayesiano (naïve bayes) por regresión logística, de nuevo, porque obtuve mejores resultados, y ahora utilizo la implementación de scikit-learn, mi librería favorita para mis proyectos de machine learning. En cuanto a los resultados, el nuevo clasificador pasó de 252 errores a 121 en los datos de prueba (alrededor de 14.000 nombres). En una serie de datos adicionales, el anterior clasificador cometía 255 errores, mientras que la nueva versión comete 132.

Creo que los resultados son bastante buenos, especialmente teniendo en cuenta la simplicidad del modelo. Me gustaría comparar los resultados usando árboles de decisión y AdaBoost, como me lo sugirieron en un comentario a la primera versión. Sin embargo, primero tengo que hacer unas modificaciones para usar las implementaciones de la librería. Espero trabajar en eso durante estos días, aunque este proyecto no es más que un juguete poco útil, quiero utilizar más y contribuir a scikit-learn.

Detección de género para nombres de personas

Estoy trabajando en un programa que indica si el nombre de una persona es de género masculino o femenino. Esta es la primera versión que funciona bastante bien, a pesar de no identificar correctamente algunos nombres. En la página del programa hay una demostración de su uso y las instrucciones para acceder por medio de una interfaz de programación (API) que permite obtener los datos en formatos como JSON y XML.

El programa funciona con un clasificador bayesiano sencillo que deduce los criterios para determinar cuándo se trata de un nombre de hombre o de mujer. Para esto esto tiene en cuenta únicamente las últimas letras de cada nombre y no se basa en una lista de nombres conocidos. Sin embargo, por ahora estoy utilizando una lista de excepciones para corregir los errores conocidos del clasificador.

Escribí el programa en Python utilizando varias librerías adicionales. Primero, implementé el clasificador usando NLTK prácticamente siguiendo los pasos descritos en el libro Natural Language Processing with Python (consultar el capítulo 6). Era la primera que utilizaba esta librería para hacer algo serio y me sorprendió que fuera tan fácil de aprender a utilizar; además de la documentación completa, está el libro, que no sólo es gratuito sino que también explica muy bien los conceptos básicos de procesamiento de lenguaje natural. Por otro lado, para la interfaz web utilicé dos herramientas conocidas: Django y Tastypie.

Los datos de ejemplo fueron reparados minuciosamente por Luis Alfredo Rodríguez y el equipo de Congreso Visible, a quienes agradezco por su trabajo.

Este es el primero de los programas que incluiré dentro de data-toolkit.cavorite.com, el proyecto que agrupará herramientas para la extracción y recuperación de información, el procesamiento de lenguaje natural y el procesamiento de datos en general. Es una iniciativa similar a datasciencetoolkit.org y text-processing.com, pero enfocada en proporcionar herramientas especializadas para acceder a información en español.

gsd

Uno de los tratamientos más comunes para el alcoholismo en Rusia es el torpedo: una cápsula que se inserta debajo de la piel del paciente y que contiene una sustancia que podría matarlo si toma alcohol. Aunque en realidad las consecuencias no son tan graves, parece que el tratamiento es muy efectivo porque el miedo que produce la cápsula es tal que las personas dejan de tomar.

Yo hice algo parecido, aunque mucho menos drástico, para no distraerme tanto cuando estoy en el computador. Comencé a utilizar un script que bloquea los sitios web que normalmente me distraen al agregar sus dominios al archivo /etc/hosts y les asigna la dirección local 127.0.0.1. Eso es suficiente para que cada vez que quiera entrar a alguno de ellos me de cuenta de que no está disponible y siga haciendo lo que tenía que hacer.

Aún cuando puedo desactivarlo cuando quiera para distraerme un rato, me ha servido mucho. No debería sorprenderme, pero es muy fácil engañarme.


Como utilizo dnsmasq, ajusté el script para que actualizara su configuración, en lugar de modificar el archivo /etc/hosts. El código está en mi cuenta de BitBucket.

La historia del torpedo la cuentan en el episodio Help! del podcast RadioLab. Recomendado.

Mi Emperador

"El era mi Emperador" me dijo una señora señalando la portada del libro que yo estaba leyendo en el tranvía. El libro era El Emperador y en la portada aparecía Haile Selassie I, el último emperador de Etiopía.

Yo estaba a unas diez páginas de terminar el libro. Había comenzado a leer la descripción de la corte desde adentro y ya había llegado hasta la caída del imperio, en donde se contaba cómo habían sido los últimos días del emperador, cuando estaba en el palacio sólo con uno de sus súbditos.

Hasta ese momento mi imagen de H. S. era la de una persona autoritaria, que se mantenía en el poder mediante la corrupción y vivía aislado de lo que pasaba en el país. El pasaje del libro en el que esto quedaba más claro para mí era aquel en el que el emperador alimentaba con carne los leones que tenía en el jardín del palacio, mientras que en las calles de Abbis Adda las personas se estaban muriendo de hambre y al norte del país había una de las hambrunas más severas de los últimos años.

Seguí leyendo lo que quedaba de la página y cuando llegamos a la siguiente parada del tranvía no pude aguantarme la curiosidad y me apresuré a preguntarle a la señora cuál era su opinión del emperador. Desde su asiento ella me dijo con admiración que H.S. había estado adelantado a su tiempo y que había sido un gran gobernante.

El tranvía se estaba llenando y adelante había un grupo de personas se subieron hablando muy fuerte. En medio del ruido, yo no salía de mi sorpresa y no podía pensar bien qué decir.

"Pero él estuvo rodeado de personas corruptas", continuó. "La educación. Eso era muy importante para el", dijo mientras tomaba el libro y lo hojeaba. "Es un gran libro", concluyó y me lo devolvió.

Quedé más confundido que antes y no supe que decir. No podía confrontarla viendo que hablaba de su emperador de esa forma. No entendía cómo ella podía sentir tanta admiración y respeto por la misma persona que en el libro era descrita como alguien supremamente cruel y corrupto. Peor aún, no podía creer que a ella le gustara el mismo libro.

El tranvía alcanzó a recorrer unas tres paradas mientras yo trataba de pensar qué decirle. Ella seguía sentada leyendo, pero yo ya estaba cerca de la parada en la que tenía que bajar. No se me ocurría nada. No recuerdo si me despedí, pero me bajé con la frustración de haber conocido a un personaje real de una historia que unos minutos atrás me parecía de ficción y no haber sido capaz de preguntarle nada más.