Как скомпилировать 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 файлов:
- MeCab.jar
- libMeCab.so
Однако это предполагает, что вашей платформой является Linux, у вас есть доступ к программе make, и ваши Java-включения находятся по адресу /usr/local/jdk/include.
Если это не так, попробуйте прочитать Makefile и посмотреть, сможете ли вы создать его в своей среде.
Для OS X I обновлен мой make-файл. Я сделал несколько изменений:
Я установил
INCLUDE
указать на OS X JAVA_HOME/include (используя/usr/libexec/java_home
утилита, которая, я считаю, является стандартной при установке OS X)Установите второй путь включения для включения
$(INCLUDE)/darwin
вместо/linux
- Измените команду CXX, чтобы создать dylib вместо библиотеки linux .so, используя
-dynamiclib
флаг компилятора. - Я также переименовал библиотеку, потому что обычная библиотека mecab и jni-оболочка по какой-то причине созданы с одним и тем же именем, и поскольку при установке по умолчанию OS X будет использоваться файловая система без учета регистра, это может быть очень проблематично. Вместо строительства
lib$(TARGET).so
Я строюlib$(TARGET)Jni.dylib
- Я также изменил 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