これまで説明した、prologを自然言語処理に用いる手法を少し応用することを考える。一例として、wikipediaの「芸人」という項目冒頭にある次のような文章への応用を念頭におく。
「芸人とは、なんらかの技芸や芸能の道に通じている人、または身に備わった技芸や芸能をもって職業とする人のことを指す日本特有の概念である」
これを、これまでの記事を踏まえた形で、直感的な形でprologの宣言文にする。括弧がネストしているので、タブでその関係を表現する。基本的に、すべてオペレーターをoperator、項目をpredic_x,predic_yとすると、
operator(predic_x, predic_y)
という形になっている。二分木(Binary Tree)である。
芸人のwikipedia表現したんは、prologで次のように表される。
とは( 芸人, ところの( を( または( いる( に( の( や( の( なんらか, 技芸 ), 芸能 ), 道 ), [通じて,通じる] ), 人 ), の( と( て( を( や( た( に( 身, [備わっ,備わる] ), 技芸 ), 芸能 ), [もっ,もつ] ), 職業 ), する ), 人 ), こと ), 指す ), の( 日本特有, 概念 ) ) )
かっこの対応関係が複雑で、何度も修正した。でも、最終的にprologのコンパイルに成功した。
washida:~/Project/Prolog $ swipl -f geinin.swi Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4) SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software. Please run ?- license. for legal details. For online help and background, visit http://www.swi-prolog.org For built-in help, use ?- help(Topic). or ?- apropos(Word).
エラーがないではないか!!と敢えて書きたくなるくらい何度も失敗した(笑)。結局、かっこの対応関係の問題であって、基本的なフレームに差し障りがなかったのだ(かっこの対応関係のチェックは netbeansでやった)。文章をほとんどそのまま、prolog化できるというのは、とても重要なことである。
?- listing. してみると次のように、インデントが取れた形で組み込まれている。
とは(芸人, ところの(を(または(いる(に(の(や(の(なんらか, 技芸), 芸能), 道), [通じて, 通じる]), 人), の(と(て(を(や(た(に(身, [備わっ, 備わる]), 技芸), 芸能), [もっ, もつ]), 職業), する), 人), こと), 指す), の(日本特有, 概念))).
素晴らしい(ほぼ自画自賛)。
クエリ(問い合わせ)もしてみる。「芸人とはなんですか?」
?- とは(芸人,X). X = ところの(を(または(いる(に(の(や(の(なんらか, 技芸), 芸能), 道), [通じて, 通じる]), 人), の(と(て(を(や(た(に(..., ...), 技芸), 芸能), [もっ, もつ]), 職業), する), 人), こと), 指す), の(日本特有, 概念)).
ちゃんと答えてくる。ただし、述語をそのまま出していることと、..., ...の部分が省略されていることが気になる。述語をそのまま出していることについては、これからなんとでもなるだろう。述語を日本語に変換するシステムは難しくない気がするから。
先の宣言文に戻って、説明すべきことを付け加えておこう。あくまでもこれは、私が直感的に(日本語を使っている私の感覚での意味)変換した。(システマティックな変換については、次の記事にもちこそうと思っている。)
(1)三つのリストが加わっている。 [通じて,通じる]、[備わっ,備わる]、[もっ,もつ]の動詞については、使われている表現系の他に、原型を次に示しておいた。これについては、活用形をすべてリスト化するつもりでいる。また、直接的な形容詞や副詞なども、関連語とともになんらかの形で、リスト化する予定である。
(2)本来の文書にはない「ところの」という、英語の関係代名詞的なこのを付け加えて、整理している。その辺りが、日本語の曖昧さの無視できないところで、実際のwikipediaのテキストからprolog述語にするときに、こういう処理も必要になるのではないかと考えている。
prologは、リスト処理の強みも持っているので、名詞や動詞もなんらかの形でリスト化する、不可分の言葉をリストで処理するなどの、システマティックな使いからを考えていきたい。
構文解析をもとに、prolog化することについては、次の記事にする。