ヴォイニッチ手稿について

ヴォイニッチ手稿ハッカソンという謎のイベントが開催されるので主催でもなんでもないけど勝手にそれ向けの資料をまとめていく。

計算言語学の論文を書いた時に、ネタでVoynich manuscriptとRongorongoも一緒に計算対象にしたりして、サーベイをしたのでその時の知見をまとめて行く。書いた論文は別に未解決文字にフォーカスした論文ではなく面白いかどうかはわからないけどかなり真面目な内容の奴なのであしからず。

## voynich maniscriptとは

謎の文字と気持ち悪い絵がいっぱい書かれた変な本。何らかの未知言語で書かれているかもしれないし、適当にそれっぽく作って詐欺に使われた道具かもしれない。個人的には、アラビア語系の言語で書かれたなんらかの文書をもとに適当に作ってそれっぽい絵を付けた美術品だと思ってる。

以下のページが、これまでの歴史的経緯について詳しい

- http://www.voynich.com/voynich2.htm


## 既存研究とか

サーベイ論文としては以下の物がよくまとまっている。ラストオーサーはなんと元Association for Computational Linguistics会長のProf. Kevin Knight.。


- Reddy, S. and K. Knight. 2011
  - What we know about the Voynich Manuscript.
  - ACL Workshop on Language Technology for Cultural Heritage, Social Sciences, and Humanities, Portland, OR.
  - http://www.isi.edu/natural-language/people/voynich-11.pdf

## 最近の研究等

- Montemurro, M. and D. Zanette. 2013.
  - Keywords and co-occurrence patterns in the Voynich Manuscript: An information-theoretic analysis
  - PLOS One. doi: 10.1371/journal.pone.0066344.
  - http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0066344

- Tanaka-Ishii, K. and  Aihara, S. 2015
  - Computational Constancy Measures of Texts—Yule's K and Rényi's Entropy
  - (doi: 10.1162/COLI_a_00228)
  - http://www.mitpressjournals.org/doi/pdf/10.1162/COLI_a_00228
      - http://dl.acm.org/citation.cfm?id=2847426
  - 自分が参加した奴


## Voynich Manuscriptについて分かっていること

### 単語

分かち書きされており、単語的なものの並びになっている。

### (おそらく)6つのセクションからなっている

記載されている絵が異なることから, 以下の6つのセクション(テーマ？)から構成されていると考えられている

- Herbal
- Astronomical
- Biological
- Cosmological
- Pharmaceutical
- Stars

### (おそらく)２つの言語的な物で記述されている

Currier (1976)は, 文字や部分文字列の出現頻度の違いから, 2つの異なった`言語`で記載されているのではという仮説を立てている. 2状態のbigram HMMを用いても, 単語レベルで２つの単語クラスに分割できる.

前述のセクションでは、BiologicalとStarsのセクションが主に`言語`Bで記述されており、残りは`言語`Aで記述されている。一部記述言語が不明なページもある。


### 母音と子音があるか

HMMで分析すると、英語だと母音と子音はきれいに分かれるらしいが、Voynich Manuscriptでは母音が単語の最後にのみ出現するという結果になったらしい。それは果たして母音なのか。adjab系の言語だと母音は基本記載されないので、adjab系の言語という風に考えることができる。表示文字・表語文字の可能性もある。全然適当な何かかもしれない

### 単語に含まれる文字長の分布がアラビア語等と似ている

文字数の分布はアラビア語と似ている。つまり、単語には前置詞がついて格変化(ついでに性別の文字)的なものが付いている可能性がある。

### 単語分布はべき分布する

単語の出現頻度がZipf分布するかというのは単語頻度・ランクの両対数プロットを目で見れば分かるんだけど数値的にZipf分布の計数を推定するのは難しい. ある文書長の時点での単語の異なり数(0次エントロピー)と2次のRenyiエントロピーで両対数グラフにプロットすると、出現分布のzipf exponentを1.3にしてランダムに生成した系列と同程度の位置にプロットされ、ちょうどタイ語とアラビア語の中間程度(abugidaやabjad系言語の周辺)に位置している。

### エントロピーとか

bigramのエントロピーを見ると、完全にランダムな記号の列ではない様子。ただ繰り返しが多い事から、bigramのシャノンエントロピーは他の言語に比べ低い値となっている

### 共起について

有意に共起する単語集合や、テーマに有意に出現する単語は存在するらしい。隠れ変数モデルを用いてトピック的な物を抽出することもやられている。

word2vecを用いて単語埋め込みを行ったところ、２つの大きなクラスタが観測できたり(2つの言語を含んでいることの傍証)、t-SNEでの次元削減を行って、二次元空間にマップしたところ、絵の注釈から星名と考えられる単語群が、空間上で近傍に配置された等の報告もある。　

- http://blog.christianperone.com/2016/01/voynich-manuscript-word-vectors-and-t-sne-visualization-of-some-patterns/

### 文法について

....

## コーパス

voynich maniscriptの文字をアルファベットと記号で記述したtranscriptionが公開されいている。

- http://www.ic.unicamp.br/~stolfi/voynich//98-12-28-interln16e6/

`http://www.ic.unicamp.br/~stolfi/voynich//98-12-28-interln16e6/text16e6.evt.gz`をダウンロードして、解答して出てきた`text16e6.evt`がtransctiptionが記載されたテキストファイル。

複数のtranscriptionが書かれているが、とりあえずFを利用すると良さそう。

### 適当にparseする

```parse.py
# -*- coding: utf-8 -*-
import sys
import re

LANG_B = ["<f26", "<f31", "<f33", "<f34", "<f39", "<f40", "<f41", "<f43", "<f46", "<f48",
          "<f50", "<f55", "<f57", "<f66", "<f75", "<f76", "<f77", "<f78", "<f79", "<f80",
          "<f81", "<f82", "<f83", "<f84", "<f85", "<f86", "<f94", "<f95", "<f103", "<f104",
          "<f105", "<f106", "<f107", "<f108", "<f111", "<f112", "<f113", "<f114", "<f115", "<f115"]

LANG_UNK = ["<f12", "<f59", "<f60", "<f61", "<f62", "<f63", "<f64", "<f65", "<f67", "<f68",
            "<f69", "<f70", "<f71", "<f72", "<f73", "<f74", "<f91", "<f92", "<f97", "<f98",
            "<f101", "<f109", "<f110", "<f116"]


PIC_PATTERN = re.compile(r"-{[^{}]+}")

"""memo
-: 行末(画像が挟まれた場合も-を入れる)
=: 段落終了
.: 単語境界
,: 単語境界

-と=の直後に出る{[^{}]+}は文の途中もしくは前後に挿入されている画像を表す

"""


if __name__ == "__main__":
    for line in sys.stdin:
        line = line.strip()
        if line.startswith('#'):
            continue
        else:
            lang = ""
            # 言語B
            if any([line.startswith(x) for x in LANG_B]):
                lang = "B"
            # 言語?
            elif any([line.startswith(x) for x in LANG_UNK]):
                lang = "UNK"
            else:  # 言語A
                lang = "A"
            ret = re.match(r'^<(\w\d+\w\.\w\.\d+;F)>(.+)$', line)
            if ret:
                meta = ret.group(1).strip()
                sentence = ret.group(2).strip()
                pics = [re.sub("[-{}]", "", x) for x in PIC_PATTERN.findall(sentence)]
                print(meta, lang, sentence, pics)

```

こんなんで適当にパース出来る。

```
cat text16e6.evt| python parse.py
```

単語への分割は, "-"、"="、","、"."でsplitすれば良い。"{}"で囲われているものは全て削除するのがよいかもしれない。ページ毎のテーマに関する情報が抜けているのでそこも抽出すると良いかもしれない。ダルいけど。


スキャンされたPDFの物も存在する。入手は以下から

- http://awesta.sibirjak.ru/files/Voynich.pdf
- https://www.dropbox.com/s/8bz5dxxd2u4gg2x/Voynich%20Manuscript.pdf


## 計算言語学的な見地でのハッカソンのテーマ

とりあえず掛けて見た系でもなんか面白い結果が出るかもしれない。ここ3年ほどこの業界から離れているのでだいぶ進歩があるかもしれないけれど、基本baysian系の教師なし学習がハマりそうという考えがある。

### pos tagging

単語に品詞的な文法範疇的なものがあるかどうか。baysian pos taggingに掛けて見るであったり、latent word language modelのような、可変長文脈において出現が類似する語の列挙などをしてみる。問題は行・段落の境界やトピック、ページの境界はわかっているが、文境界がわからないことなのでエイヤになる。web上にはword2vecに掛けてt-SNEでプロットした人もいた。

- lwlm
  - http://chasen.org/~daiti-m/dist/lwlm/

いけてる教師なしpos taggerはなんかあるんだろうか。ベイジアン単語分割をガリガリやってたSharon Goldwaterが結構前に論文書いてた気がするしどっかに転がっていてもおかしくない。

### parsing

文法構造的なものがあるかどうか見てみる。Mark Johnsonの教師なしPCFGコードなんかは普通に転がっていて、そのアルゴリズムの評価もコーパスがない少数話者言語の小規模データの分析で評価していたのでちょうどよいかも。時間中に収束しないかもしれない。これも文境界の問題がある。


- Open-source software written by Mark Johnson
  - http://web.science.mq.edu.au/~mjohnson/Software.htm


PCFGじゃなくてTree-adjoining grammarだったりCombinatory categorial grammarの教師なしパーザを探すのもよいだろう。non-projectiveだったらどうするんだろう。non-projectiveな依存文法の教師なし奴の良い実装とか有るんだろうか。

### topic modeling

トピックモデリングに掛けてトピックを可視化してみる。6テーマに関するトピックが現れるかどうかを、gensimのHDPにかけてpyLDAvizで可視化してみるとかはお手軽でよいかも。現実の文書群でもトピックモデルがそんなにきれいに収束はしないので、面白い結果が出るかどうかは微妙だと思う。出力がキャッチーなのでよいかも程度。

- gensim
  - https://radimrehurek.com/gensim/
- pyLDAviz
  - https://github.com/bmabey/pyLDAvis

### word segmentation

文境界の問題はあるけれど、これが一番の面白いテーマかも。もともとのvoynich manuscriptは、おそらく分かち書きされた言語であると見た目からは考えられるが、そこをすべてつなげたうえで、教師なし単語分割に掛ける。もし、元の単語の並びが意味のあるものであった場合、もとの単語境界と類似する結果が出ると思われる。アラビア語系の言語なのだとしたら冠詞や接尾辞の分割などが観測できるかもしれない。(HPYLMのアラビア語単語分割の報告では、冠詞や接尾辞は分割されてなかったけど。)

- latticelm(HPYLMで教師なし単語分割する一番信用できる実装だと思う)
  - http://www.phontron.com/latticelm/index-ja.html

### その他

画像とテキスト両方を扱うなどもネタとしてはよいかもしれない。はやりのCNNとRNN(+LSTM)で画像とテキストの学習など。データ作るの大変だけど。もっとぶっとんで、voynich manuscriptから音楽を生成するとかそういうメディアアートっぽいことやってほしい。

## おまけ

rongorong関係のスクリプト

- https://gist.github.com/shunsukeaihara/6448394

インダス文字も、結構論文出てる。ワシントン大学の人がPNASやらPLoS Oneに出したりしてる。自分の論文でもインダス文字のコーパスゲットしようとインドのどっかの研究センターにコンタクトとったけど普通に断られたのでまだデータを見れていない。

- http://homes.cs.washington.edu/~rao/indus.html



### 終わりに

結局言語らしいという統計的なエビデンスはどんどん出てきて、よしんば何らかの人間が理解できる情報が記載されていたとしても、既存の言語と結びつけて翻訳するにはロゼッタストーンが必要なんやで。あと線文字Aもいろいろ遊んでみたいけどtranscriptがなさそうだったんであきらめてる。ある場所知ってるとかあれば教えてください。