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)が備わっています:
  • 最大エントロピー法
  • パーセプトロン
最大エントロピー法では、未知データに対する確率分布を一様にする確率計算を行います。パーセプトロンは生物の神経細胞(ニューロセル)を模した関数を複数組み合わせたニューラルネットのうち、フィードフォワード型の単純なネットワークを構成するものです。それぞれopennlp.maxentとopennlp.perceptronパッケージに実装が提供されています。

それぞれの分類器について詳しくは、後述の参考資料を参照してください。 これらの分類器は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
&#91;/bash&#93;

最後に次のようにビルドすれば準備完了です:

&#91;bash&#93;
$ cd opennlp
$ mvn install
&#91;/bash&#93;

<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]

参考文献


KandaSearch

KandaSearch はクラウド型企業向け検索エンジンサービスです。
オープンAPIでカスタマイズが自由にできます。

  • セマンティックサーチ

    人間が理解するように検索エンジンがテキストや画像を理解して検索できます。

  • クローラー

    検索対象文書を収集するWebクローラーが使えます。

  • 簡単操作のUIと豊富なライブラリー

    検索や辞書UIに加え、定義済み専門用語辞書/類義語辞書やプラグインがあります。

  • ローコードで低コスト導入

    検索UIで使い勝手を調整した後、Webアプリケーションを自動生成できます。

セミナー

企業が検索エンジンを選定する際のポイントから、
実際の導入デモをお客様ご自身でご体験!