LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-03

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

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

今回は形態素解析のみ取り上げます。キーワード抽出は別記事に起こしました。
なおソースはGroovyで書いてます。最近ハマっているので。

形態素解析とは

引用:gooラボ公式サイトより

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

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

手順はgooラボのサイトから
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で書いてみた

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を指定した場合


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

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

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

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

pos_filterをしていした場合


レスポンスに含める品詞をフィルタリングできます。品詞一覧はこちらから。
pos_filter: '名詞|冠名詞'の形で日本語をそのままパラメータに指定することでフィルタリングされます。

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

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

絞り込まれていますね。

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0