gooラボ　形態素解析APIをGroovyを使って試してみる

gooラボが提供する形態素解析APIを使ってみます。無料で使用することもでき、問い合わせることにより商用利用も可能なようです。
ぼんやりとWebアプリ上でサーバーと対話的に情報交換できるサービスって作れないかなと思い始め、形態素解析、キーワード抽出を試してみたいと思います。

形態素解析、キーワード抽出関係のAPIはgooラボの他に、Yahooでも提供しているようですが、今回はgooラボを試してみます。
時間があったらyahooも試してみて比較とかしてみたいですね。

今回は形態素解析のみ取り上げます。キーワード抽出は[別記事](http://qiita.com/shohei1913/items/1db5369f4406ab883300)に起こしました。
なおソースはGroovyで書いてます。最近ハマっているので。
# 形態素解析とは

引用：[gooラボ公式サイト](https://labs.goo.ne.jp/api/2015/334/)より
> 形態素解析とは、自然言語で書かれた文章（テキストデータ）から、文法や辞書を参照し、「形態素」と呼ばれる単語単位(例：「この」、「商品」、「は」など)に分割し、各々の形態素の品詞等を識別する事を指します。コンピュータによる自然言語処理技術の一つとして、検索エンジン、かな漢字変換、機械翻訳、キーワード出現頻度分析などに用いられます。


# 事前準備〜APIを使えるようにするまで〜

手順はgooラボの[サイト](https://labs.goo.ne.jp/apiusage/)から
1. GitHubのアカウントを登録する
2. アプリケーションIDの取得
GitHubと連携しているので、GitHubのアカウントさえ持っていれば非常に簡単にスタートできるのがいいですね。

# 使い方
`https://labs.goo.ne.jp/api/morph`に対してリクエストをなげる。application/x-www-form-urlencoded、application/json形式のPOSTのみ対応しているそうで、GETは受け付けてない点に注意。

## パラメータ一覧
app_id : アプリケーションID
request_id : リクエストID ※省略可、レスポンス時に同値が戻ってくる
sentence : 解析対象テキスト
into_filter : 形態素情報フィルター
pos_filter : 形態素品詞フィルター

## Groovyで書いてみた
```groovy:MorphologicalAnalysis.groovy
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.6')
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.URLENC

//引数に解析対象文字列を指定
def target
if(args.size()>=1){
  target = args[0]
}else{
  //引数に文字列が指定されていない場合
  target = 'これはサンプルの文字列です。任意の文字列を解析したい場合は、プログラムの引数に文字列を指定してください。'
}

//解析
def morpheme = devideIntoMorpheme(target)

println '********** 翻訳前の文章 **********'
println target
println '********** 翻訳後の文章 **********'
println morpheme

/** 入力文を形態素解析する */
def devideIntoMorpheme(target){
    def http = new HTTPBuilder( 'https://labs.goo.ne.jp/api/morph' )
    http.post( body: [app_id: '{取得したアプリケーションID}',
                      sentence: target,
                      info_filter: 'form|pos',
                      pos_filter: '名詞|冠名詞'],
             requestContentType: URLENC ) { resp,reader  ->

        if (resp.status == 200) {
            return reader.word_list
        }
        else if (resp.status == 404) {
            println "Access denied"
        }
        else {
            println "Unexpected failure: ${resp.statusLine}"
        }
    }
}
```

実行はこんな感じ

```
groovy MorphologicalAnalysis.groovy 形態素解析したい文字列
```

## into_filterとpos_filterについて

何もしていしない場合、以下のように形態素解析されます。
全ての情報がレスポンスに含まれます。

```

********** 解析前の文章 **********
これはサンプルの文字列です。任意の文字列を解析したい場合は、プログラムの引数に文字列を指定してください。

********** 解析後の文章 **********
[[[これ, 名詞, コレ], [は, 連用助詞, ハ], [サンプル, 名詞, サンプル], [の, 格助詞, ノ], [文字列, 名詞, モジレツ], [です, 判定詞, デス], [。, 句点, ＄]], [[任意, 名詞, ニンイ], [の, 格助詞, ノ], [文字列, 名詞, モジレツ], [を, 格助詞, ヲ], [解析, 名詞, カイセキ], [し, 動詞活用語尾, シ], [た, 動詞接尾辞, タ], [い, 形容詞接尾辞, イ], [場合, 補助名詞, バアイ], [は, 連用助詞, ハ], [、, 読点, ＄], [プログラム, 名詞, プログラム], [の, 格助詞, ノ], [引数, 名詞, ヒキスウ], [に, 格助詞, ニ], [文字列, 名詞, モジレツ], [を, 格助詞, ヲ], [指定, 名詞, シテイ], [し, 動詞活用語尾, シ], [て, 動詞接尾辞, テ], [くださ, 動詞語幹, クダサ], [い, 動詞接尾辞, イ], [。, 句点, ＄]]]
```

### into_filterを指定した場合
***
レスポンスに含める情報をフィルタリングできます。全部で３つ、*form*,*pos*,*read*を指定でき、`info_filter: 'form|pos'`という形で指定します。
指定してリクエストを投げると以下のように取れます。

```
********** 解析前の文章 **********
これはサンプルの文字列です。任意の文字列を解析したい場合は、プログラムの引数に文字列を指定してください。

********** 解析後の文章 **********
[[[これ, 名詞], [は, 連用助詞], [サンプル, 名詞], [の, 格助詞], [文字列, 名詞], [です, 判定詞], [。, 句点]], [[任意, 名詞], [の, 格助詞], [文字列, 名詞], [を, 格助詞], [解析, 名詞], [し, 動詞活用語尾], [た, 動詞接尾辞], [い, 形容詞接尾辞], [場合, 補助名詞], [は, 連用助詞], [、, 読点], [プログラム, 名詞], [の, 格助詞], [引数, 名詞], [に, 格助詞], [文字列, 名詞], [を, 格助詞], [指定, 名詞], [し, 動詞活用語尾], [て, 動詞接尾辞], [くださ, 動詞語幹], [い, 動詞接尾辞], [。, 句点]]]

```

取得した内容から「読み」が消えてますね。

###  pos_filterをしていした場合
***
レスポンスに含める品詞をフィルタリングできます。品詞一覧は[こちら](https://labs.goo.ne.jp/api/2015/1158/)から。
`pos_filter: '名詞|冠名詞'`の形で日本語をそのままパラメータに指定することでフィルタリングされます。

```
********** 解析前の文章 **********
これはサンプルの文字列です。任意の文字列を解析したい場合は、プログラムの引数に文字列を指定してください。

********** 解析後の文章 **********
[[[これ, 名詞], [サンプル, 名詞], [文字列, 名詞]], [[任意, 名詞], [文字列, 名詞], [解析, 名詞], [プログラム, 名詞], [引数, 名詞], [文字列, 名詞], [指定, 名詞]]]
```

絞り込まれていますね。

# 補足〜制限事項について〜

利用制限にリクエスト回数とリクエストサイズがあるようなので、解析対象テキストは適度なサイズに区切った方が良さそうですね。