INFORMATION
テクノロジ
[OpenNLP] 最大エントロピー法とパーセプトロンの分類器を使う
Apache OpenNLPとは?
Apache OpenNLP(以下OpenNLP)は、統計的自然言語処理(Statistical Natural Language Processing)のためのツールキットです。Javaで実装されたOSSの自然言語処理(NLP)ライブラリであり、2010年11月にApache Incubatorに寄贈され、2012年2月にApacheのトップレベルプロジェクト(TLP)に昇格しました。自然言語処理と検索エンジンは技術的な関連が深いため、OpenNLPの知識があると、Solrの機能を改善したりパワーアップするのに大いに役立ちます。たとえばLUCENE-2899では、OpenNLPのトークナイザーをSolrから使うための改善提案が行われています。
OpenNLP関連記事の第一弾となる本稿では、OpenNLPの利用知識の入門として、OpenNLPに附属している機械学習機能を使う方法をご紹介します。
OpenNLPの機械学習機能
統計的自然言語処理では、訓練データからさまざまな統計情報を学習し、NLPにおける曖昧性解消を行うための分類器を用います。OpenNLPにも機械学習を用いた以下の分類器(Classifier)が備わっています:
- 最大エントロピー法
- パーセプトロン
それぞれの分類器について詳しくは、後述の参考資料を参照してください。 これらの分類器はNLPだけでなく、一般的な機械学習の分類器として用いることができます。
OpenNLPの分類器を使う
ではさっそく、これらの分類器を使ってみましょう。OpenNLPはJavaのライブラリなので、使うためにはJavaのプログラムを書く必要があります。しかしそれではちょっと大変なので、OpenNLPに附属のサンプルプログラムとデータを使う方法をここでは紹介します。OpenNLPの準備
まずはOpenNLPを入手します。OpenNLPのサンプルにはバグがあるため、OPENNLP-516のパッチが必要です。そのためソースコード管理システムSubversionから以下のようにしてtrunk版のOpenNLPを入手してください:$ mkdir work; cd work $ svn co http://svn.apache.org/repos/asf/opennlp/trunk OPENNLP次にパッチをダウンロードして適用します:
$ cd OPENNLP $ wget https://issues.apache.org/jira/secure/attachment/12533987/OPENNLP-516.patch $ patch -p0 < OPENNLP-516.patch patching file opennlp-maxent/samples/sports/CreateModel.java [/bash] 最後に次のようにビルドすれば準備完了です: [bash] $ cd opennlp $ mvn install [/bash] <h4>OpenNLP附属サンプルの実行</h4> OpenNLPのサンプルプログラムには、以下のものが用意されています: <ul> <li>CreateModel</li> <li>Predict</li> </ul> CreateModelは、以下に紹介するサンプルデータのうち、拡張子が.datの訓練データを読み込み、Model.txtという接尾辞のついたモデルファイルを出力するプログラムです。そしてPredictは、そのモデルファイルを読み込み、拡張子が.testのテストデータの(分類)質問に答えるプログラムです。<br/><br/> サンプルデータとしては、以下のものがあります: <ul> <li>football</li> <li>gameLocation</li> <li>realTeam</li> </ul> footballは、サッカーチームの「試合会場」「出場/欠場選手」「監督の状態」「前回の試合結果」を素性としたデータで、試合結果を当てようというものです。 gameLocationは、「天候」「気分」「湿度」を素性としたデータで、試合会場が「アウトドアかインドアか」を当てようというものです。 realTeamは、実数値素性を用いたデータで、「勝敗」を当てるものです。CreateModelとPredictプログラムの実行の際には-realオプションが必要です。ここではfootballデータを使ったサンプルプログラムの実行方法を説明します。<br/><br/> ちなみに、footballの訓練データとテストデータは、それぞれ以下のような内容になっています: [bash] # 訓練データ $ head samples/sports/football.dat home=man_united Beckham=false Scholes=true Neville=true Henry=true Kanu=true Parlour=false Ferguson=confident Wengler=tense arsenal_lost_previous man_united_won_previous arsenal home=man_united Beckham=true Scholes=false Neville=true Henry=false Kanu=true Parlour=false Ferguson=tense Wengler=confident arsenal_won_previous man_united_lost_previous man_united home=man_united Beckham=false Scholes=true Neville=true Henry=true Kanu=true Parlour=false Ferguson=tense Wengler=tense arsenal_lost_previous man_united_won_previous tie home=man_united Beckham=true Scholes=true Neville=false Henry=true Kanu=false Parlour=false Ferguson=confident Wengler=confident arsenal_won_previous man_united_won_previous tie home=man_united Beckham=false Scholes=true Neville=true Henry=true Kanu=true Parlour=false Ferguson=confident Wengler=tense arsenal_won_previous man_united_won_previous arsenal home=man_united Beckham=false Scholes=true Neville=true Henry=false Kanu=true Parlour=false Ferguson=confident Wengler=confident arsenal_won_previous man_united_won_previous man_united home=man_united Beckham=true Scholes=true Neville=false Henry=true Kanu=true Parlour=false Ferguson=confident Wengler=tense arsenal_won_previous man_united_won_previous man_united home=arsenal Beckham=false Scholes=true Neville=true Henry=true Kanu=true Parlour=false Ferguson=confident Wengler=tense arsenal_lost_previous man_united_won_previous arsenal home=arsenal Beckham=true Scholes=false Neville=true Henry=false Kanu=true Parlour=false Ferguson=tense Wengler=confident arsenal_won_previous man_united_lost_previous arsenal home=arsenal Beckham=false Scholes=true Neville=true Henry=true Kanu=true Parlour=false Ferguson=tense Wengler=tense arsenal_lost_previous man_united_won_previous tie # テストデータ $ head samples/sports/football.test home=arsenal ? home=man_united arsenal_won_previous man_united_won_previous Wengler=tense ? home=man_united Beckham=true Henry=true ? home=arsenal Beckham=false Henry=true ? home=arsenal Beckham=true Henry=false ?まず、次のようにして訓練データを読み込み、モデルファイルを作成します:
# 最大エントロピー法の場合 $ java CreateModel football.dat # パーセプトロンの場合 $ java CreateModel -perceptron football.datすると、footballModel.txtというモデルファイルができます。次に、以下のようにテストデータを指定して質問(分類問題)を解いてみます:
# 最大エントロピー法の場合 $ java Predict football.test # パーセプトロンの場合 $ java Predict -perceptron football.testすると次のように結果が確率付きで表示されます:
$ java Predict football.test For context: home=arsenal arsenal[0.6715] man_united[0.2290] tie[0.0995] For context: home=man_united arsenal_won_previous man_united_won_previous Wengler=tense arsenal[0.3259] man_united[0.3409] tie[0.3331] For context: home=man_united Beckham=true Henry=true arsenal[0.1499] man_united[0.2060] tie[0.6441] For context: home=arsenal Beckham=false Henry=true arsenal[0.7549] man_united[0.0468] tie[0.1983] For context: home=arsenal Beckham=true Henry=false arsenal[0.3201] man_united[0.6343] tie[0.0456]
参考文献
INFORMATION
KandaSearch
KandaSearch はクラウド型企業向け検索エンジンサービスです。
オープンAPIでカスタマイズが自由にできます。
セミナー
企業が検索エンジンを選定する際のポイントから、
実際の導入デモをお客様ご自身でご体験!