lunes, 2 de noviembre de 2015

petraREV: Tirando del hilo de la madeja de las repeticiones

Muchos novelistas han comentado alguna vez que uno de los aspectos más apasionantes de escribir una historia es descubrir como se desarrolla, lo que muchas veces resulta una sorpresa para ellos mismos, a pesar del evidente control que tienen sobre ella. Al programar a veces ocurre algo parecido. Comienzas a escribir un método y, conforme vas tecleando aparecen de forma mágica el programa comienza a adquirir como por arte de magia funciones en que no eran las que tenías pensadas cuando te sentaste a escribir el código.

Algo parecido me ha ocurrido con la última función que he incorporado a petraREV y que tuvo su origen en una idea muy sencilla: la comprobación de coherencia, una de las primeras funciones de esta herramienta. Esta función es una de las más prácticas y, desde hace mucho, funciona de manera muy estable. No obstante, cuando revisaba con petraREV archivos en los que sabía que había muchas repeticiones y petraREV me decía escuetamente que no había ningún problema, no me sentía satisfecho con esta respuesta. ¿Había muchas repeticiones y todas estaban bien o, por algún motivo, no había problemas porque sencillamente no había repeticiones? Ningún número de la línea de resultados me informaba de ello, así que me decidí a incluir un pequeño número que me informara sencillamente del número de repeticiones que sí que habían coincidido.

Mi idea era incluir este número directamente en la rutina de comprobación de coherencia. Bastaba probablemente con dar visibilidad a algún cálculo interno para lograr la información que necesitaba. No obstante, al releer la rutina me di cuenta de que el dato que buscaba no era tan obvio y, ahora que me detenía a pensar en ello, me daba cuenta de que ni siquiera sabía exactamente lo que quería. ¿Importaban solo las repeticiones globales o era preferible desglosarlas por archivos? ¿Tal vez era una oportunidad para estudiar la distribución de repeticiones por archivos?

Con todas estas consideraciones, era evidente que no bastaba con añadir un pequeño número al informe, así que comencé a escribir una nueva función, la número 84, para analizar las repeticiones. Decidí que la manera más completa de mostrar la información era indicar el número de segmentos que no se repiten en ningún otro sitio, las repeticiones dentro del propio archivo y las de los otros archivos. Tras unas cuantas líneas obtuve los datos deseados, pero la información mostrada en una tabla parecía poco intuitiva. Leer que un archivo tiene 17 segmentos nuevos, 5 repeticiones internas y 3 repeticiones externas no permite extraer ninguna conclusión rápida. Es posible convertir estas cifras al porcentajes, es decir, 68%, 20% y 12% respectivamente, pero sigue habiendo que detenerse unos momentos a analizar estos datos.

Por tanto, decidí construir un nuevo objeto gráfico que mostrase estos datos como porcentajes de una barra en varios colores. A la derecha, las palabras nuevas, luego las repeticiones internas y por último las externas. El resultado era mucho mejor, pero seguía sin aclararse una incógnita sobre esas repeticiones externas. ¿Estaban distribuidas en muchos archivos o en pocos? Y, aún más importantes, ¿había problemas de coherencia en estas repeticiones o no?

No parecía que el gráfico o la tabla pudiera incluir esta información sin convertirlo en un galimatías, así que le añadí a la función una opción de mostrar detalles de la repeticiones en los que, para cada archivo, se mostraría el número de segmentos repetidos que había y también los problemas de coherencia que planteaban. El objeto gráfico para crear barras de colores estaba ya creado así que decidí utilizarlo para mostrar una comparación entre los segmentos coincidentes y los no coincidentes. En este caso, los colores por defecto del gráfico no parecían adecuados (ni el azul oscuro ni el azul oscuro indican dónde está el problema), así que modifiqué la biblioteca gráfica para mostrar unos verde y rojo mucho más reveladores (¿a que en este caso ya no hace falta que diga qué color indica el error?).

Ahora podía ver claramente el efecto sobre los demás archivos que tenían las repeticiones de un archivo, pero ver una columna de barras del mismo ancho podía inducir a error, porque sugería que todos los archivos eran igualmente similares al que se estaba analizando. ¿No sería preferible que el ancho de la barra fuera proporcional al número de segmentos repetidos presentes? Y, puestos a pedir, ¿no deberían aparecer en primer lugar los archivos en los que el número de repeticiones era mayor? Dicho y hecho, aunque para ello tuve que modificar una vez más el objeto gráfico y presentar los datos de otra manera, aparte de crear una nueva opción de configuración para que las rutas se pudieran reducir a la mínima longitud necesaria.

El resultado podéis verlo debajo y creo que ilustra de manera bastante directa cómo se reparten los segmentos repetidos de un conjunto de segmentos, pero desde luego si os resulta críptico os agradecería enormemente que me pusieseis los pies en la tierra:


Desde luego no pienso que la rutina esté completamente terminada. A fin de cuentas, falta traducirla al inglés y documentarla, aparte de que algunas mejoras siguen rondando mi cabeza. Por ejemplo, tal vez los archivos deberían aparecer ordenados por número de segmentos repetidos en lugar de por el orden en que se cargaron. Igualmente, tal vez la longitud de la barra que distingue entre repeticiones coincidentes y no coincidentes debería ser proporcional para todos los archivos (ahora es proporcional para cada archivo). Y desde luego, los números deberían aparecer alineados a la derecha. Aún así, son ya mejoras que no tengo tan claras. Siempre que hay que plantearse si una idea constituye una oportunidad o una distracción y ya no lo tengo tan claro sobre estas nuevas ideas.

A fin de cuentas, lo que empezó siendo un pequeño número, se ha convertido en una nueva función, un nuevo objeto gráfico estadístico y hasta una nueva opción de configuración que tal vez pronto afecte a gran parte de los resultados que presenta petraREV y, desde luego, cuando comencé a programar no tenía ni idea que iba a descubrir esta historia.