以下、図面を参照しながら本発明の実施形態を説明する。図1は、本発明の一実施形態に係る自然言語解析装置を示すブロック図である。
入力文101は文字列からなり、形態素解析部103は、辞書102を参照しながら入力文を構成する形態素を認識し、形態素列104を出力する。形態素解析については、日本語や英語などの各種言語に対して確立された技術が広く知られており、これを利用することにより実現可能である。
構文解析部106が文法規則記憶部105から参照する文法規則は、文脈自由文法をベースに記述される。以下では、文法規則を「Y→X1/R1 … Xn/Rn」という書式で記述する。Yを左辺、X1/R1 … Xn/Rnを右辺と呼ぶ。Xiは構成素の文法記号(カテゴリ)を表している。Riは構文役割と呼び、右辺に高々一つ存在する主辞を表す“HEAD”、もしくは、他の役割の名称を表す。主辞とは、文法規則において意味的に中心的な役割を果たす構成素であり、入力形態素に対応付けられる。Riが“HEAD”ではない構成素は、Riが“HEAD”である構成素、すなわち主辞に、構文役割Riによって依存する。
例えば、図2は、文法規則“W→X/role1 Y/role2 Z/HEAD”に対応する解析木を示している。201は、文法規則の左辺に相当する節点(vertex)である。括弧外が前記文法規則の左辺の文法記号にあたり、括弧内は主辞であり、前記文法からこの構文木の主辞として“z”が導かれたことを示している。202、203は右辺の構成素に相当する節点である。201と同様に文法カテゴリと主辞のペアからなる。204や205は節点間の依存関係を表し、アーク(arc)と呼ばれる。特に、アーク204は主辞との間を結ぶ特別なアークであり、以降の図では太線で表現する。206は前記文法規則の構文役割に相当する。これにより、節点202が、アーク205で特定される構文役割(role1)206により、主辞203との依存関係を持ち、文法規則に従って文法記号201に書き換えられることが表現されている。207は、ある一つの主辞が支配する領域を表す。節点201と節点203は主辞が同じであるので、同じ領域に属している。
主辞構造付統語森107は、次の条件を満たす複数の構文木構造を圧縮共有するデータ構造を有する。すなわち、
(a)句の非終端記号が同じ、
(b)句が被覆する入力文の範囲が同じ、
(c)句の主辞となる主構成素が同じ、
であるような複数の構文木構造を圧縮共有する。
主辞構造付統語森107は、このようなデータ構造において、任意の入力形態素に対応付けられる主辞が支配する部分構造を「主辞支配域」として統語森上に保持する。
主辞支配域は、構文解析時に構築できる。注目節点が表す範疇が同じであり、かつ、注目節点が被覆する入力形態素列の範囲も同じであり、さらに、根の主辞となる主構成素が同じである場合に、この注目節点は同じ主辞支配域に併合される。ある節点について、このような併合条件を満たす主辞支配域が存在しない場合には、その節点の主辞に対する新たに主辞支配域が生成される。
例えば図3に示す文法規則に基づいて、入力文「2つ目のケーキを焼いてみる」を構文解析して生成された主辞構造付統語森の一例を図4に示す。図4の主辞構造付統語森における節点401は、局所曖昧性を併合した構造を有しており、これは一つの節点として扱われる。図4の主辞構造付統語森は、図5の(a)から(d)に示す4つの構文解析木を内包している。これら4つの構文解析木は、それぞれ、
(a)「I try to bake the 2nd cake.」,
(b)「I baked the 2nd cake, and watch it.」,
(c)「I try to bake a cake with two eyes.」,
(d)「I bake a cake with two eyes, and watch it.」
という意味解釈に対応付けられる解析木にあたる。
構文解析部106は、形態素列104を入力し、文法規則記憶部105に記憶されている文法規則を適用して構文解析を行うことにより主辞構造付統語森107を生成する。文法規則に照らし、可能な構文的解釈は、全て主辞構造付統語森107に含まれる。
依存関係評価部109は、主辞構造付統語森107を入力し、統語森構造に従って係り受け解析を行い、依存知識記憶部108を参照しながら節点に対して得点を付与し、依存得点付統語森110を生成する。
依存知識記憶部108は、係り側形態素と受け側形態素を指定することで計算される依存関係の尤もらしさを表す数値を依存知識として記憶する。この数値は、表層における受け側・係り側の形態素間距離、あるいは、依存関係の種類、あるいは、他の条件によって変化させてもよい。本実施形態では、例えば図6に示すような依存知識を用いることとする。図6の依存知識は、係り側形態素と受け側形態素、及び、受け側・係り側形態素の解析木構造における構造的距離をもとに、依存関係の尤もらしさを得点として表現したものである。例えば、係り側形態素「2つ」と受け側形態素「目の」、及び、構造的距離1が与えられると、図6の依存知識から得点1を計算できる。
優先順序付与部111は、依存得点付統語森110を入力として、統語森上に付与された得点を集計し、内包する構文木に尤もらしさの順位を付け、優先順序付統語森112を生成する。
本発明の実施形態は、係り受け解析を直接行うことが可能な統語森構造を有する主辞構造付統語森を生成する点に特徴を有する。また、このような統語森構造上で計算した係り受け得点に基づく優先順序が付与された優先順序付統語森を生成する点にも特徴を有する。
なお、本実施形態に従い生成される主辞構造付統語森ならびに優先順序付統語森は、必ずしも自然言語解析装置としてのコンピュータから外部に出力する必要はなく、自然言語処理に係る応用的なコンピュータ処理において内部的に利用され得る。
構文解析部106は、構文解析アルゴリズムを実行し、構文解析の結果として、主辞構造付統語森107を生成する。構文解析は、形態素列を入力とし、文脈自由文法パーザによって文法規則を参照することにより実施される。主辞構造付き統語森は、既に述べた、圧縮共有統語森における共有条件を追加することで構築可能である。このため、圧縮共有統語森を構築するアルゴリズムにおいて、節点の共有判定に前記条件を追加するだけで、そのまま主辞構造付き統語森を構築可能である。本実施例では、一般化LR解析法(GLR解析法)のアルゴリズムをベースに説明するが、アルゴリズムの構築方法は、チャート法などの種々の構文解析手法が適用可能である。
GLR解析アルゴリズムの基礎となるLR解析アルゴリズムは、決定性プッシュダウンオートマトン(Deterministic Push down Automaton)である。同オートマトンが備えるスタックには、LRパーザの状態sと文法記号cの組が格納される。LRパーザは入力形態素列から形態素を一つずつ読み出し、LR解析表を参照しながら解析を進める。
図7に図3の文法規則から作られるLR解析表を示す。LR解析表は、動作(ACTION)表と行き先(GOTO)表からなる。
ACTION表は、パーザの状態と入力記号からパーザが次に取るべき動作を決定する。ACCTION表の要素は、“s#”、“r#”、“acc”のいずれかである。“s#”は、状態番号#への遷移(shift)を表し、“r#”は#番の文法規則による還元(reduce)を表し、“acc”は受理(accept)を表す。また、空欄は解析の失敗(reject)を表す。
GOTO表は、パーザの現在の状態と、スタックの先頭にある記号から還元操作後に遷移すべき状態(GotoState)を決定する。LRパーザは、1単語先読みすれば適応可能な動作を一意に決定できる文脈自由文法のクラスを対象としており、LR解析表の各項は単一の動作を規定している。
GLR解析アルゴリズムは、LR解析表に複数の動作を記述した項を許し、スタックを分岐及び併合するなど各動作を同時並行的に行うことによって解析を進めるアルゴリズムである。GLR解析アルゴリズムにおいて、パーザの状態と統語森上の対応する節点との2項組をスタックノードと呼び、スタックノードとLR解析表から得られる動作との2項組を保持するリストをフロンティア(FRONTIER)と呼び、フロンティアが持っているノードをアクティブなノードと呼ぶ。
以下では、まず従来のGLR解析アルゴリズムについて説明し、次に、主辞構造付統語森107を生成する拡張GLR解析アルゴリズムについて説明する。図8は、従来のGLR解析の処理手順を示すフローチャート、図9は、前記従来のGLR解析におけるリデュース・フェイズの処理手順を示すフローチャート、図10は、前記従来のGLR解析におけるシフト・フェイズの処理手順を示すフローチャートである。
<処理手順:GLR解析>
801:START
802:入力形態素列の末尾に入力終端を表す記号“$”を追加する。
803:状態0のスタックノードη0を作り、スタックにプッシュする。η0はスタックの底を表し、節点を表すフィールドは空である。
804:入力形態素列の先頭形態素uを読む。
805:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s0,u] に対して、2項組(η0,a)を作り、FRONTIERに追加する。
806:サブルーチン、リデュース・フェイズを呼び出す。
807:サブルーチン、シフト・フェイズを呼び出す。
808:FRONTERが(η,accept)のみかを判定し、真ならば809へ、偽ならば810へ行く。
809:受理状態とし、ステップ808のスタックノードηが持つvertexを返す。
810:FRONTIERが空か判定し、空であるならば811へ行き、空でないならば処理を繰り返すために806へ行く。
811:棄却状態とする。
812:END
<処理手順:リデュース・フェイズ>
901:START
902:reduce動作を持つアクティブなスタックノードが存在するか確認し、存在するならば処理を繰り返すために903へ、存在しないなら914へ行く。
903:FRONTIERから(η,reduce A→α)の形をした要素を一つ取り出す。
904:ηで終わる長さ|α|のグラフ構造化スタック上の経路集合Pを作る。
905:全てのp∈Pに対して、pに接続するスタックノード(ベースノードと呼ぶ)の集合Bpを作る。
906:Bpを文法記号Aで参照した次GOTO状態に基づき分割し、各状態に対してbs⊆Bpを作る。
907:再利用可能な以下の条件を満たすスタックノードを探す。
1.現在の入力形態素について作られたスタックノードである
2.該スタックノードの子の集合がbsと等しい
3.vertexが非終端記号Aを表している
908:907でスタックノードη´が見つかったかを判定し、見つかっているなら909へ、見つかっていないならば911へ行く。
909:この還元操作により局所曖昧性が発生したので、スタックノードη´を再利用なスタックノードに設定する。
910:スタックノードη´の持つvertexの子集合に、対応する経路p中のvertexを追加することで、構造を圧縮(Pack)する。914へ行く。
911:経路p中のvertexを子として持つvertex νpを作る。
912:状態s、vertex νp を持つスタックノードη″を作り、bsのスタックにプッシュする。
913:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s,u] に対して、2項組(η″,a)を作り、FRONTIERに追加する。
914:END
<処理手順:シフト・フェイズ>
1001:START
1002:FRONTIERから(η,shift)の形をした要素を全て取り出す。
1003:読込形態素uに対するvertex ν を作る。
1004:次入力形態素wを読み込む。
1005:1002で取り出したηの集合の次GotoStateに基づく分割Πを作る。
1006:各分割πs∈Πに対して状態s,vertex νを持つスタックノードηsを作り、πsのスタックにプッシュする。
1007:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s,w] に対して、2項組(ηs,a)を作り、FRONTIERに追加する。
1006:END
次に、本実施形態の特徴に係わる拡張GLR解析アルゴリズムについて説明する。この拡張GLR解析アルゴリズムには、上述した従来のGLR解析アルゴリズムを基本としており、解析過程における主辞支配域構築のために、従来の処理手順に3点の変更がなされている。
第一の変更点として、グラフ構造化スタックには、パーザの状態と対応する統語森の節点に加えて、該節点を支配する主辞の3項組としたスタックノードを格納する。これに伴い、図8におけるステップ906の再利用可能ノード条件に以下を加える。
4.主辞が同じである。
4つ目の条件を加えたことにより、従来のGLR解析アルゴリズムの受理・停止条件では、従来受理されていた文であっても受理されないことがある。そこで、第二の変更点として、本実施形態では受理・停止条件を、「FRONTIERの持つ2項組が、全て(η,accept)の形をしている」とする。
第三の変更点として、主辞支配域を解析の進行と並行して行うために、主辞支配域の生成・併合操作を統語森におけるvertexの生成と操作に追加する。
図11は、以上の変更が加えられた拡張GLR解析の処理手順を示すフローチャート、図12は、同拡張GLR解析におけるデュース・フェイズの処理手順を示すフローチャート、図13は、同拡張GLR解析におけるシフト・フェイズの処理手順を示すフローチャートである。
<処理手順:拡張GLR解析>
1101:START
1102:入力形態素列の末尾に入力終端を表す記号“$”を追加する。
1103:状態0のスタックノードη0を作り、スタックにプッシュするη0はスタックの底を表し、節点及び主辞を表すフィールドは空である。
1104:入力形態素列の先頭形態素uを読む。
1105:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s0,u] に対して、2項組(η0,a)を作り、FRONTIERに追加する。
1106:サブルーチン、リデュース・フェイズを呼び出す。
1107:サブルーチン、シフト・フェイズを呼び出す。
1108:FRONTIERの持つ2項組が全て、(η,accept)の形をしているか判定し、真ならば1109へ、偽ならば1110へ行く。
1109:受理状態とし、ステップ1108のスタックノードηが持つvertexの集合を返す。
1110:FRONTIERが空か判定し、空であるならば1111へ行き、空でないならば処理を繰り返すために1106へ行く。
1111:棄却状態とする。
1112:END
<処理手順:拡張リデュース・フェイズ>
1201:START
1202:reduce動作を持つアクティブなスタックノードが存在するか確認し、存在するなら処理を繰り返すために1203へ、存在しないなら1216へ行く。
1203:FRONTIERから(η,reduce,A→α)の形をした要素を一つ取り出す。
1204:文法を満たす、ηで終わる長さ|α|のグラフ構造化スタック上の経路集合Pを作る。
1205:全てのp∈Pに対して、pに接続するスタックノード(ベースノードと呼ぶ)の集合Bpを作る。
1206:Bpを文法記号Aで参照した次GotoStateに基づき分割し、各状態に対してbs⊆Bpを作る。
1207:再利用可能な以下の条件を満たすスタックノードを探す。
1.現在の入力形態素について作られたスタックノードである
2.該スタックノードの子の集合がbsと等しい
3.vertexが非終端記号Aを表している
4.主辞が同じである
1208:1206でスタックノードη´が見つかったかを判定し、見つかっているなら1209へ見つかっていないならば1212へ行く
1209:この還元操作により局所曖昧性が発生したので、スタックノードη´を再利用なスタックノードに設定する
1210:スタックノードη´の持つvertexの子集合に、対応する経路p中のvertexを追加することで、構造を圧縮(Pack)する。
1211:スタックノードη´と同じ主辞である経路p中のvertexを、スタックノードη´が持つvertexの主辞支配域へ併合する。
1212:経路p中のvertexを子として持つvertex νpを作る。
1213:文法規則を参照してνpの主辞θを得、該νpの子の主辞支配域のなかから、同じ主辞である主辞支配域を併合する。
1214:状態s、vertex νp 、主辞θを持つスタックノードη″を作り、bsのスタックにプッシュする。
1215:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s,u] に対して、2項組(η″,a)を作り、FRONTIERに追加する。
1216:END
<処理手順:拡張シフト・フェイズ>
1301:START
1302:FRONTIERから(η,shift)の形をした要素を全て取り出す。
1303:読込形態素uに対するvertex ν を作る。
1304:入力形態素uを主辞θとした主辞支配域を作り、1303で作ったvertex νを、これに加える。
1305:次入力形態素wを読み込む。
1306:1302で取り出したηの集合の次GotoStateに基づく分割Πを作る。各分割πs∈Πに対して状態s,vertex ν,主辞θを持つスタックノードηsを作り、πsのスタックにプッシュする。
1307:LR解析表を参照し、全てのエラーではない動作 a ∈ ACTION[s,w] に対して、2項組(ηs,a)を作り、FRONTIERに追加する。
1308:END
これらの変更は、基本的には、共有・圧縮するvertexを選定するための条件の変更と、統語森の構築に併せて主辞支配域を作る操作の追加であるため、主たる解析操作に変更はない。よって、GLR(k)アルゴリズム、ボトムアップチャートアルゴリズムなど、種々の構文解析アルゴリズムに対して適応可能である。
次に、依存関係評価部109の動作について説明する。図14は依存関係評価の処理手順を示すフローチャート、図15は係り受け解析の処理手順を示すフローチャート、図16は得点計算の処理手順を示すフローチャートである。
<処理手順:依存関係評価>
1401:START
1402:構文解析結果である主辞構造付統語森の葉節点リストを得る。
1403:リストが空ならば、全ての葉節点について処理が済んでいるので、ループを抜けて1408へ行く。空でないならば処理対象が残っているので、1404へ行く。
1404:リストから葉節点を一つ取り出し、注目節点とする。また、該葉節点の主辞を、係り側主辞とする。
1405:係り受け得点の計算に用いられ、係り側主辞と受け側主辞との構造的な距離を規定する主辞間距離を0で初期化する。
1406:係り受け解析サブルーチンを呼び出す。
1407:得点計算がなされた節点に関して、各節点における総計点に、一つの葉節点に注目して計算した得点を加算する。
1408:END
<処理手順:係り受け解析>
1501:START
1502:注目節点の親節点のリストを得る。
1503:リストが空ならば、全ての親節点について処理が済んでいるので、ループを抜けて1512へ行く。空でないならば処理対象が残っているので、1504へ行く。
1504:リストから親節点を一つ取り出し、注目親節点とする。
1505:注目節点の属する主辞支配域と注目親節点の属する主辞支配域が違うならば、得点計算の対象となる係り受け関係が発生しているので、1506へ行く。主辞支配域が同じならば、係り受け関係は発生しないので、1509へ行く。
1506:受け側主辞を親節点の主辞とする。
1507:主辞支配域を移動したので、主辞間距離に1を加算する。
1508:得点計算サブルーチンを呼び出す。
1509:注目節点を注目親節点で更新する。
1510:係り受け解析サブルーチンを呼び出す。
1511:END
<処理手順:得点計算>
1601:START
1602:主辞間距離、受け側主辞、係り側主辞を基に係り受け得点を計算する。
1603:現在注目している係り側主辞について、既に注目親節点における得点計算がなされているかを評価し、なされている場合には1604へ行く。そうでなければ1605へ行く。
1604:計算済み得点が、1602で新たに計算された得点より高ければ1605へ、低ければ1606へ移動する。
1605:1602で計算した得点で、節点の得点を更新する。
1606:END
優先順序付与部111は、依存得点付統語森110を入力として、統語森上に付与された得点を集計し、内包する構文木に尤もらしさの順位を付け、優先順序付統語森112を生成する。依存得点付統語森110は、局所曖昧性圧縮のなされたvertexをOR構造、他のvertexをAND構造としてみれば、AND-ORグラフであると考えることができる。よって、AND構造をとるvertexでは、自身の得点と子どもの得点とを足し合わせた得点を、OR構造をとるvertexでは、子どもが持つ最大得点を選択し、ボトムアップに得点を集計していくことが可能である。
以上が、本発明の実施形態に係る自然言語解析装置の構成および動作である。上述した本発明の実施形態によれば、複数の構文木を圧縮共有した構造を有する主辞構造付統語森を生成し、該主辞構造付統語森に対し一括して係り受け解析を施すことのできる自然言語解析装置及び同装置による係り受け解析方法を提供できる。さらに、上述した実施形態によれば、内包する構文木に対して解釈に対して尤もらしさに関する優先順位を付与することが容易に可能になり、時間的・空間的に効率が良く、精度が高い自然言語処理を実現できる。
次に、上述した拡張GLR解析アルゴリズムを用いた実際の解析の様子を実例に沿って説明する。図3の文法規則及び、これを基に作られた図6のLR解析表を用いて「2つ目のケーキを焼いてみる」を構文解析する過程を図18〜図25に示す。図18〜図25において、左側はグラフ構造化スタックを表し、右側はグラフ構造化スタックに対応する主辞構造付統語森を表している。
グラフ構造化スタックは、図17に示す構成素からなる。1701,1702は状態であり、中の数字が状態番号にあたる。1703は1702と共にスタックに積まれた文法記号及び主辞を表し、[]外が文法記号、[]内が主辞を表す。1704は、“/”の前部が次入力形態素を表し、後部がLR解析表を参照して得られた動作であり、この例では、“r2”すなわち2番の文法規則に従ったreduceと、“s3”状態3にshiftを意味している。
つづいて、実際の動作を「2つ目のケーキを焼いてみる」を入力文として、図11、図12、及び図13のフローチャートに従って説明する。
1101:START
1102:入力形態素列の末尾に入力終端を表す記号“$”を追加し、「2つ目のケーキを焼いてみる$」とする。
1103:状態0のスタックノードη0を作り、スタックにプッシュする。η0はスタックの底を表し、節点及び主辞を表すフィールドは空である。
1104:入力形態素列の先頭形態素“2つ”を読む。
1105:LR解析表を参照し、(η0,s6)をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図18に示す。この段階では、統語森にvertexは存在しないため、φとなっている。
1106:サブルーチン、リデュース・フェイズを呼び出す。
1202:FRONTIER={(η0,s6)}より、reduceを持つスタックノードはないので、1216へ行く。
1107:サブルーチン、シフト・フェイズを呼び出す。
1302:FRONTIER = {(η0,s6)}であるから、shift動作を持つアクティブなスタックノードが存在するので1303へ行く。
1303:FRONTIERから(η0,s6)を取り出す。
1304:読込形態素“2つ”に対するvertex ν1 を作る。
1305:入力形態素“2つ”を主辞とし、“2つ”の主辞支配域を作り、1304で作ったvertex ν1を、これに加える。
1306:次入力形態素“目の”を読み込む。
1307:1302で取り出したηの集合の次GotoStateに基づく分割Πを作る。取り出した要素は(η0,s6)であるから、次GotoStateは6のみであり、π6={(η0,s6)}という分割ができる。
1308:分割π6に対して、状態6,vertex ν1,主辞“2つ”を持つスタックノードη1を作り、π6のスタックにプッシュする。
1309:LR解析表を参照し、 (η1,r8)をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図19に示す。
1108:FRONTIER={(η1,r8)}であるから、1110へ行く。
1110:FRONTIERは空でないので1106へ行く。
1106:サブルーチン、リデュース・フェイズを呼び出す。
1202:FRONTIER = {(η1,r8)}より、reduce動作を持つアクティブなスタックノードが存在するので1203へ行く。
1203:FRONTIERから(η1,r8)を取り出す。
1204:8番の文法規則は“NUM→2つ/HEAD”であるので、η1で終わる長さ1のグラフ構造化スタック上の経路集合Pを作り、P={{η1}}を得る。
1205:p={η1}に対して、n2に接続するスタックノードの集合Bp={η0}を得る。
1206:Bp={η0}について、文法記号NUM,状態番号0で参照した次GotoStateは4であるので、b4={η0}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたノードはないので、見つからない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν1}を子として持つvertex ν2を作る。
1213:8番の文法規則より、ν2の主辞が“2つ”になるので、対応する主辞支配域を併合する。
1214:状態4、vertex ν2、主辞“2つ”を持つ、スタックノードη2を作り、b4のスタックにプッシュする。
1215:LR解析表を参照し、 (η2,s13)をFRONTIERに追加する。
1202:FRONTIER = {(η2,s13)}より、reduce動作を持つアクティブなスタックノードが存在しないので1216へ行く。
1107:サブルーチン、シフト・フェイズを呼び出す。
1302:FRONTIER = {(η2,s13)} であるから、shift動作を持つアクティブなスタックノードが存在するので1303へ行く。
1303:FRONTIERから(η2,s13)を取り出す。
1304:読込形態素“目の”に対するvertex ν3 を作る。
1305:入力形態素“目の”を主辞として、“目の”の主辞支配域を作り、1303で作ったvertex ν3を、これに加える。
1306:次入力形態素“ケーキを”を読み込む。
1307:1302で取り出したηの集合の次GotoStateに基づく分割Πを作る。取り出した要素は(η2,s13)であるから、次GotoStateは13のみであり、π13={(η2,s13)}という分割ができる。
1308:分割π13に対して、状態13,vertex ν3,主辞“目の”を持つスタックノードη3を作り、π13のスタックにプッシュする。
1309:LR解析表を参照し、{(η3,r9)}をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図20に示す。
1108:FRONTIER={(η3,r9)} であるから、1110へ行く。
1110:FRONTIERは空ではないので1106へ行く。
1106:サブルーチン、リデュース・フェイズを呼び出す。
1202:FRONTIER = {(η3,r9)}より、reduce動作を持つアクティブなスタックノードが存在するので1203へ行く。
1203:FRONTIERから(η3,r9)を取り出す。
1204:9番の文法規則は“N→目の/HEAD”であるので、η3で終わる長さ1のグラフ構造化スタック上の経路集合Pを作り、P={{η3}}を得る。
1205:p={η3}に対して、η3に接続するスタックノードの集合Bp={η2}を得る。
1206:Bp={η2}について、文法記号N、状態番号4で参照した次GotoStateは16であるので、b16={η2}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたノードはないので、見つからない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν3}を子として持つvertex ν4を作る。
1213:9番の文法規則より、ν4の主辞が“目の”になるので、対応する主辞支配域を併合する。
1214:状態16、vertex ν4、主辞“目の”を持つ、スタックノードη4を作り、b4のスタックにプッシュする。
1215:LR解析表を参照し、 {(η4,r4), (η4,r3)}をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図21に示す。
1202:FRONTIER={(η4,r4), (η4,r3)}より、reduce動作を持つアクティブなスタックノードが存在するので1103へ行く。
1203:FRONTIERから(η4,r4)を取り出す。
1204:4番の文法規則は“NP→NUM/num N/HEAD”であるので、η4で終わる長さ2のグラフ構造化スタック上の経路集合Pを作り、P={{η4,η2}}を得る。
1205:p={η4,η2}に対して、η2に接続するスタックノードの集合Bp={η0}を得る。
1206:Bp={η0}について、文法記号NP、状態番号0で参照した次GotoStateは2であるので、b2={η0}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたノードはないので、見つからない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν4,ν2}を子として持つvertex ν5を作る。
1213:4番の文法規則より、ν5の主辞が“目の”になるので、対応する主辞支配域を併合する。
1214:状態2、vertex ν5、主辞“目の”を持つ、スタックノードη5を作り、b2のスタックにプッシュする。
1215:LR解析表を参照し、 {(η5,s14)}をFRONTIERに追加する。
1202:FRONTIER={(η4,r3) ,(η5,s14)}より、reduce動作を持つアクティブなスタックノードが存在するので1203へ行く。
1203:FRONTIERから=(η4,r3)を取り出す。
1204:3番の文法規則は“NP→NUM/HEAD N/tani”であるので、η4で終わる長さ2のグラフ構造化スタック上の経路集合Pを作り、P={{η4,η2}}を得る。
1205:p={η4,η2}に対して、η2に接続するスタックノードの集合Bp={η0}を得る。
1206:Bp={η0}について、文法記号NP、状態番号0で参照した次GotoStateは2であるので、b2={η0}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたη5は、条件すなわち4.「主辞が同じである」を満たさないので、再利用できない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν4,ν2}を子として持つvertex ν6を作る。
1213:4番の文法規則より、ν6の主辞が“2つ”になるので、対応する主辞支配域を併合する。
1214:状態2、vertex ν6、主辞“2つ”を持つ、スタックノードη6を作り、b2のスタックにプッシュする。
1215:LR解析表を参照し、 {(η6,s14)}をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図22に示す。従来のGLR解析アルゴリズムでは、1207の再利用条件は1〜3までであるので、このようなスタックの分岐はしないことに注意したい。次ステップから、従来のGLR解析アルゴリズムでは想定していなかった、このようなスタックの状態であっても、解析アルゴリズムを修正することなく正しく動作し、また、本実施形態により主辞構造付統語森が正しく作られることを確認する。
1202:FRONTIER={(η5,s14), (η6,s14)}より、reduce動作を持つアクティブなスタックノードが存在しないので、1216へ行く。
1107:サブルーチン、シフト・フェイズを呼び出す。
1302:FRONTIER = {(η5,s14), (η6,s14)} であるから、shift動作を持つアクティブなスタックノードが存在するのでZ03へ行く。
1303:FRONTIERから(η5,s14), (η6,s14)を取り出す。
1304:読込形態素“ケーキを”に対するvertex ν7 を作る。
1305:入力形態素“ケーキを”を主辞として、“ケーキを”の主辞支配域を作り、1303で作ったvertex ν7を、これに加える。
1306:次入力形態素“焼いて”を読み込む。
1307:1302で取り出したηの集合の次GotoStateに基づく分割Πを作る。取り出した要素、(η5,s14), (η6,s14)共、次GotoStateは14であるので、π14={(η5,s14), (η6,s14)}という分割ができる。
1308:分割π14に対して、状態14,vertex ν7,主辞“ケーキを”を持つスタックノードη7を作り、π14のスタックにプッシュする。
1309:LR解析表を参照し、{(η7,r10)}をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図23に示す。
1108:FRONTIER={(η7,r10)} であるから、1110へ行く。
1110:FRONTIERは空ではないので1106へ行く。
1106:サブルーチン、リデュース・フェイズを呼び出す。
1202:FRONTIER ={(η7,r10)}より、reduce動作を持つアクティブなスタックノードが存在するので1203へ行く。
1203:FRONTIERから(η7,r10)を取り出す。
1204:10番の文法規則は“N→ケーキを/HEAD”であるので、η7で終わる長さ1のグラフ構造化スタック上の経路集合Pを作り、P={{η7}}を得る。
1205:p={η7}に対して、η3に接続するスタックノードの集合Bp={η5, η6}を得る。
1206:Bpの要素η5, η6とも、文法記号N、状態番号2で参照した次GotoStateは10であるので、b10={η5, η6}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたノードはないので、見つからない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν7}を子として持つvertex ν8を作る。
1213:10番の文法規則より、ν7の主辞が“ケーキを”になるので、対応する主辞支配域を併合する。
1214:状態10、vertex ν7、主辞“ケーキを”を持つ、スタックノードη8を作り、b10のスタックにプッシュする。
1215:LR解析表を参照し、 (η8,r5)をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図24に示す。
1202:FRONTIER={(η8,r5)}より、reduce動作を持つアクティブなスタックノードが存在するので1203へ行く。
1203:FRONTIERから(η8,r5)を取り出す。
1204:5番の文法規則は“NP→NP/rentai N/HEAD”であるので、η4で終わる長さ2のグラフ構造化スタック上の経路集合Pを作り、P={{η8,η5},{η8,η6}}を得る。
1205:{η8,η5},{η8,η6}∈Pにおいて、η5,η6共に接続するスタックノードはη0であるので、Bp={η0}を得る。
1206:Bp={η0}について、文法記号NP、状態番号0で参照した次GotoStateは2であるので、b2={η0}とする。
1207:再利用可能なノードを探すが、現在の入力形態素に対して作られたノードはないので、見つからない。
1208:スタックノードη´が見つからなかったので1212へ行く。
1212:経路p中のvertex集合{ν5,ν8}及び、{ν6,ν8}を子として持つvertex ν9を作る。
1213:4番の文法規則より、ν9の主辞が“ケーキを”になるので、対応する主辞支配域を併合する。
1214:状態2、vertex ν9、主辞“ケーキを”を持つ、スタックノードη9を作り、b2のスタックにプッシュする。
1215:LR解析表を参照し、 {(η9,s7)}をFRONTIERに追加する。
ここまでの処理を施した時のグラフ構造化スタックと主辞構造付統語森の様子を図25に示す。以下同様にして構文解析、統語森及び主辞支配域の構築を進める。
以上により、入力文「2つ目のケーキを焼いてみる」の解析結果である、図26の主辞構造付統語森が生成される。
図26では、次処理である依存関係評価部109の動作説明のために、ν9を該ν9の子どもによって、ν91、ν92と分けて表現しているが、実際には一つのvertexである。また、この主辞構造付統語森は図5に示す4つの構文木を内包していることも確認できる。
つづいて、図26の主辞構造付統語森を入力例として、依存関係評価部109の実際の動作を説明する。
1401:START
1402:主辞構造付統語森の葉節点リスト{ν1, ν3, ν7, ν10, ν13}を得る。
1403:葉節点リスト{ν1, ν3, ν7, ν10, ν13}は、空でないので、1404へ行く。
1404:リストから葉節点をν1を取り出して注目節点とし、係り側主辞を葉節点の主辞“2つ”とする。
1405:係り受け得点の計算に用いる、係り側主辞と受け側主辞との構造的な距離を規定する主辞間距離を0で初期化する。
1406:係り受け解析サブルーチンを呼び出す。
1502:注目節点ν1の親節点のリスト{ν2}を得る。
1503:親節点のリスト{ν2}は空でないので、1504へ行く。
1504:リストから親節点ν2を取り出し、注目親節点とする。
1505:注目節点の属する主辞支配域と注目親節点の属する主辞支配域は同じであるので、1509へ行く。
1509:注目節点を注目親節点ν2で更新する。
1510:係り受け解析サブルーチンを呼び出す。
1502:注目節点ν2の親節点のリスト{ν5,ν6}を得る。
1503:親節点のリスト{ν5,ν6}は空でないので、1504へ行く。
1504:リストから親節点ν5を取り出し、注目親節点とする。
1505:注目節点の属する主辞支配域と注目親節点の属する主辞支配域が異なるので、1506へ行く。
1506:受け側主辞を親節点の主辞“目の”とする。
1507:主辞支配域を移動したので、主辞間距離に1を加算して1とする。
1508:得点計算サブルーチンを呼び出す。
1602:主辞間距離1、受け側主辞“目の”、係り側主辞“2つ”を基に、係り受け得点を計算し、1点を得る。
1603:現在注目している係り側主辞“2つ”について、未だ注目親節点において得点がなされていないので1605へ移動する。
1605:1602で計算した1点で、節点の得点を更新する。
1509:注目節点を注目親節点ν5で更新する。
1510:係り受け解析サブルーチンを呼び出す。
以下同様にして、ν92→ν12→ν16→ν17→ν91の順で得点計算アルゴリズムに沿って処理が進む。ここまでの処理を施した時の様子を図27に示す。図において、丸で囲まれた数値が、当該vertexにおける係り受け得点を表している。
つづいて、係り側主辞“2つ”、ν91を注目節点、主辞間距離1の状態で、図15のステップ1502からの動作を説明する。
1502:注目節点ν91の親節点のリスト{ν12,ν17}を得る。
1503:親節点のリスト{ν12,ν17}は空でないので、1504へ行く。
1504:リストから親節点ν12を取り出し、注目親節点とする。
1505:注目節点の属する主辞支配域と注目親節点の属する主辞支配域が異なるので、1506へ行く。
1506:受け側主辞を親節点の主辞“焼いて”とする。
1507:主辞支配域を移動したので、主辞間距離に1を加算して2とする。
1508:得点計算サブルーチンを呼び出す。
1602:主辞間距離2、受け側主辞“焼いて”、係り側主辞“2つ”を基に、係り受け得点を計算し、0.2点を得る。
1603:現在注目している係り側主辞“2つ”について、既に注目親節点において得点がなされているので、1604へ行く。
1604:計算済み得点は0.1点であり、新たに計算された0.2点よりも低いので1505へ移動する。
1605:1602で計算した0.2点で、節点の得点を更新する。
1509:注目節点を注目親節点ν12で更新する。
1510:係り受け解析サブルーチンを呼び出す。
以下同様にして、ν12→ν16→ν17の順で得点計算アルゴリズムに沿って処理が進む。以上により、葉節点ν1に注目した場合の係り受け解析が終了し、図14のステップ1403へ処理が戻る。ここまでの処理を施した時の様子を図28に示す。ついで、次葉節点であるν3について処理を始め、以下同様に全ての葉節点について処理がなされる。
以上により、入力である図26の主辞構造付統語森に対して、係り受け解析に基づく得点が付与された、図29に示すような依存得点付統語森を生成できる。
また、図29の依存得点付統語森について、統語森上に付与された得点を集計し、内包する構文木に尤もらしさの順位を付けることにより、図30の優先順序付統語森を生成することができる。
図30の優先順序付統語森は、図31の構文木を内包しており、優先順位の一位が(a)「I try to bake the 2nd cake.」の木、優先順位の二位が(b)「I bake the 2nd cake, and watch it.」の木、優先順位の三位が(c)「I try to bake a cake with two eyes.」の木、優先順位の四位が(d)の「I bake a cake with two eyes, and watch it.」の木を表しており、自然な解釈である(a)「I try to bake the 2nd cake.」が優先されていることが分かる。
以上説明した実施形態による文解析及び係り受け解析によれば、複数の構文木を圧縮して保持する統語森構造に対し一括して係り受け解析を施すことができる。また、内包する構文木に対して得点を付与することで、構文木間に優先順位を付与することができる。したがって、係り受け解析を効率的に行うことが可能になる。また、全ての解釈を考慮した優先順位を付与することができることにより、全ての解析候補を評価した中から尤もらしい構造を選び出すことも可能となる。
係り受けに基づく得点の付与、内包する構文木間の優先順位の付与は、全て構文解析によって構築される主辞構造付統語森上でなされることから、係り受け関係を評価するために別の構造を用意する必要がない。さらに、同じく統語森内の構造的な尤もらしさを評価する確率一般化LR解析などと組み合わせて用いることが可能になるなどの副次的な効果も得られる。
以上述べた本発明に係る処理手順は、コンピュータで実行可能なプログラムとして実現してもよい。また、このプログラムをコンピュータで読み取り可能な記憶媒体として本発明を実現することも可能である。なお、記憶媒体としては、磁気ディスク、フレキシブルディスク、ハードディスク、光ディスク(CD−ROM,DVD等)、光磁気ディスク(MO等)、半導体メモリなど、プログラムを記憶でき、かつコンピュータが読み取り可能な記憶媒体であれば、記憶形式はいずれの形態であっても良い。
また、記憶媒体からコンピュータにインストールされたプログラムの指示に基づきコンピュータ上で稼動しているOS(オペレーションシステム)や、データベース管理ソフト、ネットワーク等のミドルウェア等が本実施形態を実現するための各処理の一部を実行してもよい。
さらに、記憶媒体としては、コンピュータと独立した媒体に限らず、LANやインターネット等により伝送されたプログラムをダウンロードして記憶または一時記憶した記憶媒体も含まれる。また、記憶媒体は1つに限らず、複数の媒体から本実施形態における処理が実行されてもよく、記録媒体の構成は何れの構成であってもよい。
なお、本発明におけるコンピュータは、記憶媒体に記憶されたプログラムに基づき、本実施形態における各処理を実行するものであって、パソコン等の1つからなる装置、複数の装置がネットワーク接続されたシステム等の何れの構成であってもよい。また、本発明におけるコンピュータとは、パソコンに限らず、情報処理機器に含まれる演算処理装置、マイコン等も含み、プログラムによって本願発明の機能を実現することが可能な機器、装置を総称している。
本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組合せにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
101…入力文、102…辞書、103…形態素解析部、104…形態素列、105…文法規則記憶部、106…構文解析部、107…主辞構造付統語森、108…依存知識記憶部、109…依存関係評価部、110…依存得点付統語森、111…優先順序付与部、112…優先順序付統語森、201…文法規則における左辺の文法記号及び主辞、202…文法規則における右辺の文法記号及び主辞、203…文法規則における右辺の文法記号及び主辞、204…主辞を表すアーク、205…節点間の依存関係を表すアーク、206…構文役割、207…主辞領域、401…局所曖昧性圧縮構造、1701…パーザの初期状態番号、1702…パーザの状態番号、1703…スタックノードが持つ文法記号および主辞、1704…次入力形態素とLR解析表から得られた動作