prologと自然言語解析

ニューラルネットワークを基にしたシステムでは、word2vecくらいしか、役に立たなかった。word2vecはとても優れているが、結局、言葉を低次元ベクトルに変換し、言葉の親近度を計るところまでである。

結局、例えば、wikipediaのデータ、情報を知識化するのにはそう言う、ネットワーク系のシステムでは対応できない気がして悩んだ。

なぜ対応できないのか、とどのつまり、言葉がロジック、論理であって、画像認識のような直感的なものとは異なるからなのだ。人間が直感的にやっていること、例えば、画像認識以外にも、将棋や囲碁の形成の判断のようなものには、人間を上回る力を発揮する。しかし、言葉は違う。直感があったとしても、ベースには論理がある。逆かもしれない。直感をベースにした論理というべきか。

wikipediaのデータも、すべて、「論理的な言い換え」、「極端に複雑なトートロジー」である。これを表現するのにふさわしい言語は、論理型の言語だと思った。そして、prologに至った。

prologは、古い、カビの生えたような言語だ。何しろ、私が神戸大学の大学院経済学研究科の最初のゼミで、発表したのがprologを使って経済データのトレンドを判定する、しかも単純に上昇か下降かだけだが、そんな結果を発表するために使った言語だ。指導教員にダメ出しをされて、すぐにその方向はやめてしまったが。それは正しい判断だった。そんなものに使うべきではない。

例えば「ニワトリは卵を生む」という知識があったとしよう。これを、「ニワトリの卵」という表現が正しいかどうかを調べることができる知識に変換することを考える。

(prologは、swi-prologを使用する。Macの場合、brew install swi-prolog で、簡単にインストールできる。)

2 ?- [user].
|: の(X,Y) :- 産む(X,Y).
|: ^D
% user://1 compiled 0.00 sec, 1 clauses
true.

3 ?- [user].
|: 産む(ニワトリ,卵).
|: ^D
% user://2 compiled 0.00 sec, 1 clauses
true.

3 ?- の(ニワトリ,Y).
Y = 卵.

4 ?- の(ニワトリ,卵).
true.

5 ?- 

となる。?-がprologのプロンプトで、[user].は、論理や宣言をプロンプトから付け加えるための、疑似ストリームである。「ニワトリは卵を生む」を
産む(ニワトリ,卵).
という宣言に変換している。
そして、〇〇の〇〇という表現は可能になれば、trueが帰ってくるというわけである。

ここでは、「の」という助詞と、「産む」という動詞をoperatorにしているが、「は」とか「で」なんかも、そのようにして、文章が含意している知識を定式化したいと思うわけだ。

wikipediaの 本文データのほとんどを、prologの宣言とルールに変換できないかというのが、今、考えていることの中心点である。