1 pontos por GN⁺ 2025-05-19 | 1 comentários | Compartilhar no WhatsApp
  • Este repositório aplica clustering, inferência de classes gramaticais, transições de Markov e padrões por seção, sem suposições de tradução, para verificar se o Manuscrito Voynich tem padrões estruturais que se comportam como uma língua real
  • O pipeline de análise remove primeiro elementos que parecem sufixos repetidos, como aiin, dy, chy, depois incorpora as raízes com multilingual SBERT, cria clusters e mapeia cada linha do manuscrito para uma sequência de clusters
  • Os resultados apresentam diferenças estruturais: o Cluster 8 tem alta frequência, baixa diversidade e alta frequência no início das linhas, parecendo um grupo de palavras funcionais, enquanto o Cluster 3 tem alta diversidade e flexibilidade posicional, parecendo uma classe de raízes de palavras de conteúdo
  • A remoção de sufixos agrupou radicais semelhantes de forma mais compacta e tornou a matriz de transição mais limpa, mas é uma escolha forte de pré-processamento que pode remover informações morfológicas reais, ocultar variações flexionais significativas ou criar um viés centrado em função
  • O projeto não tenta fazer tradução semântica; ele se concentra em examinar, com base em dados, se o Manuscrito Voynich apresenta estruturas semelhantes às de uma língua, como sintaxe, separação entre palavras funcionais e de conteúdo e variação linguística por seção

Objetivo do projeto

  • O Manuscrito Voynich ainda não foi decifrado e não há uma solução linguística ou criptográfica consensual
  • Este projeto segue um caminho intermediário entre testes estatísticos de entropia e interpretações sem fundamento, usando técnicas de linguística computacional para avaliar se o manuscrito codifica um comportamento estruturado semelhante ao de uma língua
  • Ele não faz tradução nem suposições no estilo GPT, concentrando-se apenas em saber se existe uma estrutura que se comporta como linguagem

Pipeline de análise e organização dos arquivos

  • /data/ contém a transcrição completa, o arquivo de palavras-raiz, a lista de raízes removidas, a tabela de consulta de clusters e as sequências de clusters por linha
  • /scripts/ executa as etapas da análise separadamente
    • cluster_roots.py: clustering com SBERT e remoção de sufixos
    • map_lines_to_clusters.py: mapeamento das linhas do manuscrito para IDs de cluster
    • pos_model.py: inferência de papéis gramaticais com base no comportamento dos clusters
    • transition_matrix.py: criação e visualização de transições entre clusters
    • lexicon_builder.py: geração de tabelas de vocabulário candidato por seção e papel
    • cluster_language_similarity.py: comparação opcional dos clusters com línguas reais
  • /results/ armazena a visualização dos clusters com redução por PCA, o mapa de calor da matriz de transição de Markov, o resumo dos papéis dos clusters, a matriz de transição em CSV e o vocabulário candidato em CSV

Principais contribuições

  • Usa multilingual SBERT para agrupar raízes com sufixos removidos
  • Diferencia clusters que parecem palavras funcionais de clusters que parecem palavras de conteúdo
  • Realiza modelagem de transições no estilo Markov sobre sequências de clusters
  • Mapeia estruturas sintáticas conforme seções do manuscrito, como Botanical e Biological
  • Gera tabelas de hipóteses lexicais orientadas por dados com base em seção e papel

Escolhas de pré-processamento e seus efeitos

  • Remove de cada palavra aiin, dy, chy e variações semelhantes que parecem sufixos recorrentes
  • O objetivo dessa escolha foi separar formas de raiz que se repetem junto com variações
  • Considera-se que os sufixos podem ser uma destas opções
    • preenchimento fonético
    • partículas gramaticais
    • repetição semelhante a encantamentos ou mnemônicos
    • ruído
  • Após a remoção dos sufixos, radicais semelhantes foram agrupados de forma mais compacta, e padrões estruturais mais limpos apareceram na matriz de transição
  • No entanto, esse pré-processamento não é neutro
    • pode ter removido informações morfológicas reais
    • pode ter ocultado variações flexionais significativas
    • pode ter enviesado os resultados para algo mais centrado em função do que em conteúdo
  • É possível comparar reexecutando o pipeline sem remover sufixos ou tratando os sufixos como uma classe separada de tokens

Estrutura observada

  • O Cluster 8 apresenta alta frequência, baixa diversidade e ocorrência frequente no início das linhas, podendo ser um grupo de palavras funcionais
  • O Cluster 3 apresenta alta diversidade e posição flexível, podendo ser uma classe de palavras de conteúdo de raiz
  • A matriz de transição mostra uma forte estrutura interna, longe de aleatória
  • O uso de clusters e os padrões de classes gramaticais variam conforme seções do manuscrito, como Biological e Botanical

Hipóteses e limitações

  • A hipótese é que o manuscrito codifica uma língua construída estruturada ou uma língua mnemônica que usa preenchimento silábico e repetição posicional
  • Mesmo sem tradução direta, considera-se que aparecem sintaxe, separação entre palavras funcionais e de conteúdo e variação linguística sensível à seção
  • As limitações também são explicitadas
    • o mapeamento entre clusters e palavras é indireto, então estimativas de frequência podem se sobrepor
    • a remoção de sufixos é heurística e pode ter removido terminações significativas
    • não se tenta uma tradução semântica; apenas modelagem estrutural é realizada

Reprodução e mudanças recentes

  • O procedimento de reprodução consiste em instalar as dependências e executar cada script em ordem
    • 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
  • Além de PCA, foi adicionado suporte a UMAP, PaCMAP e LocalMAP para visualização
  • O redutor da CLI usa PCA quando nenhum argumento é fornecido e aceita --reducer umap e --reducer pacmap
  • O projeto funcionou no Windows, mas há a limitação de que não foi possível fazê-lo funcionar corretamente no MacOS
  • O modelo foi alterado de all-MiniLM-L6-v2 para o maior paraphrase-multilingual-mpnet-base-v2
    • O README informa a comparação de tamanho como 22M vs 110M

1 comentários

 
GN⁺ 2025-05-19
Comentários do Hacker News
  • Se você está procurando clusters em uma projeção PCA, vale a pena usar algoritmos modernos de redução de dimensionalidade, como PaCMAP ou LocalMAP, para enxergar uma estrutura mais profunda
    Estou trabalhando em um projeto relacionado a uma ferramenta de compreensão semântica chamada Pol.is [1]; ao reprojetar dados de enquetes wiki com esses novos algoritmos em vez de PCA, os novos insights foram bastante surpreendentes
    https://patcon.github.io/polislike-opinion-map-painting/
    Grupos pintados: https://t.co/734qNlMdeh
    Pena que só funciona direito no desktop
    [1]: https://www.technologyreview.com/2025/04/15/1115125/a-small-...

    • Recomendo tentar TDA. O “mapper”, ou, de forma mais ampla, métodos que usam conectividade baseada em densidade de kernel, abrem um mundo completamente diferente
      Não é como a antiga “análise fatorial”
    • Na interpretabilidade de modelos LLM, também estão buscando representações de conceitos com autoencoders esparsos (https://openai.com/index/extracting-concepts-from-gpt-4/), e mais recentemente também usam probes lineares
    • Ao reduzir embeddings, obtive resultados muito melhores com UMAP do que com PCA ou t-SNE
  • O modelo de embedding de texto usado aqui é o paraphrase-multilingual-MiniLM-L12-v2 (https://huggingface.co/sentence-transformers/paraphrase-mult...), que tem cerca de 4 anos
    No mundo do processamento de linguagem natural, isso já é praticamente um modelo antigo, e, graças ao avanço geral dos LLMs, até modelos pequenos de embedding melhoraram muito em poder de representação de informação e na separabilidade do espaço de embeddings
    Modelos atuais de embedding de texto costumam funcionar bem com esse tipo de dado mesmo sem terem sido treinados explicitamente para suporte multilíngue, então podem se sair melhor com uma língua relativamente pouco conhecida como o manuscrito Voynich
    Técnicas tradicionais de processamento de linguagem natural, como remover sufixos ou identificar classes gramaticais, podem até piorar a qualidade dos embeddings, porque removem informações contextuais relevantes necessárias para o embedding como um todo

    • Usei o paraphrase-multilingual-MiniLM-L12-v2 como padrão principalmente por velocidade e ampla compatibilidade, mas é verdade que, pelos padrões atuais, ele é um modelo antigo
      Tenho curiosidade para ver como modelos como all-mpnet-base-v2 ou text-embedding-ada-002 se comportariam, e seria especialmente interessante usar embeddings de contexto completo, mantendo os sufixos e sem reduzir as palavras à forma de raiz
  • Não entendo muito de processamento de linguagem natural, mas me pergunto se faria sentido ter um grupo de controle nesse processo
    Por exemplo, seria possível pedir a uma pessoa que escrevesse um texto que parecesse uma língua para humanos, mas que não fosse uma língua real, e então aplicar o mesmo processo, como remoção de sufixos e clusterização, para verificar se resultados parecidos apareceriam

    • Se houver uma hipótese sobre o método de escrita, por exemplo algo como uma grade de Cardano, daria para gerar texto assim e ver se as mesmas características aparecem
    • Exato. Por isso me pergunto por que simplesmente não pediram a 100 pessoas que escrevessem um manuscrito Voynich e treinaram com esse dataset
  • Dei uma olhada no manuscrito por um tempo, e em algumas páginas achei suspeito como o texto fica colado demais às ilustrações
    Em línguas comuns, como a largura das palavras e das letras varia, quando se chega perto do fim da linha é natural inserir uma quebra de linha para começar uma nova palavra e evitar que ela ultrapasse o limite
    Mas nesse manuscrito não parecia haver esse tipo de quebra, e em muitos pontos parecia que qualquer letra que coubesse no fim da linha era enfiada ali à força
    Eu queria analisar quais caracteres aparecem logo antes e logo depois das quebras de linha, e se isso difere do restante do texto, mas não consegui encontrar uma transcrição
    Com uma intuição totalmente amadora, parece uma obra de arte elaborada ou uma fraude

    • Algumas línguas dividem palavras no fim da linha
  • A separação já aparece bem só com PCA, mas UMAP ou t-SNE também parecem boas opções
    Fazer um mapeamento de referência de cada cluster contra todos os outros pode ser uma boa maneira de mostrar se ainda resta variabilidade na análise

    • Como no PCA apareceu uma separação inesperadamente limpa logo no início, mantive isso nas execuções iniciais
      Mas é verdade que aplicar UMAP ou t-SNE pode capturar padrões mais sutis ou casos de falha de uma perspectiva não linear
      Não montei uma matriz de similaridade entre clusters, mas, agora que você mencionou, isso parece um próximo passo natural para validar quanto sinal real foi capturado
    • Fiquei curioso se há algum exemplo de como realizar esse mapeamento de referência
      Quero aplicar isso a embeddings de outro tipo de modalidade, mas não tenho muita experiência com processamento de linguagem natural
    • Quando a separação aparece bem no PCA, pessoalmente prefiro evitar UMAP, porque fica mais fácil interpretar as distâncias relativas entre todos os pontos
      Evito t-SNE a qualquer custo, pois considero que as distâncias nesses gráficos quase não têm significado
      Isso não é uma recomendação, é só preferência pessoal
  • Muito interessante. Seria bom postar o link também em https://www.voynich.ninja/index.php
    Não sou familiarizado com SBERT nem com processamento estatístico moderno de linguagem natural em geral, mas o SBERT opera no nível de frases, e o manuscrito Voynich não tem separadores de frase claros. Há apenas separadores de palavras e parágrafos
    Também me preocupa o ponto de “remover sufixos comuns das palavras Voynich”. As palavras do manuscrito Voynich parecem prefixo + sufixo, e como os prefixos são bem curtos, talvez você tenha perdido cerca de metade da informação antes mesmo de começar a análise
    Seria bom verificar se esse método funciona também em textos significativos de linguagem natural e em tagarelice sem sentido
    Textos cifrados ficam em algum lugar entre esses dois extremos; quanto mais simples a cifra, mais próxima da linguagem natural, e quanto mais complexa, mais próxima de uma tagarelice sem sentido
    Gordon Rugg, Torsten Timm e eu próprio geramos, por métodos diferentes, textos muito parecidos com o manuscrito Voynich
    O meu está aqui: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.h...
    A versão EVA equivalente está aqui: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.t...

  • Talvez eu tenha deixado passar no README, mas fiquei curioso sobre como foi feita a codificação inicial das “palavras”
    Por exemplo, se houver uma palavra como "okeeodair", gostaria de saber a quais símbolos originais ela é mapeada

    • Uma palavra como "okeeodair" vem diretamente de um arquivo de transcrição EVA, que mapeia os glifos originais do Voynich para aproximações em ASCII
      Portanto, não estou lidando com os glifos em si, mas com palavras de transcrição padrão baseadas no sistema EVA (European Voynich Alphabet)
      A transcrição usada pode ser encontrada aqui: https://www.voynich.nu/
      Neste projeto, não fiz um mapeamento de volta para glifos; tudo tomou a transcrição EVA como ponto de partida
      Portanto, se "okeeodair" aparece no dataset, é porque alguém muito mais inteligente do que eu olhou para a sequência de glifos e concordou em chamá-la assim
  • Vi isto como uma das hipóteses mais interessantes: http://voynichproject.org/
    O autor pressupôs que o Voynichese é de uma família germânica, e parece ter havido algum avanço
    Também já vi a ideia de que poderia ser uma língua urálica ou fino-úgrica
    Esta abordagem é excelente, e fico imaginando se ela não poderia ir mais longe se fosse ajustada para uma família linguística específica

    • Esta thread trata de várias alegações de “decifração”: https://www.voynich.ninja/thread-4341.html
      O site de Bernholz é bom, mas o trabalho de Child não lança muita luz, de fato, sobre a decifração do manuscrito
    • Vendo como o manuscrito continua tão indecifrável, pessoalmente tendo a achar que é uma obra de um artista naïf e que não há uma língua por trás
      Pode ser alguém que imita uma língua sem conhecer as regras de uma língua: https://en.wikipedia.org/wiki/Naïve_art
      Não quero dizer que seja um problema mental; é um fenômeno raro
      O Voynich se encaixa muito bem nas condições de uma obra de arte naïf
    • Edward Kelly[1] estava no lugar e na época certos, e lembro que, em material que li muito tempo atrás, havia também evidências de que ele conhecia a grade de Cardano[2]. Não consigo encontrar a fonte agora, mas só isso já me convenceu bastante de que ele é o autor mais plausível e de que o livro foi feito como brincadeira ou fraude
      1.https://en.wikipedia.org/wiki/Edward_Kelley
      2.https://en.wikipedia.org/wiki/Cardan_grille
  • No século XV, a razão óbvia para criptografar um texto teria sido evitar a Inquisição e outras violências religiosas da época
    Então seria interessante aplicar o mesmo processamento de linguagem natural aos evangelhos e procurar correlações
    Acho que primeiro deveria ser feita uma comparação baseada em “palavras” e depois uma comparação baseada em “caracteres”. Ou seja, comparar o grafo da Bíblia com o grafo do Voynich
    Também pode haver caracteres inseridos para confundir
    Por exemplo, um símbolo como aquele “P” maiúsculo estranho, com várias variantes, às vezes aparece com frequência demais para representar uma língua real; poderia ser um símbolo de ofuscação a ser removido antes da decifração
    Outros caracteres que aparecem com frequência anormal também podem ser caracteres dummy não usados
    Claro, o fenômeno de “P demais” também é compatível com a explicação de que tudo é pura ficção

  • Se um livro manuscrito desses fosse apenas tagarelice e não algum tipo de cifra, eu esperaria que o estilo, a caligrafia, as palavras usadas e até as próprias letras mudassem da primeira à última página
    Claro que as páginas podem ter sido reorganizadas, mas ainda assim isso deveria ser perceptível
    A menos que o autor já tivesse escrito dezenas de livros assim e todos eles tenham desaparecido
    Não deve ser uma ideia muito nova, mas fico curioso se há alguma análise desse tipo de padrão
    Nunca vi menção à consistência entre páginas

    • Já houve muito trabalho sobre consistência entre páginas
      Às vezes se considera que houve 2 escribas (ver Prescott Currier), e Lisa Fagin Davis vê 5
      Há uma discussão de experimentos baseada na posição de Fagin Davis aqui: https://www.voynich.ninja/thread-3783.html