scalaとJavaからMeCabを食べてみよう

MeCabを使ってみよう
http://shiganaiman.hatenablog.com/entry/2012/01/23/151102

MeCabは使えるようになったので、今度はscalaから使ってみる。
scalaJavaMeCabとすれば楽勝ということでやってみる。

環境

java-mecabのインストール

$ sudo apt-get install  libmecab-java libmecab-jni

javaMeCabを食べる

EclipseからMecab.jarをBuildパスに追加して、

import org.chasen.mecab.Tagger;
public class TestJavaMecab {
  public static void main(String[] argv) {
    Tagger tagger = new Tagger("-Ochasen");
    System.out.println(tagger.parse("すももももももももものうち."));
  }
}
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.chasen.mecab.MeCabJNI.new_Tagger__SWIG_0(Ljava/lang/String;)J
	at org.chasen.mecab.MeCabJNI.new_Tagger__SWIG_0(Native Method)
	at org.chasen.mecab.Tagger.<init>(Tagger.java:124)
	at TestJavaMecab.main(TestJavaMecab.java:6)

java.lang.UnsatisfiedLinkErrorを調べると、

Java Virtual Machine が、native と宣言されたメソッドの適切なネイティブ言語の定義を見つけることができない場合にスローされます。

どうやら、JNIが定義を見つけられてないようだ。

http://code.google.com/p/mecab/
からスクリプトバインディングのソースをダウンロードしてtest.java
サンプルコードが入っているらしいので試してみる。

$ wget http://mecab.googlecode.com/files/mecab-java-0.98.tar.gz
$ tar xzvf mecab-java-0.98.tar.gz

test.javaをコピーして動かしてみる。

import org.chasen.mecab.MeCab;
import org.chasen.mecab.Tagger;
import org.chasen.mecab.Node;

public class test {
  static {
    try {
       System.loadLibrary("MeCab");
    } catch (UnsatisfiedLinkError e) {
       System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e);
       System.exit(1);
    }
  }

  public static void main(String[] argv) {
     System.out.println(MeCab.VERSION);
     Tagger tagger = new Tagger();
     String str = "太郎は二郎にこの本を渡した。";
     System.out.println(tagger.parse(str));
     Node node = tagger.parseToNode(str);
     for (;node != null; node = node.getNext()) {
	System.out.println(node.getSurface() + "\t" + node.getFeature());
     }
     System.out.println ("EOS\n");
  }
}

結果
0.98
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎	名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

	BOS/EOS,*,*,*,*,*,*,*,*
EOS

scalaMecabを食べる

import org.chasen.mecab.Tagger
import org.chasen.mecab.MeCab

object TestScalaMecab extends App {
  override
  def main(args: Array[String]) {
    System.loadLibrary("MeCab");
    var tagger = new Tagger()
    var str = "太郎は二郎にこの本を渡した。";
    println(tagger.parse(str));
    var node = tagger.parseToNode(str);
    
    while(node != null){
      println(node.getSurface() + "\t" + node.getFeature());
      node = node.getNext();
    }
  }
}

結果
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎	名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

	BOS/EOS,*,*,*,*,*,*,*,*

ごちそうさまでした。

scalaは初めて書いたので、scalaぽくないかもしれません。