Index > Yahoo Web API 日本語形態素解析サービスをJavaから使う
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 追記

旧のURLではリクエストが失敗します。

2)次のようなレスポンスがYahooからかえってきます

yahoo-keitaiso

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
 Twitter
follow me on Twitter
 Categories