exec()を使わずに、Javaからmecabを呼べるのか
※前提
mecabを呼ぶ専用のライブラリは使わない。
JavaではなくGroovyを使う!!
環境はVirtualBoxで仮想化したUbuntu10.04、IDEはNetbeans6.8を使った。
(Netbeansだと、数クリックでGroovyを有効にできるのでw)
Groovyのコード
import java.util.ArrayList; /** * * @author Syu-syu */ public class mecab { public ArrayList<String> mecabStart(ArrayList<String> list){ ArrayList <String> result = new ArrayList<String>(); for(String s : list){ result.add(this.getMorph(s)); } return result; } public String getMorph(String str){ def String sentence = str; sentence = sentence.replaceAll("\"","''"); def String command = "/usr/bin/mecab"; return new Pipe("echo ${sentence}").to(command).text(); } } def class Pipe { private Process p; def Pipe(cmd){ p = cmd.execute(); p.out.close(); } def to(cmd){ def p2 = cmd.execute(); p2.out << p.in; p2.out.close(); p=p2; this; } def text(){ p.text; } }
def to(cmd)や、def text()など、returnがないものがあります。
Groovyは最後の表記を勝手にreturnしてくれるので、書かなくてもよい。
書いた方がわかりやすいかも・・・
別のJavaプログラムから、文章のリストArrayList
mecabStartがgetMorphメソッドのreturnでPipeを動かして、投げられたリストの数分、形態素解析をしてくれます。
結果を受け取るJavaのプログラム
mecab mecab_result = new mecab();
ArrayList<String> morphlogical_result = mecab_result.mecabStart(inputdata);
Groovyのコードはstaticじゃないので、newしてあげる。
上記のコードでは、mecab_resultという変数をmecab型で宣言してます。
それで、mecab_result.mecabStart();が実行できる。
mecabStart(inputdata);のinputdataは入力された文章を1文ごとにリスト化したArrayList