自然言語の曖昧性 – コンピュータは「このはしわたるべからず」がわかるか?
このブログ記事は、朝日中高生新聞2021年3月28日号の連載「プログラミングでかわる!?私たちのミライ」第5回と合わせてお読みください。朝日中高生新聞に掲載された記事全文はこちら(転載許可取得済み)。
人の話す言葉をコンピュータで解析する技術を自然言語処理と呼びます。
自然言語、というのは特に人の扱う言葉のことで、人工的に作られたプログラミング言語のような言葉のことを人工言語とよび、その対義語です。
文字入力をするときのかな漢字変換、計算機で日本語を英語に翻訳する機械翻訳、迷惑メールか否かを自動的に判定する迷惑メールフィルターなどが有名なアプリケーションです。
SF映画の世界では、コンピュータやロボットが言葉を扱うシーンはたくさん登場しますが、現実の世界で言葉を巧みに操る機械に出会うことはありません。まだ、技術が成熟していないのですね。
言葉を扱う難しさの一つが、曖昧(あいまい)性です。例を見てみましょう。
「このはしわたるべからず」

「このはしわたるべからず」
これは一休さんの有名なトンチです。一休さんは、「はし」には「橋」以外に「端」の意味があることから、真ん中を歩きました。一つの音に対して複数の単語が紐づく、同音異義語と呼ばれます。一つの表現に対して、複数の意味が対応するパターンですね。
単語レベルの曖昧性だけではなくて、文の構造に関わる曖昧性もあります。

「黒い尻尾の大きな犬」
という文を考えてみまてください。「大きい」のは何でしょう? 尻尾が大きいという解釈と、犬が大きい解釈の2通りが考えられることに気づくと思います。同様に、「黒い」も尻尾か犬か曖昧ですね。
「お子さん、ピアノがお上手ですね」
この文は文字通り読めば、ピアノの上手さを伝えているように読めますが、真意は「ピアノがうるさいよ」ということを伝える婉曲(えんきょく)表現かもしれません。
このように、単語や、文、あるいは真に伝えたい意図、という異なるレベルでの曖昧性が存在することがわかります。
逆はどうでしょう。
「ラーメン」と「中華そば」は、ニュアンスの差こそあれいずれも同じ食べ物を指しています。一つの意味に対して、複数の表現が対応するパターンですね。文の構造に対しても、「尻尾の黒い犬」と「黒い尻尾の犬」のように、異なる構造で同じ意味を表すことがあることもわかります。
「ピアノがお上手ですね」と「ピアノがうるさいよ」が同じ意図なのだとすると、この2つの表現も同じ意味とまでは言わなくとも、同じことを伝えたいという共通性があるようです。
このように、言葉による様々な表現方法と、世の中の様々な意味とが、多対多の形で複雑に結びついている。これが自然言語の持つ曖昧性の難しさなのです。
どうして曖昧性が問題になるのか?
では、なぜ曖昧性が問題なのでしょうか。
これも具体例で考えてみましょう。一休さんの逸話は、トンチなので曖昧性はわかりやすいですよね。
「机の上」といったらみなさんはどこを思い浮かべますか?普通は「机の台上に乗っている」ことを思い浮かべますよね。
では、「机の上の電気を付けて」といったらどうでしょう?もし天井に照明が取り付けられていれば、天井の照明のことを指していますよね。
「上」という単語には、乗っている状態と離れている状態の2つの解釈があることに気づくと思います。でも、デスクライトが置いてあったらどうでしょう?
普段、当たり前に使っている「上」という言葉ですら、意味は非常に曖昧で、状況によって違ってきます。

今の例は1つの表現に複数の意味があるときの曖昧性でした。逆は何が問題になるのでしょう?
もしひとつの意味に対して一つの表現しか存在しないのであれば、言葉を扱うプログラムを書くのはずっと簡単になります。「『机の上の電気をつけて』と言われたら、スイッチのところまで移動してスイッチを押す」、ということをプログラムすればよいのです。
しかし、実際は電気を付けさせるための表現はたくさんあります。「ダイニングの電気つけて」「そっちの明かり付けて」あるいは単に「電気」と言うかもしれません。
どんな指示が来ても対応できるように、ありえる全ての表現を列挙すればよいでしょうか?言葉の表現は無限に作り出せるため、ちょっと現実味がなさそうです。
このように、一つの言葉の表現に対して解釈が複数ある上に、一つの解釈に対して表現が無数にあるのです。しかし、コンピュータのプログラムにはこうした曖昧性はありません。ですから、どの解釈をすれば良いのか判断するようなプログラムをかかないと、コンピュータは動いてくれません。
解釈を間違うと、それこそ一休さんのトンチをやっているかのように、ロボットが永遠と台上を探し続けながら、「電気はどこでしょう」と質問してくるかもしれません。
寓話の中ではいいですが、日常生活でトンチをかけられるのは、ちょっと不便そうですね。
余談:人工言語と自然言語
ここでは人の話す言葉、つまり自然言語についての話を書きました。一方で、プログラミング言語は人工的に作られた言葉で、人工言語と呼ばれます。両者の解析技術の違いは何でしょう? 両者には似ている部分と異なる部分があります。いずれの言語にも、単語のような最小の単位を決定する技術、複数の単語の関係性を決定する構造の解析の技術、全体の文の意味を解釈する技術がそれぞれ存在します。
一方で、両者を決定的に分けるのが、まさに曖昧性なのです。自然言語はもともと曖昧であるため、それぞれの解析においていかに曖昧性を扱うかが解析技術の根幹になります。曖昧な解釈は組み合わせで発生するため、どの解釈が正しいのかを判定するのにはたくさんの計算が必要になります。同様に人工言語でもそうした処理を施す必要があるのでしょうか? 人工言語の場合は、どのような言語にするか自体を人が設計することができます。そのため、解析方法以前に大原則として曖昧性が入らないような言語を設計します。加えて解析に時間がかからないように作られているのです。コンピュータは決められた動作しか行わないため、コンピュータ用の言語には曖昧さがないように作る必要があるのですね。
ロボットに指示を正しく理解させるには?
PFNではロボットに指示を出して、箱の中に入っているものを移動させる研究を行いました。
例えば「右上の箱のティッシュを左に移動して」というような指示をすると、ロボットがそのとおりに行動してくれます。状況によってはティッシュが2つあって、指示の解釈が2通りあるような場合も存在します。そうしたときには、どちらのティッシュですか?とロボットが問い合わせてくれます。
こうしたロボットを作るにはどうしたらよいでしょう?
予め様々な指示に対して、どう行動したらよいか決めておくのはどうでしょう。これはうまく行きません。同じものが入っていたり、名前のわからないものも入っているため、人の指示はいつも違います。「赤のボールを取って」というかもしれませんし、「赤い玉をください」といわれるかもしれません。そもそも色ではなくて「大きい方を取ってください」と言うかもしれません。
加えて指示の表現は無数にあります。すべての指示を書き下すことはできません。表現の曖昧性ですね。こうした曖昧性が指示の解釈をするときには難しいのです。
そこで、これまでのブログにも出てきた深層学習という方法を使います。
まず、指示と実際に行うべき行動のデータをたくさん用意しておきます。データを作る時には、なるべく様々な表現に広く対応できるように、なるべく複数の異なる表現で指示を行うようにします。このデータをもとに解析を行うと、「『赤』という言葉が入っているときはいつもこの色のモノが移動しているから、これは色の情報なんだろう」「大きいというのは大きさの情報を使っているんだな」ということを機械が自動的に獲得してくれます。
作っている側は、機械がどのような情報を使っているか、どのように学習しているかはあまりわからないのです。
データに基づいて機械に判断させるような方法は、この20年位で急速に発達して、現在主流となっている方法です。
考えてみると、人も学校で文法を習うよりも前に、経験だけから言葉を喋るようになるので、人に似ているとも言えます。
インターネットには人の書いた文書が大量にありますから、これらを使って学ばせるという研究が非常に盛んに行われています。ここ数年、インターネット上から収集した膨大なデータを、膨大な数のコンピュータで解析することで、これまでにないくらい言葉の意味を解析することに成功した研究もあります。
まだまだ普通に機械と普通にお話ができるところまでは来ていませんが、みなさんが大人になる頃には機械も人も一緒におしゃべりができるようになっているかもしれません。