1 puntos por GN⁺ 2025-05-19 | 1 comentarios | Compartir por WhatsApp
  • 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 separado
    • cluster_roots.py: clustering con SBERT y eliminación de sufijos
    • map_lines_to_clusters.py: mapea las líneas del manuscrito a IDs de clúster
    • pos_model.py: infiere roles gramaticales según el comportamiento de los clústeres
    • transition_matrix.py: crea y visualiza transiciones entre clústeres
    • lexicon_builder.py: genera tablas de vocabulario candidato por sección y por rol
    • cluster_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, chy y 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.txt
    • python scripts/cluster_roots.py
    • python scripts/map_lines_to_clusters.py
    • python scripts/pos_model.py
    • python scripts/transition_matrix.py
    • python 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 umap y --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-v2 a paraphrase-multilingual-mpnet-base-v2, de mayor tamaño
    • en el README la comparación de tamaño aparece como 22M vs 110M

1 comentarios

 
GN⁺ 2025-05-19
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-...

    • Recomiendo probar TDA. “mapper”, o más ampliamente los métodos que usan conectividad basada en densidad de kernel, abren un mundo totalmente distinto.
      No es lo mismo que el viejo “análisis factorial”.
    • En interpretabilidad de modelos LLM también se están usando autoencoders dispersos para encontrar representaciones de conceptos (https://openai.com/index/extracting-concepts-from-gpt-4/), y recientemente también se usan probes lineales.
    • Al reducir embeddings, obtuve resultados mucho mejores con UMAP que con PCA o t-SNE.
  • 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.

    • Usé paraphrase-multilingual-MiniLM-L12-v2 como valor predeterminado sobre todo por velocidad y amplia compatibilidad, pero es cierto que para los estándares actuales es un modelo viejo.
      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.

    • Si existe una hipótesis sobre el método de escritura, por ejemplo algo como una rejilla de Cardano, se podría generar texto de esa forma y ver si aparecen las mismas características.
    • Exacto. Por eso me pregunto por qué no simplemente pidieron a 100 personas que escribieran el manuscrito Voynich y entrenaron con ese dataset.
  • 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.

    • Algunos idiomas sí parten palabras al final de la línea.
  • 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.

    • En PCA apareció una separación inesperadamente limpia al principio, así que lo dejé así en las primeras ejecuciones.
      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 pregunto si hay algún ejemplo de cómo realizar ese mapeo de referencia.
      Me gustaría aplicarlo a embeddings de otra modalidad, pero no tengo mucha experiencia en procesamiento de lenguaje natural.
    • Si la separación se ve bien con PCA, personalmente suelo evitar UMAP, porque es más fácil interpretar las distancias relativas entre todos los puntos.
      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.

    • Una palabra como "okeeodair" viene directamente del archivo de transcripción EVA, que mapea los glifos originales del Voynich a aproximaciones ASCII.
      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.

    • Este hilo trata varias afirmaciones de “descifrado”: https://www.voynich.ninja/thread-4341.html
      El sitio de Bernholz está bien, pero el trabajo de Child en realidad no arroja mucha luz sobre el desciframiento del manuscrito.
    • Viendo que el manuscrito sigue siendo tan indescifrable, personalmente me inclino a pensar que es una obra de un artista naïf y que no hay un idioma detrás.
      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.
    • Edward Kelly[1] estaba en el lugar y momento adecuados, y recuerdo que en material que leí hace mucho había evidencia de que estaba familiarizado con la Cardan grille[2]. Ahora no encuentro la fuente, pero solo eso me convenció bastante de que es el autor más plausible y de que el libro fue hecho como broma o fraude.
      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.

    • Ya se ha trabajado mucho sobre 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