SSブログ

Windows上のEclipse(java)でCaboChaを利用する [プログラミング]

放置しすぎて申し訳ありません。
落ち着くとおもいきやそうでもなく、結局更新するタイミングを失っていました。
やる気なくてすいませんが、しばらくは気まぐれで更新します。


Windows上のEclipse(java)でCaboChaを利用するやり方について

係り受け解析器であるCabochaをプログラミングで利用したいと思ったのだが、
いまいち調べてもぱっとしたやりかたが出てこなかったのでここで走り書きしておく。
(正確に言えば本当はできていたのだが、いろいろ不都合があり調べ直した)
形態素解析であるMeCabについては、cmecabというjavaバインディングがあり、
きちんと設定すれば簡単に利用することができたが、CaboChaに関しては
同様のバインディングが見つからず、困った。
自分はこういうものを作れるほど能力は無いので、何かないかと
いろいろ調べた結果、cabocha4jと呼ばれるライブラリに辿り着いた。
詳しくは↓

cabocha4j - Java ライブラリ for CaboCha (日本語係り受け解析プログラム)


この製作者の方は、システム関数ProcessBuilderを用いてcabocha.exeを実行し、
その結果を受け取るという形を取ってライブラリを作られていた。
(実はシステム関数を用いてやるやり方は分かっており、実装していたのだが、
execを使うやり方しか知らず、ファイルからしか文字を読み込めなかったため
非常に処理が遅くなり、不都合があったので調べなおしていた)
しかし、なぜだか分からないがSentenceへ代入する際に色々とエラーを吐かれた。
また、実行結果もプログラミングをやる上では形が少し扱いにくい。
一応結果としては正しいものが出てくるのだが、
実行結果の形式を変更するやり方がよくわからなかった。
ライブラリを再構築できるほどプログラミングの力はないので
ソースコードを参考にもっと単純な関数を考えてみた。
プログラミングで都合良く使えるためにラティス形式で結果を表示するだけ。
要は根幹部分だけを取り出しただけなので、取得方法はほとんど改変はしていない。

また、これを実行するにあたり、MeCab及びCaboChaのインストールは前提である。
インストール時には全てUTF-8を選択すること。
また、mecab.exeやcabocha.exeのパスは通しておくこと(やり方は割愛)。

以下コード



//String型で文字列を受け取り、それを係り受け解析する関数
public void Run(String text){
try {

//UTF-8のBOMを除去するための準備←textファイルから読み込む場合を考慮
byte [] bytes = {-17, -69, -65};
String btmp= new String(bytes, "UTF-8");

//BOM除去
text=text.replaceAll(btmp, "");

//cabochaの実行開始 ラティス形式で出力(-f1の部分で決定、詳しくはcabochaのhelp参照)
ProcessBuilder pb = new ProcessBuilder("cabocha", "-f1");
Process process = pb.start();

//実行途中で文字列を入力(コマンドプロンプトで文字を入力する操作)
OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream(), "UTF-8");
osw.write(text);
osw.close();

//出力結果を読み込む
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));

//一行ずつ読み込むための文字列の変数を用意
String Line="";

//出力結果の各行毎に配列へ格納するためのリストを用意
ArrayList out = new ArrayList();

//最後の行までやり続ける
while ((Line = br.readLine()) != null) {
//読み込んだ行をリストへ格納
out.add(Line);

//行をコンソールへ表示
System.out.println(Line);
}

//プロセス終了
process.destroy();
process.waitFor();

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}


結局システム関数を用いてcabocha.exeを直接叩くことはするので、
処理時間に関してはあまり速さが望めない。

この関数に「太郎は朝からランニングをし、ラーメンをたらふく食べて4時まで昼寝していた。」
という文字列を引数に与えて実行すれば、次のような結果がコンソールに表示される。


* 0 8D 0/1 -0.382872
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 3D 0/1 0.870252
朝 名詞,副詞可能,*,*,*,*,朝,アサ,アサ
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
* 2 3D 0/1 3.087035
ランニング 名詞,一般,*,*,*,*,ランニング,ランニング,ランニング
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 3 8D 0/0 -0.382872
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
、 記号,読点,*,*,*,*,、,、,、
* 4 6D 0/1 1.254916
ラーメン 名詞,一般,*,*,*,*,ラーメン,ラーメン,ラーメン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 5 6D 0/0 1.151057
たらふく 副詞,一般,*,*,*,*,たらふく,タラフク,タラフク
* 6 8D 0/1 -0.382872
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
* 7 8D 1/2 -0.382872
4 名詞,数,*,*,*,*,*
時 名詞,接尾,助数詞,*,*,*,時,ジ,ジ
まで 助詞,副助詞,*,*,*,*,まで,マデ,マデ
* 8 -1D 1/4 0.000000
昼寝 名詞,サ変接続,*,*,*,*,昼寝,ヒルネ,ヒルネ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS


この関数の場合、outというリストにこの結果の各行が格納される。
単語と品詞の間の部分は「\t」というタブがあるので、
もし例えば各行の要素を取り出したい場合は、「\t」及び「,」で区切ることで可能となる。
単語の行だけ取り出したければ、EOSや*の判定を加えれば除外して取り出すことは出来るかと。
用途によってその辺の応用は効くはず。以上。
とにかくcabocha4jの作者様に感謝。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。