機械翻訳の立場から見た自然言語処理
今回機械翻訳システムをC言語で作成した。この作成した機械翻訳システムのアルゴリズムや処理結果から、人工知能おいて重要な分野である自然言語処理について考えてみたい。翻訳の手法は構文トランスファー方式(3)を用い、自分で考案した中間表現を用いた。また、辞書は自作のテキストファイルとし、内部ではほとんどのデータをリスト構造で持っている。ただし、英文の入力は1文単位とし、文と文との関連などは対象外とする。
1.序論
今回この研究を行った目的は機械翻訳を通じて、文章理解と文章作成の適当な実現法を模索することである。また、具体的なシステムを作成することによって、人工知能において重要な分野である自然言語処理の問題点を浮き彫りにすることも狙いの一つである。今回作成したシステムには、構文トランスファー方式が用いられている。構文トランスファー方式とは機械翻訳の代表的な手法の一つで、原文の構造を把握して中間表現を生成し、それを介して翻訳文を生成する。今回用いた中間表現は、単語間の関係を格文法によって関連付けた格フレームを基にした。中間表現のデータ構造はリストとし、独自のデータ構造を創ってシステムに組み込んだ。今回作ったシステムは機能として不足した部分があるので、その解決法もあわせて考えたい。
2.本論
ここではプログラム内での処理の内容、アルゴリズム、データ構造について述べる。
2−1.文字列の入力
標準入力から原文となる英文の文字列を受け取る。英文の最後にピリオドがあるかチェックする。受け取った文字列を空白をトークン(区切りとする目印)として単語に分割する。分割した個々の 単語はリストのノードとして格納する(図1参照)。ここで用いるリストのノードのデータ型は文字列へのポインタ型である。空白をトークンとして単語を分割するこの作業を形態素解析とする。
2−2.辞書引き
2−2−1.辞書の構成
辞書は自作のテキストファイルである。一行につき単語と付加情報と意味が一組づつ登録されている。付加情報とはアルファベットの文字の羅列でアルファベット1文字1文字が意味を持っている(表1参照)。例えば、それは品詞を表したり、その名詞が場所か動物かを表したり、その動詞が目的語に人をとるか食べ物をとるか表したり、その動詞が他動詞か自動詞か表したり、その動詞が原形か過去形か表したり、その前置詞が名詞を修飾するのか動詞を修飾するのか表したりしている。
例1 apple Mfs りんご
例2 used Vpt 使った
各要素について apple : 英単語Mfs : 付加情報りんご : 日本語訳
付加情報の記号 M : 名詞V : 動詞F : 副詞K : 形容詞f : 食べ物s : 単数形n : 現在形p : 過去形h : 人t : 道具m : 複数形
例1の付加情報 名詞で食べ物で単数形である。
例2の付加情報 動詞で過去形で目的語に道具をとる。
2−2−2.処理の内容
個々の単語に辞書で引いたデータをリンクさせる。まず、辞書の情報をリストに格納する。次に英文中の各単語が辞書内にあるか検索し、付加情報や意味の情報を単語のサブノードに付け加える(図2参照)。このリストは多次元リストとして設計されているので、単語のノードを1次元目とすると2次元目以降に付加情報や意味の情報が格納される。なお、ここで熟語の検出も行われる。
2−3.文型の把握
ここから2−8までは構文解析リストを作りながら構文解析を行う。構文解析リストは、先に述べた中間表現を表すデータであり、はじめに基本文型の要素(SVOC)を4つの線形リストのノードとして持っている。(これ以降この4つのノードを持つリストをSVOCリストと呼ぶ。)ただし、ここでは主文の解析をするので節や句の中は見ない。最初に動詞を探し、見付かったら構文解析リストのVの位置のノードに格納する。次に名詞を探し、主語、目的語、補語に振り分け、構文解析リストに格納する。最後に形容詞を探し、補語になる場合(叙述用法)は構文解析リストに格納し、名詞を修飾する場合(限定用法)は修飾の処理をする(図3及び表2参照)。修飾の処理に関しては2−4で説明する。
2−4.修飾語句の処理
その他の品詞(副詞、冠詞、助動詞)の修飾先を決める。副詞の場合は修飾先が名詞なのか動詞なのか形容詞なのか副詞なのか判定し、その修飾先の語(構文解析リストにおける)のサブノードとして追加する(図4参照)。冠詞は名詞を、助動詞は動詞を修飾する。この時、完了形を作るhaveは助動詞として扱う。
2−5.節や句の処理
2−5−1.節や句の範囲の決定
句の範囲は前置詞から前置詞の目的語までとする。節の範囲は節中の動詞からカンマ、動詞、接続詞、前置詞、文末までとする。to不定詞の範囲も節の範囲と同じ処理で決定する。to不定詞の検出はtoの後に動詞が来た時とする。
2−5−2.前置詞句
はじめにどの単語を修飾しているのかを調べる。前置詞の付加情報が動詞の修飾を示していれば動詞のサブノードに追加し、名詞の修飾を示していれば直前の名詞のサブノードに追加する。さらにその前置詞のサブノードに前置詞の目的語になっている名詞をつなぐ。その名詞に修飾語があれば名詞のサブノードに加える。
2−5−3.名詞節
名詞節を作れる接続詞(that等)が来た場合、その節が関係代名詞でなければ名詞節とする。前にある動詞が他動詞で目的語が欠けているか調べる。欠けていればその動詞の目的語とする。目的語が欠けていなければ後ろにある動詞の主語とする。接続詞をSVOCリストの目的語あるいは主語の位置に入れ、その接続詞にサブノードとしてSVOCリストをつなげる。新たに作ったSVOCリストには節内のSVOCが納められる。節内の処理は基本的に主節の処理に準じる。
2−5−4.副詞節
副詞節を作れる接続詞が来た場合、その節を副詞節とし動詞を修飾する。接続詞を動詞のサブノードとして付け、接続詞のサブノードにSVOCリストを付ける。節内の処理は基本的に主節の処理に準じる。
2−5−5.関係代名詞節
関係代名詞が来た場合、その節を関係代名詞節とし直前の名詞を修飾する。接続詞を名詞のサブノードとして付け、接続詞のサブノードにSVOCリストを付ける。節内の処理は基本的に主節の処理に準じる(図5参照)。
2−5−6.不定詞句
句内の処理と修飾の処理は基本的に節と同じである。意味上の主語が直前のfor句で指定されている場合は不定詞句のSVOCリストの主語の位置に入れる。直前にnotがある場合は不定詞句の動詞を修飾しているとする。用法の判別はまず形容詞用法を疑う。不定詞句の動詞が他動詞で目的語が欠けている場合は形容詞用法とし、直前の名詞を修飾する。次に名詞用法を疑う。調べる手順は基本的に名詞節のときと同じである。これら2つに該当しない場合は副詞用法とし、動詞を修飾する。
2−6.等位接続詞の処理
等位接続詞が何と何を等位の関係としているのか判定する。等位の関係としては、副詞、形容詞、名詞、動詞、文の5種類を考える。このうち動詞の場合は文の場合と同じ処理を行う。各品詞が等位接続詞の前後にあるかチェックし、全て該当しなかった場合は文であるとする。文以外の場合は等位接続詞から後ろにある語までの原文リストにおけるノードを切り取り、前にある語のサブノードとして貼り付ける(図6参照)。文の場合は副詞の節として動詞を修飾する処理を行う。
2−7.分詞の処理
分詞を検出した場合、用法としては、形容詞句、名詞句、現在進行形、受身文を考える。現在進行形と受身文の処理はbe動詞を削除し、分詞を動詞化する(図7参照)。形容詞句の場合はthatを補い、関係代名詞節として節の処理にまわす。名詞句の場合もやはりthatを補い、名詞節として節の処理にまわす。
2−8.there be構文の検出
この処理は2−3の前に行う。語順がthere+be動詞になっている場合はthere be構文とする。be動詞の後ろにある名詞(主語)をbe動詞の前に置いて語順を変え、thereを削除する。
2−9.形式主語と形式目的語のitの処理
これらの処理は節や不定詞句の処理の中に含まれている。名詞節や名詞的不定詞句を検査するときに、それより前にitがあるか調べ、もしあればそのitのサブノードとしてSVOCリストを付け、節がitを修飾する形をとる。
2−10.日本語の語順への変換
完成した構文解析リストをもとに、英単語を日本語の文章の並びに並べ替える。SVOCリストはリストの先頭から順に主語、目的語(補語)、動詞の順に並んでいるのでそのままの順で参照すればよい。ただし、ノードに修飾語があればそれを先に参照する(図8参照)。この時、各単語にはその単語の文型要素(SVOC)が何かを判別するためにマークを付ける。
2−11.意味の選定
単語によっては意味が複数あるものがあるのでこの処理で意味を一つに決める。例えば、形容詞に複数の意味がある場合、それが修飾している名詞の付加情報を見る。同じ付加情報があれば、その付加情報を持つ日本語訳を選び、他の訳は削除する(図9参照)。その他の比較するペアとしては、冠詞と修飾している名詞、動詞と目的語となっている名詞などがある。
2−12.助詞の付加
主語には「は」、間接目的語には「に」、直接目的語には「を」を単語の末尾に付け加える。各単語の文型要素が何であるかの判断は先に付けたマークを参照して行う。
2−13.日本文の補正
この処理では日本語を滑らかにする。動詞や形容詞の語尾を活用したり、不適切な助詞の付加を再検討したりする。語と語の連結がいびつな箇所を文字列として検知し、その文字列を補正後の文字列に置換する(図10参照)。置換対象文字列と置換文字列はファイルから読み込み、登録されている全てのパターンで置換処理を行う。
3.結論
今回作成したシステムを実際に稼動したところ、様々な問題が発生した。翻訳という作業は文章の理解に始まり、文章の作成に終わる。この作業の流れの中で最も重要なことは「意味の保持」であ る。この「意味の保持」が不完全だったため、様々な問題が発生したと考えられる。そこで、「意味の保持」の効果的な手法について考えてみる。「意味の保持」は「意味の持ち方」すなわち文章の理解と「意味の発現法」すなわち文章の作成の2つの部分から成っていると考えられる。
「意味の持ち方」についてどの点が問題であったのだろう。不定詞の副詞的用法の判別を例にとってみる。今回のシステムの設計時、一文単位で翻訳をし、文の前後関係を見ないこととした。なぜならば、文の前後関係を把握するのは困難であると考えたからである。しかしこの文脈という考え方を導入せざるを得なくなった。不定詞の副詞用法の判別をするためには文の意味を把握しなければならないからである。今回のシステムではすべて、簡易的に目的を表すこととしたが、実際には結果、条件、原因を表すこともある(図11参照)。用法の判別のためには主文と不定詞句の意味関係を把握し、不定詞句が主文の目的となっているのか、結果となっているのか、条件となっているのか、原因となっているのか判断しなければならない。これは非常に難しい問題である。なぜならば、プログラムには人間のような「前提の知識」がないからである。例えば、「満腹になった」と「食事をした」という文があったとしよう。人間はすぐにこの二つの文の関係は因果関係であることがわかる。しかしプログラムは個々の単語の意味は分かっても単語間の意味のつながりまではわからない。一方で人間には食事をすると満腹になるという「前提の知識」があるので判別がつく。
それでは、プログラム内でどのように「前提の知識」を持たせればいいのであろうか。考えられる解決法は辞書を拡充し、単語に周辺知識を持たせる方法である。主文内のある語と節(句)内のある語の間に何らかの関係があればその関係を文同士の関係に拡張する方法である。例えば、食事に「結果:満腹」という情報を加えておき、満腹という単語が他の節や句で現れたとき、文同士の関係を因果関係とする。この方式でうまくいくかどうかは、辞書の拡充の方法に依存している。登録すべき語数もさる事ながら一番重要なのは関係の種類の規定である。考えられる種類としては結果や手段などがあるが、入念な設計が必要となるであろう。
先に述べた「前提の知識」の問題点に関しては自然言語処理全般に言えるであろう。プログラムに言葉を理解させようとしたとき、その言語に関しての知識を持たせることは最低条件である。言語に関しての知識とは構文の知識や単語の意味などである。しかし、言語を理解しようとするとき我々人間はその言語に対する知識だけを用いているのであろうか。「car」と聞いて「自動車」とだけ思い浮かべることはないであろう。自動車という言葉に付随して自動車のイメージを一緒に思い浮かべたり、乗物であることを一緒に思い浮かべたりしているであろう。それは多くの場合、無意識に行われるが、人間はこれらの知識も用いて文章を理解している。この無意識のうちに思い起こされる「前提の知識」に関しても言語に対する知識と同等の重要性を持たせるべきであろう。したがって、「前提の知識」をどのようにプログラム上で表現するかが自然言語処理の一つの課題である。
次に「意味の発現法」についての問題点を考えてみる。今回作成したシステムでは助詞の付加は簡易的な処理で済ませてしまっている。簡単な文章ではこれでも問題ないが、第5文型のような複雑な文章には対応しきれていない(図12参照)。単語と単語のつなぎあわせが完璧に出来ない理由は、日本語生成のルールの複雑さにある。今回作成したシステムでは日本語の単語間のいびつなつながり部分を滑らかなつながりで上書きしている。しかし複雑といっても、一部の例外を除いては、ルールは存在している。このルールを用いた方がよりスマートなアルゴリズムになるであろう。動詞の語尾の活用を例にとって改善策を模索してみる。日本語の動詞は活用のし方が決まっているが、今回作成した辞書にはそのような情報を載せなかった。全ての助動詞に対してどのように語尾を活用させればいいのか登録しておけば対応できるであろう。
その他にも今回のシステムを作って分かったことがある。使役動詞が使われている第5文型の英文を日本語として表す場合、補語にきている動詞を適当に活用しないと滑らかな日本語にならない。この様な状況を全て網羅しつつ辞書の設計を行えば動詞の活用はよりスムーズになるであろう。
ここまで本システムについて述べてきたが、文章理解と文章作成においても同じことが言える。すなわち、「前提の知識」まで考慮した辞書を用いることが文章理解の有効な手法として挙げられ、また、言語における複雑な規則からシンプルな規則を発見してアルゴリズム化することが文章作成の有効な手法として挙げられる。
4.開発環境及び動作環境
4−1.ソフトウェア
OS:VineLinux 2.6
Linux kernel:Version 2.4.19-0vl1
Cコンパイラ:gcc-2.95.3
Cライブラリ:glibc-2.2.4-14vl14、gdb-5.0-13vl4
エディタ:Emacs-20.7.2
4−2.ハードウェア
マザーボード:K7VTA-Pro VIA KT133A+686B ATX
CPU:AMD Athron (Thunderbird) 1.2GHz
メモリ:256MB/PC133 CL3
ビデオカード:AOpen GeForce2MX/32MB AGP
ハードディスク:ST320414A 20GB 7200PM ATA100
ケース(電源):MARCURY 3001-B ATA(300W)
キーボード:6516-V6J (112KB)
マウス:SAL48 PS/2 ホイールマウス
液晶ディスプレイ:LG FRATRON575MS 15"TFT XGA
5.参考文献
(1)C言語による英和翻訳システム
柴田勝征 著 ラッセル社 1990
(2)英和翻訳システム/例文とチューンアップ
柴田勝征 著 ラッセル社 1994
(3)アナロジーによる機械翻訳 佐藤理史 著
共立出版 1997
(4)機械翻訳プログラミング入門
矢田光治 監修
日刊工業新聞社 1988
(5)コンピュータで翻訳する
長尾真・牧野武則 編著
共立出版 1995
