二人完全情報ゲームなど特定分野に限ればソフトウェアが人間の能力に匹敵あるいは凌駕することが分かったと思う。しかし、分野を限定せず、幅広い事象に対して知性的に振舞えるような能力を持たせるためにはどうすればよいだろうか? 人工知能の分野では、そういった目的のための基礎的研究が初期から行われてきた。
コンピュータにより汎用的な処理をさせる場合、プログラム自身が一般的な問題に関する知識を持てるようにする必要がある。そのためには知識をコンピュータに理解できる記号的な形で表現する必要がある。
知識をどのように表現し推論や問題解決に応用することができるかは、人工知能分野の基本となる問題で 知識表現 (knowledge representation) と言われる。
人工知能研究で出てきた代表的な知識表現とその利用の枠組みを学習する。 代表的なものに意味ネットワークと知識フレームがあるが、今回は意味ネットワークについて概観し実習により理解を深める。
意味ネットワーク (セマンティックネット semantic network) は 1960年代に Ross Quillian (ロス・キリアン) の研究で注目を浴びたもので、知識をノードとリンクからなる 有向グラフ で表現する。
ノードは「概念」「事柄」「物」「状態」などを表す。ノードには「名前」が付けられており、意味ネットワーク中で名前の重複するノードを持たないようにする。
リンクはノード間の関係とその方向を表す。リンクにはその種類を表すラベルが付いている。
意味ネットワークで用いられるリンクは自由にラベルを付けて利用できるが、重要なリンクとして is-a ラベル がある。
ノードの概念の包含関係を表すもので、
A is-a B
というリンクがあるとき、A=下位概念・B=上位概念であり、「A は B の一種である」つまり、A は B でもあるが、A は B より特殊化されたもの (B は A より一般化されたもの) であることを意味する。
is-a リンクによるネットワークによって、ノードの階層的構造が表現される。
また、部分・所有などを表すリンクとして has-a ラベル がある。
あるノードが部分・物・状態・属性などを持つことを表す。
A has-a B
というリンクがあるとき、「A は B を持つ」「A は B という属性を持つ」「A は B という状態である」ことを意味する。
継承
is-a リンクで結ばれた「A is-a B」において B の持つリンクは A にも継承される。
![]() |
図1 is-aリンクによる継承の例 |
人間は顔を持ち、太郎は人間なので、太郎は顔を持つ。
例
楽器の知識の一部を意味ネットワークで表現してみる。
管楽器は楽器である。 木管楽器は管楽器である。 ファゴットは木管楽器である。 ファゴットはアルト音域を受け持つ。 ファゴットはテナー音域を受け持つ。 ファゴットはバス音域を受け持つ。 金管楽器は管楽器である。 金管楽器は真鍮などの金属でできている。 トランペットは金管楽器である。 トランペットはソプラノ音域を受け持つ。 トランペットはアルト音域を受け持つ。 トロンボーンは金管楽器である。 トロンボーンはアルト音域を受け持つ。 トロンボーンはテナー音域を受け持つ。 トロンボーンはバス音域を受け持つ。 チューバは金管楽器である。 チューバはテナー音域を受け持つ。 チューバはバス音域を受け持つ。
概念の階層関係は is-a リンクを使って表現する。
管楽器 -is-a→ 楽器
木管楽器 -is-a→ 管楽器
ファゴット -is-a→ 木管楽器
のようなリンクとなる。
金管楽器は真鍮などの金属でできている。
は has-a リンクを使って
金管楽器 -has-a→ 真鍮などの金属
のように表せる。 このとき、トランペット・トロンボーン・チューバは金管楽器であり、管楽器であり、楽器である。(is-a による階層関係)
トランペット・トロンボーン・チューバは金管楽器であるので、金管楽器で有効な「真鍮などの金属でできている」という has-a リンクがトランペット・トロンボーン・チューバにおいても有効になる。
音域も has-a リンクを使って表現してもよいが、独自に has-range というラベルを用意し、
トランペット -has-range→ ソプラノ
のように表現することにする。
意味ネットワークを実習できるプログラムを用意したので、これを用いて簡単な演習を行う。
意味ネットワークの構築
このプログラムではリンクを追加していくことでノードとリンクを定義し、意味ネットワークを構築する。 リンクで使用されるノードおよびラベルは自動で生成される。
リンクの追加は以下のように行う。
// 管楽器は楽器である。 sn.addLink("is-a", "管楽器", "楽器"); // ファゴットはダブルリードを持つ。 sn.addLink("has-a", "ファゴット", "ダブルリード"); // ファゴットはアルト音域を受け持つ。 sn.addLink("has-range", "ファゴット", "アルト");
リンクのラベルは第一パラメータの文字列によって指定する。第二パラメータのノードから第三パラメータのノードにリンクが張られる。
上のリンクの追加によって、ノード「管楽器」「楽器」「ファゴット」「ダブルリード」「アルト」が自動で生成される。
必要なだけ上のような定義を追加して、意味ネットワークを構築すればよい。
問合せ
構築した意味ネットワークに対して質問をして回答を得る。
問合せもネットワークの形で表現する。例えば、
テナー音域を受け持つ楽器は何か?
という質問なら
query.addLink("is-a","?何","楽器"); query.addLink("has-range","?何","テナー"); sn.doQuery(query);
のようにする。
「?何」のように ? で始まる名前は問い合わせる変数を表す。
ダブルリードを持つ楽器が何で、それがどの音域を担当するか?
という質問なら
query.addLink("is-a","?何","楽器"); query.addLink("has-a","?何","ダブルリード"); query.addLink("has-range","?何","?音域"); sn.doQuery(query);
のようになる。
「?何」と「?音域」が問い合わせる変数を表す。
※ 演習のプログラムでは、ノードやリンクのラベルの一致を単なる文字列比較で行っている。そのため、人間が同一と見なすノードやラベルでも、大文字・小文字の違い、スペースの有無、半角文字・全角文字の違いなどで異なるものとして認識されることに注意すること。
例えば、問い合わせる変数を表す ? は全角文字ではいけない。
上の演習と同じ場所にある
SnAnimal.java
を開き、以下の知識を意味ネットワークとして構築し、その下の問合せをするプログラムを作り、コンパイル・実行させ、出力を確かめなさい。
なお、is-a リンク以外のリンクについては、「足の数」と「飛べる・飛べない」についてはそれぞれ独自のラベルを作ってリンクを表し、その他の性質は has-a リンクで表しなさい。
知識
哺乳類は動物である。 哺乳類は肺呼吸をする。 鳥類は動物である。 鳥類は肺呼吸をする。 爬虫類は動物である。 爬虫類は肺呼吸をする。 両生類は動物である。 両生類は肺呼吸をする。 両生類はえら呼吸をする。 魚類は動物である。 魚類はえら呼吸をする。 魚類には足がない。 ライオンは哺乳類である。 ライオンは4本足である。 象は哺乳類である。 象は4本足である。 犬は哺乳類である。 犬は4本足である。 人間は哺乳類である。 人間は2本足である。 カモノハシは哺乳類である。 カモノハシは4本足である。 ワニは爬虫類である。 ワニは4本足である。 カエルは両生類である。 カエルは4本足である。 鳥類には翼がある。 鳥類は2本足である。 カモメは鳥類である。 カモメは飛べる。 ツバメは鳥類である。 ツバメは飛べる。 スズメは鳥類である。 スズメは飛べる。 ペンギンは鳥類である。 ペンギンは飛べない。 ダチョウは鳥類である。 ダチョウは飛べない。
問合せ
2本足の動物は何か?
飛べない鳥類は何で、それは何を持っているか?
演習24 を以下の内容でテキストファイルにまとめなさい。
テキストファイル (拡張子 txt) に、
を入れて保存し、授業Webページから提出すること。