世界を動かす技術を、日本語で。

HNに表示: SBERTを用いてヴォイニッチ手稿の構造をモデル化しました

概要

  • Voynich Manuscriptを現代NLPで構造解析したプロジェクトの要約
  • 翻訳やパターン憶測を避け、言語構造の有無のみを検証
  • SBERTクラスタリングやマルコフ遷移などを用いた手法を採用
  • サフィックス除去前処理の影響や限界も明記
  • 結果として、未知言語でも言語的構造が観察されたことを示唆

Voynich Manuscript 構造解析プロジェクト概要

プロジェクトの目的と背景

  • Voynich Manuscript(ヴォイニッチ手稿)は 未解読の15世紀写本 で、言語・暗号・人工言語・偽書など多様な仮説が存在
  • 本プロジェクトは NLP(自然言語処理)手法 で「構造的言語らしさ」の有無を検証することを目的とすること
  • 翻訳や意味推測 は行わず、 構造的特徴 (クラスタリング、品詞推定、遷移パターンなど)のみを分析対象とすること
  • 個人の学習目的 で始めたものであり、言語学者・暗号研究者ではないことを明記すること

プロジェクト構成

  • /data/
    • AB.docx:全フォリオ・行タグ付き転写データ
    • voynichese/:サフィックス除去済み根語テキスト
    • stripped_cluster_lookup.json:根語ごとのクラスタID
    • unique_stripped_words.json:全根語リスト
    • voynich_line_clusters.csv:行ごとのクラスタ系列
  • /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/
    • Figure_1.png:SBERTクラスタ(PCA可視化)
    • transition_matrix_heatmap.png:マルコフ遷移行列ヒートマップ
    • cluster_role_summary.csv、lexicon_candidates.csv等:分析結果ファイル

主な技術的貢献

  • サフィックス除去 後の根語クラスタリング(多言語SBERT利用)
  • 機能語的クラスタ内容語的クラスタ の識別
  • マルコフ遷移行列 によるクラスタ系列の構造的可視化
  • フォリオ(セクション)別 の統語構造の比較
  • データ駆動型語彙仮説テーブル の生成

前処理上の重要な選択

  • aiin, dy, chy等のサフィックス的語尾を除去 し根語を抽出すること
    • 目的:反復変化する語幹を抽出しクラスタリング精度を向上させること
    • 仮説:語尾が 音韻的パディング・文法的粒子・呪文的反復・ノイズ 等の可能性
    • 効果:クラスタのまとまり向上・遷移行列の構造化
    • リスク: 形態素情報の損失・有意味な屈折形の消失・機能語偏重のバイアス導入
    • サフィックスを独立トークン扱いする再分析も推奨すること

主な発見(例)

  • クラスタ8 :高頻度・低多様性・行頭出現が多く、機能語的性質を示唆
  • クラスタ3 :高多様性・柔軟な配置、内容語的性質を示唆
  • 遷移行列 :内部構造が強く、ランダム系列とは異なる
  • セクションごとのクラスタ利用・品詞推定パターン に違いが観察される(Botanical, Biological等)

仮説

  • 本写本は 音節パディングや位置的反復を伴う構造的人工言語または記憶術的言語 を符号化している可能性
  • 統語構造・機能語/内容語分離・セクションごとの言語変化 が観察されること

再現手順

  • 依存関係インストール
    • 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

可視化例

  • Figure 1 :SBERTクラスタ埋め込み(PCA次元圧縮)
  • Figure 2 :SBERTクラスタ埋め込み(UMAP次元圧縮)
  • Figure 3 :SBERTクラスタ埋め込み(PaCMAP次元圧縮)
  • Figure 4 :遷移行列ヒートマップ

限界・注意点

  • クラスタと語の対応が間接的であり、 頻度推定が重複する可能性
  • サフィックス除去はヒューリスティック であり、意味的語尾を除去している場合あり
  • 意味的翻訳は一切行わず、構造分析のみ

著者コメント

  • 本プロジェクトは NLPやAIの学習目的 で、「未知の構造的言語」に現代手法がどこまで迫れるかを検証するために実施
  • Voynich Manuscriptの 解読や翻訳を目指すものではなく、構造分析の可能性を示すことが主眼
  • Rosetta Stoneの発見を期待する人向けではなく、構造モデル化に関心のある研究者・愛好者向け

最近の拡張・貢献者への謝辞

  • UMAP・PaCMAP 等の非線形次元削減可視化サポート追加(CLI引数で切替可能)
  • モデルを all-MiniLM-L6-v2からparaphrase-multilingual-mpnet-base-v2 へ大型化
  • MacOS未対応(Windowsのみ動作確認済み)
  • @theElandor:UMAP実装・CLI改善・コード整理の貢献
  • @patcon:PaCMAP/LocalMAP次元削減アルゴリズム実装の貢献
  • コントリビューション・批評・拡張歓迎 (言語学者・暗号研究者・人工言語愛好家・計算言語学者など)

付記

  • 本プロジェクトは NLP学習のために未知・未解読対象へ適用 した実験的試み
  • Voynich Manuscriptは 15世紀の未知文字写本 であり、解読不能・偽書・暗号・人工言語など諸説あり
  • サフィックス除去→SBERTクラスタリング→品詞推定→マルコフ遷移行列 という流れで構造のみを分析
  • セクションごとに 一貫した構造的パターン が観察されたことを強調
  • GitHubリポジトリ:https://github.com/brianmg/voynich-nlp-analysis
  • 詳細解説:https://brig90.substack.com/p/modeling-the-voynich-manuscrip...
  • NLP初心者としての実践例 であり、構造的言語モデリングや特殊ケースに関心のある方からの フィードバックを歓迎

Hackerたちの意見

READMEで見逃したかもしれないけど、「words」の初期エンコーディングはどうやったの?例えば、「okeeodair」って単語があるとしたら、それを元のシンボルにどうやって戻すの?

その通りだよ。「okeeodair」みたいな単語はEVAの音訳ファイルから直接来てて、元のボイニッチのグリフをASCIIの近似にマッピングしてるんだ。だから、グリフそのものを使ってるわけじゃなくて、EVA(ヨーロッパボイニッチアルファベット)システムに基づいた標準化された音訳単語を使ってるんだ。このプロジェクトではグリフに戻すことはしてなくて、すべてEVAの音訳を出発点にしてる。だから、「okeeodair」がデータセットに存在するのは、僕よりずっと賢い誰かが一連のグリフを見て、それをそう呼ぶことに同意したからなんだ。

UMAPやt-SNEがあればいいな、PCAでもきれいに分離できてるけど。各クラスタを他の全てにマッピングするのは、分析に残ってる変動がないことを示すいい方法だと思う。

いいポイントだね、ありがとう。PCAは最初の段階で驚くほどきれいな分離を見せてくれたから、そのまま使ったんだ。でも君の言う通り、UMAPやt-SNEを使えば、もっと微妙なパターン(あるいは失敗ケース)を捉える非線形の視点が得られると思う。そして、クロスクラスタの参照アイデアにも賛成だよ。クラスタ間の類似性マトリックスは作ってないけど、君が言ったことで、どれだけの信号が本当にキャッチされているのかをテストするのが明らかに次のステップに感じる。フォローアップとしてそれをやってみるかもしれない。考えさせてくれてありがとう。

PCAでいい分離が得られたときは、個人的にはUMAPを避ける傾向があるんだ。なぜなら、すべてのポイントの相対的な距離が解釈しやすいから。t-SNEは絶対に避けるよ、あのプロットの距離はほとんど意味がないから。(怒られないように言っておくけど、これは強制的なものじゃなくて、個人的な好みだよ。)

このリファレンスマッピングがどのように行われるかの例はありますか?異なるモダリティの埋め込みに興味があるんですが、NLPの経験はあまりないんです。

これが最も興味深い仮説の一つだと思ってる:http://voynichproject.org/ 著者はボイニッチ語がゲルマン語だと仮定していて、いくつか進展があったみたい。ウラル語族やフィン・ウゴル語族の可能性があるという話も聞いたことがある。君のアプローチは素晴らしいと思うし、特定の言語ファミリーに合わせて調整すれば、さらに進展があるかもしれないね。

このスレッドでは、いくつかの「解決策」が議論されていますね:https://www.voynich.ninja/thread-4341.html ベルンホルツのサイトはいいけど、チャイルドの研究は実際にMSを解読するのにはあまり役立たないですね。

エドワード・ケリーは、まさにその時その場所にいたんだよね。何年も前に読んだ記憶があるんだけど(今はそのソースが見つからないけど)、彼がカルダン・グリルに詳しかった証拠があったんだ。それが彼が著者である可能性が高いと納得させるのに十分だったし、その本はいたずらか詐欺を意図していたと思う。1. https://en.wikipedia.org/wiki/Edward_Kelley 2. https://en.wikipedia.org/wiki/Cardan_grille

この写本が解読不可能なことを考えると、私の個人的な理論は、これは素朴なアーティストの作品で、背後に言語はないというものだと思う。言語のルールを知らずに言語を真似しているだけの誰かだね: https://en.wikipedia.org/wiki/Naïve_art これは精神的な問題ではなく、ただ起こることが稀なことなんだ。ボイニッチは素朴なアーティストの作品としてはぴったりだよ。

ここで使われているテキスト埋め込みモデルはparaphrase-multilingual-MiniLM-L12-v2(https://huggingface.co/sentence-transformers/paraphrase-mult...)で、約4年前のものなんだ。NLPの世界では、これは実質的に古いもので、特に小さな埋め込みモデルの堅牢性がグローバルなLLMの改善によって情報表現や埋め込み空間での独自性が劇的に向上しているから。多言語サポートのために明示的に訓練されていない現代のテキスト埋め込みモデルでも、そのタイプのデータには非常にうまく機能するから、比較的知られていない言語であるボイニッチ手稿にはより良い結果が得られるかもしれない。接尾辞を取り除いたり品詞を特定したりする従来のNLP技術は、実際には埋め込みの質を改善するどころか悪化させる可能性があるんだ。なぜなら、それがグローバルな埋め込みから関連する文脈データを取り除いてしまうから。

それは完全に正しいね。速度と広い互換性のためにparaphrase-multilingual-MiniLM-L12-v2をデフォルトにしたけど、君の言う通り、今の基準では古いよね。all-mpnet-base-v2やtext-embedding-ada-002がどう動くのか見てみたいな、特に接尾辞を残して、ルート形に減らすのではなく、完全な文脈埋め込みに傾けた場合は。指摘してくれてありがとう、これは次のステップへの素晴らしい推進だね。

PCAプロジェクション内のクラスタを探しているみたいですね -- PaCMAPやLocalMAPのような新しい次元削減アルゴリズムを使って、もっと深い構造を探してみて!僕はPol.isという意味づけツールに関連するプロジェクトに取り組んでいて、PCAの代わりにこれらの新しいアルゴリズムでウィキ調査データを再投影しているんだけど、すごく新しい洞察が得られるんだ! https://patcon.github.io/polislike-opinion-map-painting/ 塗りつぶされたグループ:https://t.co/734qNlMdeh (ごめん、デスクトップでしかうまく動かない)[1]: https://www.technologyreview.com/2025/04/15/1115125/a-small-...

指摘してくれてありがとう — PaCMAPやLocalMAPは前に見たことがなかったけど、確かにこのデータにはPCAよりも適した構造を保つアプローチのように見えるね。教えてくれて感謝!もう少し掘り下げてみるつもり。

埋め込みの削減には、PCAやt-SNEよりもUMAPの方がずっと良い結果が出てるよ。

TDA(「マッパー」、あるいはカーネル密度計算接続に基づく何か)を試してみて、全く新しい世界が広がるよ。これは親の時代の「因子分析」じゃないからね。

LLMモデルの解釈可能性も、概念表現を見つけるためにスパースオートエンコーダーを使っているよ(https://openai.com/index/extracting-concepts-from-gpt-4/)、最近では線形プローブも使われている。

(NLPについては何も知らないけど)コントロールグループでプロセスをチェックするのは意味があるかな?例えば、人間に言語に似たけど実際にはそうでないものを書かせて、その後このプロセス(接尾辞を取り除く、グループ化を試みるなど)を行った場合、似たような結果が得られる可能性は高いかな?

そうそう、なんで100人にボイニッチ写本を書かせて、そのデータセットで学習しなかったんだろうね。

もしどうやって書かれたかについての仮説があるなら(例えばカルダン・グリル法)、その方法でいくつかのテキストを生成して、同じ特徴が現れるか見てみるのもいいかもね?

もしあれがただのナンセンスで、暗号でもない手書きの本だとしたら、ページ1から最後のページまでスタイルや書体、使われている言葉、さらには文字自体が進化するはずだと思う。もちろんページの順番は入れ替えられるかもしれないけど、それでも気づくべきことはあるはず。著者がそれと全く同じような本を何十冊も書いていて、それが残っていなかった場合を除いてね。あまり新しいアイデアだとは思わないけど、そういうパターンの分析があるのか気になるな。ページごとの一貫性についてはどこでも言及を見たことがない。

ページ間の一貫性についての言及をどこでも見たことがないな。ここにはかなりの作業がなされていると思う。2人の書記がいたと考えられているけど(Prescott Currierを参照)、Lisa Fagin Davisは5人だと提唱している。Fagin Davisの立場に基づいた実験の議論がここにあるよ: https://www.voynich.ninja/thread-3783.html

15世紀のものであれば、テキストを暗号化する明らかな理由は「異端審問」(や当時の他の宗教に基づく暴力)から宗教的迫害を避けるためだったよね。だから、同じNLPを福音書に対して実行して、その相関関係を探るのは面白いと思う。まずは「単語」ベースの比較をして、その後「文字」ベースの比較をしたいね。聖書のグラフとボイニッチのグラフを比較する感じ。混乱させるためだけに存在する文字もあるかもしれない。例えば、複数のバリエーションがある奇妙な大文字の「P」のようなものは、実際の言語を表すにはあまりにも頻繁に現れるように見えるから、単に解読前に削除されるオブフスケーターかもしれない。他にも異常に「頻繁」な文字があって、それも使われていないダミー文字かもしれない。でも「Pが多すぎる」問題は、純粋なフィクションにも当てはまることに気づいたよ。

これはとても興味深いね。https://www.voynich.ninja/index.phpへのリンクを投稿した方がいいよ。SBERTや現代の統計的NLPには詳しくないけど、SBERTは文に対して働くし、ボイニッチ写本には明確な文の区切りがない(単語と段落の区切りだけ)。私が心配しているのは「ボイニッチの単語から一般的な接尾辞を取り除く」ということ。ボイニッチ写本の単語は接頭辞 + 接尾辞のように見えるから、接頭辞がかなり短いと、分析を始める前におおよそ半分の情報を失ってしまうんだ。あなたの方法が自然言語の意味のあるテキストでも、意味のないナンセンスでも機能するか確認した方がいいかも(暗号化テキストはその中間にあって、簡単な暗号化方法は自然言語に近く、より複雑なものは意味のないナンセンスに近い)。ゴードン・ラッグ、トルステン・ティム、そして私自身が、異なる方法でボイニッチ写本に非常に似たテキストを生成したことがあるよ。私のはここにある: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.h... そして同等のEVAはここにある: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.t...

原稿をちょっと見てみたんだけど、ページのイラストに対して文字がすごく詰まってるのが怪しいなって思ったんだ。普通の言葉では、文字の幅がバラバラだから、書いてるときに行の終わりに近づくと自然に改行して新しい単語を書き始めるよね。でも、その原稿にはそういう改行が全然なくて、行の終わりに無理やり文字を詰め込んだようなところがたくさんあった。行の改行の前後にどんな文字があるか分析してみたかったけど、転写されたバージョンが見つからなかった。素人の私の見解では、これは凝ったアート作品か、あるいはイタズラだと思う。

いくつかの言語では、行の終わりで単語を分けることでこれをやってるよね。