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);
}