お問い合わせ採用情報お客様ログイン

RONDHUIT

テクノロジINFORMATION

ホーム > テクノロジ > [OpenNLP] 最大エントロピー法とパーセプトロンの分類器を使う

[OpenNLP] 最大エントロピー法とパーセプトロンの分類器を使う

2012.07.18

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]

参考文献


▲ ページの先頭に戻る

ピックアップ

お問い合わせ

 

PAGE TOP
HOME
Apache Solr, Lucene, Hadoop, Mahout, Spark, ManifoldCF, UIMA and their logos are trademarks of the Apache Software Foundation.
Copyright © 2006-2017 RONDHUIT Co, Ltd. All Rights Reserved.