Aplicación programada en Java, cuyas librerías están organizadas en módulos.
La extracción de partidas, su función más destacada, se basa en un parser que es una combinación de analizador léxico con un analizador sintáctico
La primera versión de este parser, permitía extraer partidas en notación algebraica en varios idiomas
A partir de la versión v1.26 también se permite la extracción de partidas en notación algebraica de figuras
Esta nueva función se programó basándose en el parser de partidas ya existente, pero añadiéndole una capa que tradujera las imágenes de las figuras a sus correspondientes iniciales, para así poder aplicar el parser de partidas existente
El traductor de imágenes a las iniciales de las figuras, se ha implementado usando el algoritmo de vecino más cercano, con K = 1
Es decir, que toma de entre los ejemplos etiquetados que tiene configurados, el más cercano en base a una medida de error.
Otra función interesante es la de reconocimiento de posiciones (añadida en la v1.20). De una imagen de un tablero, la aplicación trata de obtener la cadena FEN de la posición.
Esa función está programada haciendo uso de la teoría de un artículo de IEEE que compré para esto:
- Con una detección de bordes, se trata de obtener la ubicación de las casillas del tablero.
- Si hubo éxito se recorren todas las casillas, y se trata de reconocer la figura que hay en cada una de ellas o si está vacía, con el algoritmo de vecino más cercano.
- Si hubo éxito reoconociendo todas las casillas, entonces se supone que hubo éxito reconociendo el tablero.
- Si no hubo éxito reconociendo todas las casillas, se le muestra al usuario el tablero con las casillas reconocidas, y se le pide que lo complete, para tener más ejemplos que permitan reconocer completamente el tablero.
El reconocedor de tableros, se autoentrena cuando se extraen las partidas de un PDF, ya que hay imágenes de posiciones que sí que son conocidas, y con ellas se autoentrena para obtener ejemplos de casillas con piezas
Una función también interesante que se añadió en la v1.20, es la de extracción de metadatos de las partidas (nombres de los jugadores, ELOs, fecha, lugar, ...).
Esta función se basa en un sistema de expresiones regulares que contemplan muchos formatos de metadatos con los que me había encontrado durante las pruebas.
Y otra función que puede ser interesante también añadida en la v1.20, es la opción de conectar con motores tipo UCI (como Stockfish).
Para esta función se programó un configurador genérico de motores, que leía la configuración del motor durante la conexión y creaba un formulario para que el usuario pudiera cambiar las opciones del motor.