ごはんをたべよう

おいしいご飯を食べよう

Mathematica でヴォイニッチ手稿を解析しようとした話

ヴォイニッチ手稿( -しゅこう、ヴォイニッチ写本ヴォイニック写本とも、英語: Voynich Manuscript)とは、1912年イタリアで発見された古文書写本)。未解読の文字が記され、多数の奇妙な絵が描かれている事が特徴である。

Wikipedia日本語版

ちょっと前に,Gigazineで見かけたことあるなと思ったら,この記事だった.

gigazine.net

なんでも暗号の権威が解読に挑んだけど,失敗したような代物らしい.間違いなく錬金術とか,失われた人類の文明的な内容が書き込まれてるに違いない.

そんな代物を解読したいという高い志を持った奴が現れた.*1

 

とりあえず,文字認識かなと思ったのでOCRをすることに.

f:id:tanomotoki:20160630212733p:plain

一応 Mathematica には組み込みでOCRする関数が用意されている.

ヘルプページの例が酷いのは置いておいて,これは組み込みの言語以外は認識させることはできない.*2

今回は機械学習と画像解析を組み合わせてOCRを組み立てることにした.

font

まずは,ヴォイニッチ手稿に登場する奇妙な文字を認識させるための下準備として,ヴォイニッチフォントをインストールしておく.

これを表示言語にするだけで,なんだか失われた文明の生き残りな感じがして好き.*3

f:id:tanomotoki:20160630214209p:plain

最初にアスキー文字のリストを作っておく.CharacterRangeで文字の範囲をとって,それをJoinでつなげているだけ.

途中で文字を飛ばしているのは,ヴォイニッチフォントにその文字がなかったから.ヴォイニッチフォントはアルファベットに無理に文字を当てはめてるだけらしいからしょうがない.

f:id:tanomotoki:20160630214508p:plain

あとはフォントをラスタライズして画像にしたものと,対応するアスキー文字のリストをつくるだけ.

余談だけど,Mathematicaのラムダ関数は直感的で好き.項書き換えの記号に # を使うのはかっこいいよね.

f:id:tanomotoki:20160630214825p:plain

あとはこれまた組み込みで用意された機械学習を使うだけ.関数一個呼び出すだけで分類器を勝手に作って返してくれる.

メソッドはロジスティック回帰だったりニューラルネットだったり,好きなのを使える.めんどくさい人は指定しなければMathematicaが適当に選んでくれる.

f:id:tanomotoki:20160630215243p:plain

次にOCRする画像を準備する.

エディタに直接画像をドロップしてもいいし,Import関数を使って好きな場所から読み込んでもいい.今回は適当なものをブラウザからドロップした.

二値化して,画像を要素成分で分割する.

reference.wolfram.com

ImageForestingComponentsは,画像森林化変換(image foresting transform, IFT)の適用を通して得られた整数配列を返す.この変換は,画像を,それぞれが「同じような」色を持つ画素の指標付きの成分に「分割(分離)」する手法を与える.画像森林化変換は,近傍画素の色の類似性に比例する重みを持ったエッジを繋いでグラフを構築し,次にこのグラフを分割することで行われる.

 画像森林化変換は,画像を処理してジャングルにする類のものではなく,画像から骨格を得るアルゴリズムのことらしい.

他にも画像のクラスタリングに使える関数はたくさんあるけど,いろいろ試した感じこれが一番性能がいい気がする.

f:id:tanomotoki:20160630220207p:plain

 あとはこれをさっき作った分類器にかけるだけ.

ノイズを除去するために大きさが10以上のものだけを抽出している.結果はうまく出てるように見えるが,よく見るとほとんど見当違いの答えばっかり出している.

学習データが圧倒的に少ないのが主な要因なので,最初のヴォイニッチ文字をラスタライズするところで傾けたり,大きくしたり小さくしたりしてたくさんパターンを作るといいかもしれない.

 

さあ学習器の精度をあげるかと思ったところで,ふと思ってWeb検索してみた.

Voynich Manuscript - transcription

私が半年かけて完成させたVoynich Manuscript全ページの写し換えたデータです。今まで行われてきたものよりも正確かつ使いやすいものであると自負しております。約38,000単語(約二十万文字)からなります。

やっぱりな,そういう気がしてたんだ.

OCRの必要はないみたいだよ?*4

*1:ラーメンマンって周囲から呼ばれてる

*2:イリノイ工業とかいう微妙なラインのセンス

*3:もれなくなにも読めなくなって失われた文明のコンピュータになるからやめとこう

*4:先に調べてから取り組もう