보이니치 필사본을 SBERT로 모델링하여 구조를 탐구함
(github.com/brianmg)- 이 저장소는 보이니치 필사본이 실제 언어처럼 행동하는 구조적 패턴을 갖는지 확인하기 위해 번역 추측 없이 클러스터링, 품사 추론, Markov 전이, 섹션별 패턴을 적용함
- 분석 파이프라인은 반복 접미사처럼 보이는
aiin,dy,chy등을 제거한 뒤 multilingual SBERT로 어근을 임베딩하고 클러스터를 만들며, 필사본 각 줄을 클러스터 시퀀스로 매핑함 - 결과는 Cluster 8이 고빈도·저다양성·줄 시작 위치 빈도가 높아 기능어 그룹처럼 보이고, Cluster 3은 다양성과 위치 유연성이 높아 내용어 어근 클래스처럼 보인다는 식의 구조 차이를 제시함
- 접미사 제거는 유사 어간을 더 촘촘히 묶고 전이 행렬을 더 깔끔하게 만들었지만, 실제 형태 정보를 제거하거나 의미 있는 굴절 변이를 가리거나 기능 중심 편향을 만들 수 있는 강한 전처리 선택임
- 이 프로젝트는 의미 번역을 시도하지 않고, 보이니치 필사본이 구문, 기능어/내용어 분리, 섹션별 언어 변화 같은 언어 유사 구조를 보이는지 데이터 기반으로 검토하는 데 초점을 둠
프로젝트의 목적
- 보이니치 필사본은 아직 해독되지 않았고, 합의된 언어학적·암호학적 해법이 없음
- 이 프로젝트는 통계적 엔트로피 검사와 근거 없는 해석 사이의 중간 경로로, 계산언어학 기법을 사용해 필사본이 구조화된 언어 유사 행동을 인코딩하는지 평가함
- 번역이나 GPT식 추측은 하지 않고, 언어처럼 행동하는 구조가 있는지에만 집중함
분석 파이프라인과 파일 구성
/data/에는 전체 전사본, 어근 단어 파일, 제거된 어근 목록, 클러스터 조회표, 줄별 클러스터 시퀀스가 들어 있음/scripts/는 분석 단계를 나눠 실행함cluster_roots.py: SBERT 클러스터링과 접미사 제거map_lines_to_clusters.py: 필사본 줄을 클러스터 ID로 매핑pos_model.py: 클러스터 행동을 기반으로 문법적 역할 추론transition_matrix.py: 클러스터 전이를 만들고 시각화lexicon_builder.py: 섹션과 역할별 후보 어휘표 생성cluster_language_similarity.py: 선택적으로 실제 언어와 클러스터를 비교
/results/에는 PCA 축소 클러스터 그림, Markov 전이 행렬 히트맵, 클러스터 역할 요약, 전이 행렬 CSV, 후보 어휘 CSV가 저장됨
핵심 기여
- multilingual SBERT를 사용해 접미사 제거 어근을 클러스터링함
- 기능어처럼 보이는 클러스터와 내용어처럼 보이는 클러스터를 구분함
- 클러스터 시퀀스에 대해 Markov 방식 전이 모델링을 수행함
- Botanical, Biological 등 필사본 섹션에 따라 구문 구조를 매핑함
- 섹션과 역할을 기준으로 데이터 기반 어휘 가설표를 생성함
전처리 선택과 그 영향
- 반복되는 접미사처럼 보이는
aiin,dy,chy및 유사 변형을 각 단어에서 제거함 - 이 선택의 목적은 변형과 함께 반복되는 어근 형태를 분리하는 것이었음
- 접미사는 다음 중 하나일 가능성이 있다고 봄
- 음성적 패딩
- 문법적 입자
- 주문이나 기억술 같은 반복
- 잡음
- 접미사 제거 후 유사 어간이 더 촘촘히 묶이고, 전이 행렬에서 더 깔끔한 구조 패턴이 나타남
- 다만 이 전처리는 중립적이지 않음
- 실제 형태 정보를 제거했을 수 있음
- 의미 있는 굴절 변이를 가렸을 수 있음
- 내용보다 기능 중심으로 결과를 편향시켰을 수 있음
- 접미사를 제거하지 않거나, 접미사를 별도 토큰 클래스로 처리해 파이프라인을 다시 실행하는 비교가 가능함
관찰된 구조
- Cluster 8은 고빈도, 낮은 다양성, 잦은 줄 시작 위치를 보이며 기능어 그룹일 가능성이 있음
- Cluster 3은 높은 다양성과 유연한 위치를 보여 어근 내용어 클래스일 가능성이 있음
- 전이 행렬은 무작위와 거리가 먼 강한 내부 구조를 보임
- 클러스터 사용과 품사 패턴은 Biological, Botanical 같은 필사본 섹션별로 달라짐
가설과 한계
- 필사본은 음절 패딩과 위치 반복을 사용하는 구조화된 구성 언어 또는 기억술 언어를 인코딩한다는 가설을 둠
- 직접 번역 없이도 구문, 기능어/내용어 분리, 섹션 인식형 언어 변화가 나타난다고 봄
- 한계도 명시됨
- 클러스터와 단어 매핑은 간접적이라 빈도 추정이 겹칠 수 있음
- 접미사 제거는 휴리스틱이며 의미 있는 어미를 제거했을 수 있음
- 의미 번역은 시도하지 않고 구조 모델링만 수행함
재현과 최근 변경
- 재현 절차는 의존성 설치 후 각 스크립트를 순서대로 실행하는 방식임
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
- 시각화는 PCA 외에 UMAP, PaCMAP, LocalMAP 지원이 추가됨
- CLI 리듀서는 인자 없음이 PCA이며,
--reducer umap,--reducer pacmap을 처리함 - 프로젝트는 Windows에서는 동작했지만 MacOS에서는 제대로 동작하게 만들지 못했다는 제한이 있음
- 모델은
all-MiniLM-L6-v2에서 더 큰paraphrase-multilingual-mpnet-base-v2로 변경됨- README에는 크기 비교가
22M vs 110M으로 적혀 있음
- README에는 크기 비교가
댓글과 토론
Hacker News 의견들
-
PCA 투영에서 군집을 찾고 있다면, PaCMAP이나 LocalMAP 같은 최신 차원 축소 알고리즘으로 더 깊은 구조를 보는 게 좋음
Pol.is [1]라는 의미 파악 도구와 관련된 프로젝트를 하고 있는데, 위키 설문 데이터를 PCA 대신 이런 새 알고리즘으로 다시 투영해 보니 새 통찰이 꽤 놀라움
https://patcon.github.io/polislike-opinion-map-painting/
Painted groups: https://t.co/734qNlMdeh
데스크톱에서만 제대로 동작하는 점은 아쉬움
[1]: https://www.technologyreview.com/2025/04/15/1115125/a-small-...- TDA를 시도해 보길 권함. “mapper”나, 더 넓게는 커널 밀도 기반 연결성을 쓰는 방법 전반이 완전히 다른 세계를 열어줌
예전식 “요인 분석”과는 다름 - LLM 모델 해석 가능성에서도 희소 오토인코더로 개념 표현을 찾고 있고(https://openai.com/index/extracting-concepts-from-gpt-4/), 최근에는 선형 프로브도 씀
- 임베딩을 줄일 때 PCA나 t-SNE보다 UMAP에서 훨씬 좋은 결과를 얻었음
- TDA를 시도해 보길 권함. “mapper”나, 더 넓게는 커널 밀도 기반 연결성을 쓰는 방법 전반이 완전히 다른 세계를 열어줌
-
여기서 쓴 텍스트 임베딩 모델은 paraphrase-multilingual-MiniLM-L12-v2(https://huggingface.co/sentence-transformers/paraphrase-mult...)인데, 약 4년 된 모델임
자연어 처리 세계에서는 사실상 고대 모델에 가깝고, 전반적인 LLM 발전 덕분에 작은 임베딩 모델조차 정보 표현력과 임베딩 공간의 구분성이 크게 좋아졌음
요즘 텍스트 임베딩 모델은 명시적으로 다국어 지원 학습을 하지 않았더라도 이런 데이터에서 꽤 잘 작동하므로, 상대적으로 알려지지 않은 언어인 보이니치 필사본에는 더 나을 수 있음
접미사를 제거하거나 품사를 식별하는 전통적인 자연어 처리 기법은 오히려 임베딩 품질을 떨어뜨릴 수 있음. 전체 임베딩에 필요한 관련 문맥 정보가 사라지기 때문임- paraphrase-multilingual-MiniLM-L12-v2를 주로 속도와 넓은 호환성 때문에 기본값으로 썼지만, 지금 기준으로는 오래된 모델이라는 점은 맞음
all-mpnet-base-v2나 text-embedding-ada-002 같은 모델이 어떻게 동작할지 궁금하고, 특히 접미사를 유지한 채 어근 형태로 줄이지 않고 전체 문맥 임베딩을 쓰면 더 흥미로울 듯함
- paraphrase-multilingual-MiniLM-L12-v2를 주로 속도와 넓은 호환성 때문에 기본값으로 썼지만, 지금 기준으로는 오래된 모델이라는 점은 맞음
-
자연어 처리는 잘 모르지만, 이 과정에 대조군을 두는 게 말이 되는지 궁금함
예를 들어 사람에게 언어처럼 보이지만 실제 언어는 아닌 글을 쓰게 한 뒤, 접미사 제거와 군집화 같은 같은 과정을 적용하면 비슷한 결과가 나올 가능성이 있는지 확인할 수 있을 듯함- 작성 방식에 대한 가설이 있다면, 예를 들어 Cardan grille 방식 같은 것으로 텍스트를 생성하고 같은 특징이 나타나는지 볼 수 있을 듯함
- 맞음. 그래서 왜 그냥 100명에게 보이니치 필사본을 쓰게 하고 그 데이터셋으로 학습하지 않았는지 의문임
-
필사본을 한동안 살펴봤는데, 몇몇 페이지에서 글이 삽화에 너무 바짝 붙어 있는 점이 수상했음
일반 언어에서는 단어와 글자의 폭이 달라서 줄 끝에 가까워지면 자연스럽게 줄바꿈을 넣어 새 단어를 시작하고 넘침을 피하게 됨
그런데 이 필사본에는 그런 종류의 끊김이 없어 보였고, 줄 끝에 들어갈 수 있는 글자라면 뭐든 억지로 끼워 넣은 것처럼 보이는 곳이 많았음
줄바꿈 직전과 직후에 어떤 글자가 나오는지, 본문 전체와 차이가 있는지 분석하고 싶었지만 전사본을 찾지 못했음
완전히 아마추어적인 감으로는 정교한 예술 작품이거나 사기극 같음- 어떤 언어들은 줄 끝에서 단어를 나눠 쓰기도 함
-
PCA만으로도 분리가 잘 보이지만, UMAP이나 t-SNE도 좋을 듯함
각 군집을 다른 모든 군집에 기준 매핑해 보면, 분석에서 더 이상 변동성이 남지 않았는지 보여주는 좋은 방법이 될 수 있음- PCA에서 초반에 의외로 깔끔한 분리가 나와서 초기 실행에는 그대로 썼음
하지만 UMAP이나 t-SNE를 적용하면 비선형 관점에서 더 미묘한 패턴이나 실패 사례를 잡을 수 있다는 점은 맞음
군집 간 유사도 행렬은 만들지 않았지만, 듣고 보니 실제 신호가 얼마나 잡혔는지 검증하는 다음 단계로 자연스러움 - 이 기준 매핑을 어떻게 수행하는지 예시가 있는지 궁금함
다른 양식의 임베딩에 적용해 보고 싶은데, 자연어 처리 쪽 경험은 많지 않음 - PCA에서 분리가 잘 보이면 개인적으로는 UMAP을 피하는 편임. 모든 점 사이의 상대적 거리를 해석하기가 더 쉽기 때문임
t-SNE는 어떤 대가를 치르더라도 피함. 그런 그림에서의 거리는 거의 의미가 없다고 보기 때문임
이건 처방이 아니라 개인 취향임
- PCA에서 초반에 의외로 깔끔한 분리가 나와서 초기 실행에는 그대로 썼음
-
매우 흥미로움. https://www.voynich.ninja/index.php에도 링크를 올려보면 좋겠음
SBERT나 현대 통계적 자연어 처리 전반에는 익숙하지 않지만, SBERT는 문장 단위로 작동하고 보이니치 필사본에는 명확한 문장 구분자가 없음. 단어와 문단 구분자만 있음
“보이니치 단어에서 흔한 접미사를 제거한다”는 점도 걱정됨. 보이니치 필사본의 단어는 접두사 + 접미사처럼 보이는데, 접두사가 꽤 짧기 때문에 분석을 시작하기 전에 정보의 절반가량을 잃었을 수 있음
이 방법이 자연어의 의미 있는 텍스트에서도 작동하는지, 무의미한 횡설수설에서도 작동하는지 검증해 보면 좋겠음
암호문은 그 중간 어딘가에 있으며, 단순한 암호일수록 자연어에 가깝고 복잡한 암호일수록 무의미한 횡설수설에 가까움
Gordon Rugg, Torsten Timm, 그리고 나 자신은 서로 다른 방법으로 보이니치 필사본과 매우 비슷한 텍스트를 생성했음
내 것은 여기 있음: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.h...
동등한 EVA 버전은 여기 있음: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.t... -
README에서 놓쳤을 수도 있는데, “단어”의 초기 인코딩은 어떻게 했는지 궁금함
예를 들어 "okeeodair" 같은 단어가 있으면, 그것을 원래 기호로는 어디에 매핑하는지 궁금함- "okeeodair" 같은 단어는 원래 보이니치 글리프를 ASCII 근사치로 매핑한 EVA 전사 파일에서 바로 온 것임
그래서 글리프 자체를 다루는 게 아니라, EVA(European Voynich Alphabet) 체계에 기반한 표준 전사 단어를 다룸
사용한 전사본은 여기서 찾을 수 있음: https://www.voynich.nu/
이 프로젝트에서는 다시 글리프로 매핑하지 않았고, 모든 것은 EVA 전사를 출발점으로 삼았음
따라서 데이터셋에 "okeeodair"가 있다면, 나보다 훨씬 똑똑한 누군가가 글리프 시퀀스를 보고 그렇게 부르기로 합의했기 때문임
- "okeeodair" 같은 단어는 원래 보이니치 글리프를 ASCII 근사치로 매핑한 EVA 전사 파일에서 바로 온 것임
-
가장 흥미로운 가설 중 하나로 이걸 봤음: http://voynichproject.org/
저자는 Voynichese가 게르만어 계열이라고 가정했고, 어느 정도 진전이 있었던 것처럼 보임
우랄어족이나 핀우그리아어족일 수 있다는 내용도 본 적 있음
이 접근은 훌륭하고, 특정 어족에 맞춰 조정하면 더 멀리 갈 수 있지 않을까 궁금함- 여러 “해독” 주장에 대해서는 이 스레드가 다룸: https://www.voynich.ninja/thread-4341.html
Bernholz의 사이트는 괜찮지만, Child의 작업은 실제로 필사본을 해독하는 데 큰 빛을 비추지는 못함 - 필사본이 이렇게까지 해독 불가능한 걸 보면, 개인적으로는 순진파 예술가의 작품이고 그 뒤에 언어는 없다는 쪽으로 봄
언어 규칙을 모르는 사람이 언어를 흉내 낸 것일 수 있음: https://en.wikipedia.org/wiki/Naïve_art
정신적 문제라는 뜻은 아니고, 드물게 일어나는 현상임
보이니치는 순진파 예술 작품의 조건에 꽤 잘 들어맞음 - Edward Kelly[1]는 적절한 장소와 시기에 있었고, 오래전에 읽은 자료에서는 그가 Cardan grille[2]에 익숙했다는 증거도 있었던 것으로 기억함. 지금은 출처를 찾지 못하겠지만, 그 점만으로도 그가 가장 그럴듯한 저자이며 책은 장난이나 사기를 목적으로 했다고 꽤 설득됐음
1.https://en.wikipedia.org/wiki/Edward_Kelley
2.https://en.wikipedia.org/wiki/Cardan_grille
- 여러 “해독” 주장에 대해서는 이 스레드가 다룸: https://www.voynich.ninja/thread-4341.html
-
15세기라면 텍스트를 암호화할 명백한 이유는 종교재판과 당시의 다른 종교적 폭력을 피하기 위해서였을 것임
그래서 같은 자연어 처리를 복음서에 적용해 상관관계를 찾아보면 흥미로울 듯함
먼저 “단어” 기반 비교를 하고, 그다음 “문자” 기반 비교를 해야 할 것 같음. 즉 성경의 그래프와 보이니치의 그래프를 비교하는 식임
또한 혼란을 주기 위해 들어간 문자가 있을 수 있음
예를 들어 여러 변형이 있는 이상한 대문자 “P” 같은 기호는 실제 언어를 나타내기에는 너무 자주 보이는 경우가 있어서, 해독 전에 제거되는 난독화 기호일 수 있음
비정상적으로 자주 등장하는 다른 문자들도 사용되지 않는 더미 문자일 수 있음
물론 “P가 너무 많다”는 현상은 순수한 허구라는 설명과도 맞아떨어짐 -
그런 손글씨 책이 그냥 횡설수설이고 어떤 종류의 암호도 아니라면, 양식, 서예, 쓰는 단어, 심지어 글자 자체도 1페이지에서 마지막 페이지까지 변화해야 할 것 같음
물론 페이지가 재정렬됐을 수는 있지만, 그래도 눈에 띄어야 함
저자가 그런 책을 수십 권이나 이미 써 봤고 그 전부가 사라진 게 아니라면 말임
아주 새로운 생각은 아니겠지만, 그런 패턴에 대한 분석이 있는지 궁금함
페이지 간 일관성에 대한 언급은 어디서도 본 적이 없음- 페이지 간 일관성에 대해서는 이미 많은 작업이 있었음
필경사는 2명으로 여겨지기도 하고(Prescott Currier 참고), Lisa Fagin Davis는 5명이라고 봄
Fagin Davis의 입장을 바탕으로 한 실험 논의는 여기 있음: https://www.voynich.ninja/thread-3783.html
- 페이지 간 일관성에 대해서는 이미 많은 작업이 있었음