2010年11月24日水曜日

自然言語処理とプログラミングと設計

ちょっと前の記事ですが、最近知って読みました。

プログラミングと設計は本来切り離せないものなのでは(達人プログラマーを目指して)

プログラミングという世界全体を見ると、完全に同意です。
そして更に、自然言語処理という世界から見ると、より厳しくなっていきます。

>> そういった設計は事前に設計図上で時間をかけて検討するということは可能であり、

自然言語処理においては、昔も今も、事前設計が可能だとは限りません。
なぜなら、自然言語処理プログラムおいては要求仕様(ユーザが期待する機能・性能)を100%実現することは出来ないからです。

たとえば、電卓プログラムを例にとって考えてみましょう。
人間は、時間をかければ計算できます。でも、省力化したい。そこで電卓が活躍します。
これは、100%実現可能です。事前設計も100%可能です。(GUIの調整などは除く、機能の話です)

それでは、たとえば、仮名漢字変換を例にとってみましょう。
人間は、辞書を引きさえすれば漢字にすることは可能です。でも省力化したい。そこで仮名漢字変換システムが活躍します。
これは、100%実現することは不可能です。なぜなら、実は人間でさえ間違えることがあるから。
「かのう」を漢字にしてみましょう。ここまでの文の流れから「可能」を思いつくと思います。
しかし、本当は「叶」「化膿」「加納」…どれが正しいのでしょうか?
ユーザに取ってみれば、その中の一つであることは自明なのですが、単純に辞書引きでは決定できません。これを改善するために様々な技術開発がなされていますが、未だ完璧ではありません。

物事が出来ないというとき、いくつかの段階があると考えています。

 (0) 社員のやる気がない
 (1) 社内のリソース不足(人手/時間/技術力・能力)
 (2) 世の中に、実現するための技術が、(現在)存在しない
   ただし、近似的に実現する技術は存在する
 (3) それを実現することは、未来永劫不可能である

0番は論外ですが、自然言語処理関係のプログラムでは、1番か2番あるいはその狭間で悩んでいるのが現実ではないでしょうか。
しかし、自然言語処理が何たるかを正しく理解しない、管理職や経営者は、簡単に製品化が実現するものと思い込んでしまいます。
もちろん、彼らも、過去においては、同じような問題に直面していたのかもしれませんが、それを解決したと勘違いしているに過ぎません。それは、上記の2番での「近似的に実現する技術」を用いることによってです。
それまで、0点だったものを80点、90点にしたことによるインパクトは大きいです。
ところが、90点から95点に引き上げるためには別の技術が必要で、95点から99点にするためには更に別の技術が必要です。

話が少しずれてしまいました。
自然言語のおける技術は、本質的には近似解を求める技術の固まりであると考えられます。
問題は、どの技術/方法が、その時点での解決法として最適であるかと言うことです。
自然言語では同じ意図を表すのに無数の表現が存在します。
そして、その境界を決めることはきわめて困難です。

従って、現実的な対応としたら、やってみて、文句が出たら修正する。ということになりましょうか。
もう少し、堅い言い回しをすれば、「アジャイル開発的手法を用いて、ユーザの要求の変化に対して柔軟に対処する」ということです。

※もちろん、自然言語処理を冠したプログラムでも、確定的に対応できる問題を対象としている場合もあります。ここで述べているのはあくまで一般論です。