kakakakakku blog

Weekly Tech Blog: Keep on Learning!

JavaからMeCab(Windows)を手軽に利用する方法

JavaからMeCabを呼び出す場合,ライブラリとしてJavaバインディングが用意されてはいるものの,自分でライブラリをビルドしたりしないといけないため,手軽に使えるとは言い難い気がした.

なので,通常のMeCab(Windows)をDOS上で対話できるように設定しておくだけで,後はJavaからDOSを経由して形態素解析結果を受け取ることができるサンプルコードを書いてみた.

"C:\mecab.txt"に形態素解析対象となる文書を記載してサンプルコードを実行すると,名詞のみを抽出することができる.

C:\mecab.txt
国境の長いトンネルを抜けると雪国であった。

国境 名詞,一般,*,*,*,*,国境,コッキョウ,コッキョー
トンネル 名詞,一般,*,*,*,*,トンネル,トンネル,トンネル
雪国 名詞,一般,*,*,*,*,雪国,ユキグニ,ユキグニ

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MeCab {
 public static void main(String[] args) {
  try {
   // DOSに投げるコマンドと引数を指定する
   String[] command = { "cmd.exe", "/C", "mecab", "C:\\mecab.txt" };

   // コマンド結果をProcessで受け取る
   Process ps = Runtime.getRuntime().exec(command);

   // 標準出力
   BufferedReader bReader_i = new BufferedReader(new InputStreamReader(ps.getInputStream()));

   // 標準出力を1行ずつ受け取る一時オブジェクト
   String targetLine;

   // 形態素解析結果を全て解析する
   while (true) {

    // 形態素解析結果を1行ずつ受け取る
    targetLine = bReader_i.readLine();

    // 最終行まで解析が完了したらループを抜ける
    if (targetLine == null) {
     break;
    } else if (targetLine.equals("EOS")) {
     continue;
    } else {
     // 品詞
     String targetType = targetLine.split("[\t|,]")[1];
     if (targetType.equals("名詞")) {
      // 名詞を表示する
      System.out.println(targetLine);
     }
    }

   }

   // 終了を待つ
   ps.waitFor();

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