2010年2月6日土曜日

構文解析が何に役立つのか

思いがけずたくさんブックマークしていただいたので,この機会になんで構文解析なんかやるのかというお話を書こうと思います.おそらく,NLP界隈の人には何をいまさらと思われるかもしれませんが,それが本当に役立つかというとなかなか一筋縄では行きません.今回興味を持たれた方の多くはNLP分野外の方なんじゃないかな,と勝手に考えてますのでそのつもりで書きます.

構文解析というのは,文の構造を判別する処理のことで,NLP的には単語分割,品詞タグ付け(いわゆる形態素解析)のあとにくる処理です.ソフトウェアで言えばCabochaやKNPがこれにあたります.ここに大変わかり易いチュートリアルがありますw 例えば「値段の高いワイン」が,「値段のワイン」ではなくて,「値段の高い」「高いワイン」であることを認識する技術,と理解していただければ良いと思います.このように,文節間の係り関係を解析することを,係り受け解析(dependency parsing)といいます.これとは別に,phrase structure parsingもあるのですが,ここでは置いときます.
では,文の構造がわかると何が嬉しいのか.案外これが自明ではないです.非NLP屋さんでも,Webテキストをクロールして単語分割してBoWでTf/IDF重みのベクトルにして,やれ類似度,やれ検索というようなことをしている友人はたくさんいるのですが,なかなか構文解析まで使っている人はいないようです.私の感触では「検索」という文脈は構文解析とあまり相性がよくないようです.なぜかというと,Web検索するとき,ふつう単語を入れますよね? クエリが単語の時点で構文情報を使いようがないのです.
じゃぁ,いらんやん・・・,とはなりません.NLPの応用は単純な単語検索,類似文書検索だけではないのですね.たとえば,「エンジン」「故障」みたいな単語間の関係を取り出したいとします.単純な単語共起で調べると,「エンジンをかけたらエアコンが故障した」のように,それエアコンですから!というのが取れてしまってげんなりします.しかし,構文木上では,「エンジン→かける」「エアコン→故障」なので,故障したのがエンジンでないことは自明です.これは情報抽出と呼ばれる処理の一種ですね.もっとも,話はそんなに単純ではなくて,「故障したエンジン」みたいに修飾関係が逆になっていたり,「エンジンの調子が悪いと思ったら,故障した」みたいに遠くの係り関係から推論しないといけない例もあったり,一筋縄ではいきません.ここが情報抽出の難しくも面白いところではあるんですが.
ここまではNLPの話で,最後に抽出された関係を集約してデータマイニング的な処理にかけて関係の出現の偏りを見ます.すると,どの製品にどんな不具合がわかったりといった応用ができます.仕事でやっているので先輩のデモを見て知っているのですが,本当にいろいろ見つかるようでなかなか面白いです.ここまでの生テキストから知見を得るまでを総じてテキストマイニングと呼ばれ,すでに商品が市場に出回っています.しかし,B2Bなので一般の人の目には触れられないようですね.実際は,これに加えてスケーラビリティが特に問題になるので,データ構造やインデクシングが重要になります.

これはあくまで一例で,自然文検索など単語間の関係に着目して検索するアプリケーションもあります.もちろん,もっと高度な機械翻訳や質問応答の前処理としても使われますが,構文情報(+情報抽出)のみからでもいろいろ応用が考えられるよ,というはなしでした.

0 件のコメント:

コメントを投稿