Modelan el manuscrito Voynich con SBERT para explorar su estructura
(github.com/brianmg)- Este repositorio aplica clustering, inferencia de partes de la oración, transiciones de Markov y patrones por sección, sin hacer conjeturas de traducción, para comprobar si el manuscrito Voynich tiene patrones estructurales que se comportan como un lenguaje real
- El pipeline de análisis elimina primero lo que parecen ser sufijos repetitivos como
aiin,dy,chy, entre otros; luego incrusta las raíces con SBERT multilingüe, crea clústeres y mapea cada línea del manuscrito a secuencias de clústeres - Los resultados muestran diferencias estructurales como que Cluster 8 parece un grupo de palabras funcionales por su alta frecuencia, baja diversidad y alta frecuencia al inicio de línea, mientras que Cluster 3 parece una clase de raíces de contenido por su mayor diversidad y flexibilidad posicional
- La eliminación de sufijos agrupó con más precisión tallos similares y produjo matrices de transición más limpias, pero es una decisión fuerte de preprocesamiento que puede eliminar información morfológica real, ocultar variaciones flexivas significativas o introducir un sesgo centrado en la función
- En lugar de intentar una traducción semántica, este proyecto se enfoca en evaluar con datos si el manuscrito Voynich muestra estructuras similares al lenguaje, como sintaxis, separación entre palabras funcionales y de contenido, y cambios lingüísticos por sección
Objetivo del proyecto
- El manuscrito Voynich sigue sin descifrarse y no existe una solución lingüística o criptográfica consensuada
- Este proyecto toma una ruta intermedia entre las pruebas estadísticas de entropía y las interpretaciones sin fundamento, usando técnicas de lingüística computacional para evaluar si el manuscrito codifica un comportamiento estructurado similar al lenguaje
- No hace traducciones ni conjeturas al estilo GPT; se concentra solo en si hay estructura que se comporta como lenguaje
Pipeline de análisis y organización de archivos
/data/contiene la transcripción completa, el archivo de palabras raíz, la lista de raíces eliminadas, la tabla de referencia de clústeres y las secuencias de clústeres por línea/scripts/ejecuta las etapas del análisis por separadocluster_roots.py: clustering con SBERT y eliminación de sufijosmap_lines_to_clusters.py: mapea las líneas del manuscrito a IDs de clústerpos_model.py: infiere roles gramaticales según el comportamiento de los clústerestransition_matrix.py: crea y visualiza transiciones entre clústereslexicon_builder.py: genera tablas de vocabulario candidato por sección y por rolcluster_language_similarity.py: compara opcionalmente los clústeres con lenguajes reales
/results/guarda gráficos de clústeres reducidos con PCA, mapas de calor de matrices de transición de Markov, resúmenes de roles de clústeres, CSV de matrices de transición y CSV de vocabulario candidato
Aportes principales
- Usa SBERT multilingüe para agrupar raíces con sufijos eliminados
- Distingue entre clústeres que parecen palabras funcionales y clústeres que parecen palabras de contenido
- Realiza modelado de transiciones tipo Markov sobre secuencias de clústeres
- Mapea la estructura sintáctica según secciones del manuscrito como Botanical y Biological
- Genera tablas hipotéticas de vocabulario basadas en datos según sección y rol
Decisiones de preprocesamiento y su impacto
- Elimina de cada palabra lo que parecen ser sufijos repetidos como
aiin,dy,chyy variaciones similares - El objetivo de esta decisión fue aislar formas raíz que se repiten junto con variaciones
- Se considera que los sufijos podrían ser una de las siguientes cosas
- relleno fonético
- partículas gramaticales
- repetición tipo encantamiento o mnemotecnia
- ruido
- Tras eliminar los sufijos, tallos similares quedaron agrupados con más densidad y aparecieron patrones estructurales más limpios en la matriz de transición
- Aun así, este preprocesamiento no es neutral
- pudo haber eliminado información morfológica real
- pudo haber ocultado variaciones flexivas significativas
- pudo haber sesgado los resultados hacia la función más que hacia el contenido
- Es posible volver a ejecutar el pipeline sin eliminar los sufijos, o tratándolos como una clase de tokens separada, para hacer comparaciones
Estructura observada
- Cluster 8 muestra alta frecuencia, baja diversidad y aparición frecuente al inicio de línea, por lo que podría ser un grupo de palabras funcionales
- Cluster 3 muestra alta diversidad y posición flexible, por lo que podría ser una clase de palabras raíz de contenido
- La matriz de transición muestra una fuerte estructura interna, lejos de ser aleatoria
- El uso de clústeres y los patrones de partes de la oración cambian según secciones del manuscrito como Biological y Botanical
Hipótesis y limitaciones
- Se plantea la hipótesis de que el manuscrito codifica un lenguaje construido estructurado o un lenguaje mnemotécnico que usa relleno silábico y repetición posicional
- Incluso sin traducción directa, se considera que aparecen sintaxis, separación entre palabras funcionales y de contenido, y variación lingüística sensible a la sección
- También se señalan limitaciones
- el mapeo entre clústeres y palabras es indirecto, por lo que las estimaciones de frecuencia pueden superponerse
- la eliminación de sufijos es heurística y pudo haber quitado terminaciones significativas
- no intenta una traducción semántica y solo realiza modelado estructural
Reproducción y cambios recientes
- El procedimiento de reproducción consiste en instalar dependencias y ejecutar cada script en orden
pip install -r requirements.txtpython scripts/cluster_roots.pypython scripts/map_lines_to_clusters.pypython scripts/pos_model.pypython scripts/transition_matrix.pypython scripts/lexicon_builder.py
- Además de PCA, se añadió soporte de visualización para UMAP, PaCMAP y LocalMAP
- En el CLI, el reductor por defecto sin argumentos es PCA, y se aceptan
--reducer umapy--reducer pacmap - El proyecto tiene la limitación de que funcionó en Windows, pero no se logró hacer que funcionara correctamente en MacOS
- El modelo cambió de
all-MiniLM-L6-v2aparaphrase-multilingual-mpnet-base-v2, de mayor tamaño- en el README la comparación de tamaño aparece como
22M vs 110M
- en el README la comparación de tamaño aparece como
1 comentarios
Comentarios de Hacker News
Si están buscando clústeres en una proyección PCA, conviene mirar estructuras más profundas con algoritmos modernos de reducción de dimensionalidad como PaCMAP o LocalMAP.
Estoy trabajando en un proyecto relacionado con Pol.is [1], una herramienta para entender opiniones, y al volver a proyectar datos de encuestas wiki con estos algoritmos nuevos en vez de PCA, los nuevos insights fueron bastante sorprendentes.
https://patcon.github.io/polislike-opinion-map-painting/
Painted groups: https://t.co/734qNlMdeh
Es una lástima que solo funcione bien en escritorio.
[1]: https://www.technologyreview.com/2025/04/15/1115125/a-small-...
No es lo mismo que el viejo “análisis factorial”.
El modelo de embeddings de texto usado aquí es paraphrase-multilingual-MiniLM-L12-v2 (https://huggingface.co/sentence-transformers/paraphrase-mult...), un modelo de hace unos 4 años.
En el mundo del procesamiento de lenguaje natural, eso es prácticamente un modelo antiguo, y gracias al avance general de los LLM, incluso los modelos pequeños de embeddings han mejorado mucho en capacidad de representación de información y en separabilidad del espacio de embeddings.
Los modelos actuales de embeddings de texto funcionan bastante bien con este tipo de datos aunque no hayan sido entrenados explícitamente con soporte multilingüe, así que podrían rendir mejor con un idioma relativamente desconocido como el manuscrito Voynich.
Las técnicas tradicionales de procesamiento de lenguaje natural, como eliminar sufijos o identificar partes de la oración, podrían incluso empeorar la calidad de los embeddings, porque eliminan información contextual relevante necesaria para el embedding completo.
Me da curiosidad cómo funcionarían modelos como all-mpnet-base-v2 o text-embedding-ada-002, y en especial sería más interesante usar embeddings de contexto completo manteniendo los sufijos y sin reducir las palabras a su raíz.
No sé mucho de procesamiento de lenguaje natural, pero me pregunto si tendría sentido incluir un grupo de control en este proceso.
Por ejemplo, se podría pedir a personas que escriban textos que parezcan un idioma pero que no sean un idioma real, y luego aplicar el mismo proceso de eliminación de sufijos y clustering para ver si es probable obtener resultados similares.
Estuve revisando el manuscrito durante un tiempo, y me pareció sospechoso que en algunas páginas el texto estuviera demasiado pegado a las ilustraciones.
En los idiomas normales, como el ancho de las palabras y las letras varía, cuando uno se acerca al final de una línea naturalmente hace un salto de línea para empezar una palabra nueva y evitar que se desborde.
Pero en este manuscrito no parecía haber ese tipo de cortes, y en muchos lugares daba la impresión de que metían a la fuerza cualquier letra que cupiera al final de la línea.
Quería analizar qué letras aparecen justo antes y después de los saltos de línea, y si difieren del cuerpo completo, pero no pude encontrar una transcripción.
Mi impresión totalmente amateur es que es una obra de arte elaborada o una estafa.
Incluso solo con PCA se ve una separación clara, pero UMAP o t-SNE también podrían funcionar bien.
Mapear cada clúster contra todos los demás como referencia podría ser una buena forma de mostrar si ya no queda variabilidad en el análisis.
Pero es cierto que aplicar UMAP o t-SNE podría captar patrones más sutiles o casos fallidos desde una perspectiva no lineal.
No hice una matriz de similitud entre clústeres, pero ahora que lo mencionas, suena como un siguiente paso natural para validar cuánta señal real se capturó.
Me gustaría aplicarlo a embeddings de otra modalidad, pero no tengo mucha experiencia en procesamiento de lenguaje natural.
Evito t-SNE a toda costa, porque considero que las distancias en esos gráficos casi no significan nada.
No es una prescripción, solo una preferencia personal.
Muy interesante. Estaría bueno publicar el enlace también en https://www.voynich.ninja/index.php
No estoy familiarizado con SBERT ni con el procesamiento estadístico moderno del lenguaje natural en general, pero SBERT funciona a nivel de oración, y el manuscrito Voynich no tiene delimitadores de oración claros. Solo tiene delimitadores de palabras y párrafos.
También me preocupa eso de “quitar los sufijos comunes de las palabras Voynich”. Las palabras del manuscrito Voynich parecen tener prefijo + sufijo, y como los prefijos son bastante cortos, quizá se haya perdido alrededor de la mitad de la información antes de empezar el análisis.
Sería bueno verificar si este método funciona también con textos significativos en lenguaje natural o con galimatías sin sentido.
Los textos cifrados están en algún punto intermedio: cuanto más simple es el cifrado, más se parecen al lenguaje natural; cuanto más complejo, más se acercan a la galimatías sin sentido.
Gordon Rugg, Torsten Timm y yo mismo generamos, con métodos distintos, textos muy parecidos al manuscrito Voynich.
El mío está aquí: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.h...
La versión EVA equivalente está aquí: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.t...
Puede que me lo haya perdido en el README, pero me pregunto cómo hicieron la codificación inicial de las “palabras”.
Por ejemplo, si hay una palabra como "okeeodair", me pregunto a qué se mapea en los símbolos originales.
Así que no se trabaja con los glifos en sí, sino con palabras transcritas estándar basadas en el sistema EVA (European Voynich Alphabet).
La transcripción usada se puede encontrar aquí: https://www.voynich.nu/
En este proyecto no se volvió a mapear a glifos; todo tomó como punto de partida la transcripción EVA.
Por lo tanto, si en el dataset aparece "okeeodair", es porque alguien mucho más inteligente que yo miró la secuencia de glifos y hubo consenso en llamarla así.
Vi esto como una de las hipótesis más interesantes: http://voynichproject.org/
El autor supone que el Voynichese pertenece a la familia germánica, y parece que logró cierto avance.
También he visto propuestas de que podría pertenecer a la familia urálica o finoúgrica.
Este enfoque es excelente, y me pregunto si podría llegar más lejos si se ajustara a una familia lingüística específica.
El sitio de Bernholz está bien, pero el trabajo de Child en realidad no arroja mucha luz sobre el desciframiento del manuscrito.
Podría ser alguien que no conoce las reglas de un idioma imitando un idioma: https://en.wikipedia.org/wiki/Naïve_art
No quiero decir que se trate de un problema mental, sino de un fenómeno poco común.
El Voynich encaja bastante bien con las condiciones de una obra de arte naïf.
1.https://en.wikipedia.org/wiki/Edward_Kelley
2.https://en.wikipedia.org/wiki/Cardan_grille
En el siglo XV, una razón obvia para cifrar un texto habría sido evitar la Inquisición y otras violencias religiosas de la época.
Por eso sería interesante aplicar el mismo procesamiento de lenguaje natural a los evangelios y buscar correlaciones.
Creo que primero habría que hacer una comparación basada en “palabras” y luego una basada en “caracteres”; es decir, comparar el grafo de la Biblia con el grafo del Voynich.
También podría haber caracteres introducidos para generar confusión.
Por ejemplo, símbolos como esa extraña “P” mayúscula con varias variantes aparecen con demasiada frecuencia como para representar un idioma real, así que podrían ser símbolos de ofuscación que se eliminan antes de descifrar.
Otros caracteres que aparecen con una frecuencia anormal también podrían ser caracteres de relleno no usados.
Claro que el fenómeno de que “hay demasiadas P” también encaja con la explicación de que sea pura ficción.
Si un libro manuscrito así fuera simplemente galimatías y no algún tipo de cifrado, me parecería que el estilo, la caligrafía, las palabras usadas e incluso las propias letras deberían cambiar desde la página 1 hasta la última.
Claro que las páginas podrían haber sido reordenadas, pero aun así debería notarse.
A menos que el autor ya hubiera escrito decenas de libros así y todos ellos hubieran desaparecido.
No creo que sea una idea muy nueva, pero me pregunto si existe algún análisis de ese tipo de patrones.
No he visto en ninguna parte menciones a la consistencia entre páginas.
A veces se considera que hubo 2 escribas (véase Prescott Currier), mientras que Lisa Fagin Davis sostiene que fueron 5.
Aquí hay una discusión de experimentos basada en la postura de Fagin Davis: https://www.voynich.ninja/thread-3783.html