scalaとJavaからMeCabを食べてみよう
MeCabを使ってみよう
http://shiganaiman.hatenablog.com/entry/2012/01/23/151102
MeCabは使えるようになったので、今度はscalaから使ってみる。
scala→Java→MeCabとすれば楽勝ということでやってみる。
javaでMeCabを食べる
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
scalaでMecabを食べる
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,*,*,*,*,*,*,*,*
ごちそうさまでした。