Как скомпилировать Java-файл, который вызывает MeCab - японский анализатор речи и морфологии?

Я пытаюсь использовать MeCab (http://mecab.sourceforge.net/#download) для сегментации слов в японских предложениях, а также для обозначения каждого слова частью речи. Я установил MeCab, следуя этим инструкциям http://mecab.sourceforge.net/. Поскольку я не хочу писать сценарии оболочки для обработки 150000 предложений (поскольку у моего Mac OS X Terminal возникают проблемы с отображением японских символов), я использую существующую привязку для Java: http://sourceforge.net/projects/mecab/files/mecab-java/0.98pre3/. На данный момент я пытаюсь скомпилировать и запустить данный файл 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");
  }
}

Вот README:

1. Build UTF-8 dictionary

2. How to use?

  See test.java as sample program.

  % java -classpath MeCab.jar test -d ../dic

Я компилирую: javac test.java. Затем я запускаю: java -classpath MeCab.jar test -d ../dic. Результатом является следующая ошибка:

Exception in thread "main" java.lang.NoClassDefFoundError: //
Caused by: java.lang.ClassNotFoundException: ..
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

Я не совсем понимаю иерархию этого каталога mecab-java-0.98pre3, поэтому не вижу, как на самом деле скомпилировать и запустить этот test.java. Есть идеи, ребята? Спасибо!

2 ответа

Решение

Вы первый раз запускаете make? Первым шагом является создание библиотеки привязки mecab-java.

$ tar -xvzf mecab-java-0.xx.tar.gz
$ cd mecab-java-0.xx
$ make

Это приведет к выводу следующих 2 файлов:

  1. MeCab.jar
  2. libMeCab.so

Однако это предполагает, что вашей платформой является Linux, у вас есть доступ к программе make, и ваши Java-включения находятся по адресу /usr/local/jdk/include.

Если это не так, попробуйте прочитать Makefile и посмотреть, сможете ли вы создать его в своей среде.

Для OS X I обновлен мой make-файл. Я сделал несколько изменений:

  1. Я установил INCLUDE указать на OS X JAVA_HOME/include (используя /usr/libexec/java_home утилита, которая, я считаю, является стандартной при установке OS X)

  2. Установите второй путь включения для включения $(INCLUDE)/darwin вместо /linux

  3. Измените команду CXX, чтобы создать dylib вместо библиотеки linux .so, используя -dynamiclib флаг компилятора.
  4. Я также переименовал библиотеку, потому что обычная библиотека mecab и jni-оболочка по какой-то причине созданы с одним и тем же именем, и поскольку при установке по умолчанию OS X будет использоваться файловая система без учета регистра, это может быть очень проблематично. Вместо строительства lib$(TARGET).so Я строю lib$(TARGET)Jni.dylib
  5. Я также изменил LD_LIBRARY_PATH в make test в DYLIB_FALLBACK_LIBRARY_PATH=. но я думаю, что, вероятно, должно работать без изменений.

Вот как выглядит мой полный make-файл.

TARGET=MeCab
JAVAC=javac
JAVA=java
JAR=jar
CXX=c++
INCLUDE=$(shell echo `/usr/libexec/java_home`/include)

PACKAGE=org/chasen/mecab

LIBS=`mecab-config --libs`
INC=`mecab-config --cflags` -I$(INCLUDE) -I$(INCLUDE)/darwin

all:
    $(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx  $(INC)
    $(CXX) -dynamiclib  $(TARGET)_wrap.o -o lib$(TARGET)Jni.dylib $(LIBS)
    $(JAVAC) $(PACKAGE)/*.java
    $(JAVAC) test.java
    $(JAR) cfv $(TARGET).jar $(PACKAGE)/*.class

test:
    env DYLD_FALLBACK_LIBRARY_PATH=. $(JAVA) test

clean:
    rm -fr *.jar *.o *.so *.class $(PACKAGE)/*.class

cleanall:
    rm -fr $(TARGET).java *.cxx
Другие вопросы по тегам