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で書いてみた
@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: '名詞|冠名詞'
の形で日本語をそのままパラメータに指定することでフィルタリングされます。
********** 解析前の文章 **********
これはサンプルの文字列です。任意の文字列を解析したい場合は、プログラムの引数に文字列を指定してください。
********** 解析後の文章 **********
[[[これ, 名詞], [サンプル, 名詞], [文字列, 名詞]], [[任意, 名詞], [文字列, 名詞], [解析, 名詞], [プログラム, 名詞], [引数, 名詞], [文字列, 名詞], [指定, 名詞]]]
絞り込まれていますね。
補足〜制限事項について〜
利用制限にリクエスト回数とリクエストサイズがあるようなので、解析対象テキストは適度なサイズに区切った方が良さそうですね。