Modelando o Manuscrito Voynich com SBERT para explorar sua estrutura
(github.com/brianmg)- 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 separadamentecluster_roots.py: clustering com SBERT e remoção de sufixosmap_lines_to_clusters.py: mapeamento das linhas do manuscrito para IDs de clusterpos_model.py: inferência de papéis gramaticais com base no comportamento dos clusterstransition_matrix.py: criação e visualização de transições entre clusterslexicon_builder.py: geração de tabelas de vocabulário candidato por seção e papelcluster_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,chye 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.txtpython scripts/cluster_roots.pypython scripts/map_lines_to_clusters.pypython scripts/pos_model.pypython scripts/transition_matrix.pypython 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 umape--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-v2para o maiorparaphrase-multilingual-mpnet-base-v2- O README informa a comparação de tamanho como
22M vs 110M
- O README informa a comparação de tamanho como
1 comentários
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-...
Não é como a antiga “análise fatorial”
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
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
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
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
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
Quero aplicar isso a embeddings de outro tipo de modalidade, mas não tenho muita experiência com processamento de linguagem natural
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
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
O site de Bernholz é bom, mas o trabalho de Child não lança muita luz, de fato, sobre a decifração do manuscrito
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
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
À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