Sun, August 2, 2009
Yahoo Web API 日本語形態素解析サービスをJavaから使う
以前のエントリーでPython経由で日本語形態素サービスを使う方法を書きましたが、 今回はJavaから使います。
WebAPIなので、HTTP-GET とか POSTメソッドを使うため、Javaの場合、jakarta-commons の HTTPClientあたりを 使わないと簡単にかけないんじゃないかと思って敬遠してきたのですが、 こちらのページでは、 標準のJavaAPIだけでできているようなので、わたしもJavaで実装してみたのでメモ。
形態素分析は通常は、日本語を適切な単位に区切り、その品詞などを得る目的で使用するのだと思いますが、 今回は単によみがなを得たいという目的だけにフォーカスします。
全体の仕組み
1)以下のようなURLをリクエスト
http://jlp.yahooapis.jp/MAService/V1/parse?
appid=YourAppId&sentence=こんにちは世界&response=reading&results=ma
※「こんにちは世界」がかなに変換したいセンテンスです。
本当はこれをURLEncodeしてからYahooWebサービスに渡します。
リクエストするURLが変わったみたいです(とっくの昔の話かも)... 2009-08-25 追記
- 新) ... http://jlp.yahooapis.jp/MAService/V1/parse?
- 旧) ... http://api.jlp.yahoo.co.jp/MAService/V1/parse?
旧のURLではリクエストが失敗します。
2)次のようなレスポンスがYahooからかえってきます

3)戻ってきたXMLデータから必要な部分だけを jdom を使って取り出します。
画面上では確認できませんが、 以下のように名前空間が指定されているので、jdomでパースするときはその点注意が必要です。
xmlns="urn:yahoo:jp:jlp"
コード
import java.net.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class YahooWebApi {
private String appid;
public YahooWebApi(String appid){
this.appid=appid;
}
public String[] toKanaList( String text ) throws Exception{
ArrayList readingList=new ArrayList();
//String url = "http://api.jlp.yahoo.co.jp/MAService/V1/parse?"+
String url = "http://jlp.yahooapis.jp/MAService/V1/parse?" +
"appid=" + this.appid +
"&sentence=" + URLEncoder.encode(text, "UTF-8") +
"&response=reading" +
"&filter=" +
"&results=ma";
//System.out.println( url );
Document doc=new SAXBuilder().build(new URL(url));
Namespace ns=Namespace.getNamespace("urn:yahoo:jp:jlp");
Element eRoot=doc.getRootElement();
List list=eRoot.getChild("ma_result",ns).getChild("word_list",ns).getChildren("word",ns);
for(int i=0; i<list.size(); i++){
Element eWord=(Element)list.get(i);
Element eReading=eWord.getChild("reading",ns);
if(eReading!=null){
String r=eReading.getText();
readingList.add( r );
}
}
return (String[])readingList.toArray(new String[0]);
}
public static void main(String[] args){
if( args.length<1 ){
System.exit(0);
}
String appid=args[0];
YahooWebApi y=new YahooWebApi(appid);
try{
String[] list=y.toKanaList("こんにちは世界");
for(int i=0; i<list.length; i++)
System.out.println(list[i]);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
実行方法
jdom.jarをあらかじめ入手して、同じディレクトリに配置しておきます。
$ javac -classpath jdom.jar YahooWebApi.java
$ java -cp jdom.jar:. YahooWebApi yourAppId
- ※appidを実行時に第一引数として指定することをお忘れなく。
- ※Java6 で処理しました。たぶんJava1.4 でも作動すると思います(テストしてません。)