Index > Twitterのつぶやきを分解して単語リストを返す(Javaを使用)
Wed, December 9, 2009

Twitterのつぶやきを分解して単語リストを返す(Javaを使用)

Twitter API で指定したユーザのつぶやきを取得したら 今度はこれを単語に分解しようという話。

単語分解するには、日本語形態素解析ツールが必要なのだが、 Androidで実行するのは無理があるので、とりあえず Yahooの日本語形態素解析サービス に処理を任せて、結果だけをAndroidで受け取るようにつくろう、と。

SplitterTest.java

このコードは、別途JSONライブラリが必要です。 http://www.json.org/java/index.html から入手します。 AndroidにもこのJSONライブラリが採用されているようなので使用しました。

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.XML;

public class SplitterTest {

    private String appid;
    public SplitterTest(String appid){
        this.appid=appid;
    }

    public ArrayList<String> split( String text ) {

        ArrayList<String> list=new ArrayList<String>();

        StringBuffer sb=new StringBuffer();

        try{

            //
            // 1) Yahoo日本語形態素解析に問い合わせ
            //

            //String filter="1|2|4|5|9|10";
            String filter="9|10";//名詞と動詞
            //String filter="9";//名詞のみ


            String url = "http://jlp.yahooapis.jp/MAService/V1/parse?" +
            "appid=" + this.appid +
            "&sentence=" + URLEncoder.encode(text, "UTF-8") +
            "&response=surface" +
            "&filter=" + filter +
            "&results=ma";



            URL myurl = new URL(url);

            BufferedReader br = new BufferedReader( new InputStreamReader( myurl.openStream() ,"UTF-8") );
            while(true){
                String line = br.readLine();
                if(line==null)
                    break;
                sb.append(line);
            }

            br.close();


            //
            // 2) 結果のXMLをJSONObjectに変換してから、単語を取得して配列にして返す
            //

            JSONObject obj = XML.toJSONObject(sb.toString());
            //System.out.println(obj);

            JSONObject oResultSet = obj.getJSONObject("ResultSet");
            JSONObject oMa        = oResultSet.getJSONObject("ma_result");
            JSONObject oWordList  = oMa.getJSONObject("word_list");
            JSONArray  wordArray  = oWordList.getJSONArray("word"); 
            //System.out.println(wordArray);

            for(int i=0; i<wordArray.length(); i++){
                JSONObject o = (JSONObject)wordArray.get(i);

                //String word  = (String)o.get("surface");
                //list.add( word );

                Object obj = o.get("surface");
            if( obj!=null ){
                    String word  = obj.toString();
                    list.add( word );
            }
            }

        }
        catch(Exception ex){
            ex.printStackTrace();
        }

         return list;
    }
}

JSONライブラリのXMLクラスを使って XMLをJSONオブジェクトに変換すると、かなり扱いが楽です。 JDOMなどが使えれば、XMLのまま処理しても楽なんですが、Android上での利用を考えると JSONライブラリはかなり重宝しそうです。

説明

Yahooの日本語形態素解析サービス を使うには、アプリケーションIDが必要なので、 取得しておきます。 そのIDを使って以下のように SplitterTest を利用します。

String appid = ""; // set your app id

Splitter sp = new Splitter(appid);
ArrayList<String> words = sp.split(status);
for(String word : words){
    System.out.println(word);
}
 Twitter
follow me on Twitter
 Categories