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

#java #unicode #classpath #text-analysis #mecab

#java #unicode #путь к классу #анализ текста #mecab

Вопрос:

Я пытаюсь использовать MeCab (http://mecab.sourceforge.net/#download ) выполнить сегментацию японских предложений по словам, а также пометить каждое слово частью речи. Я установил MeCab, следуя этим инструкциямhttp://mecab.sourceforge.net/#install-unix. Поскольку я не хочу писать сценарии оболочки для обработки 150 000 предложений (поскольку у моего терминала Mac OS X проблемы с отображением японских символов), я использую существующую привязку для 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 ("EOSn");
  }
}
  

Вот 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 тест -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. Есть идеи, ребята? Спасибо!

Ответ №1:

Вы впервые запускали 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, чтобы посмотреть, сможете ли вы создать его в своей собственной среде.

Комментарии:

1. На самом деле я использую Mac OS X 10.6.7. Похоже, мне нужно изменить следующие две строки в Makefile: 1) INCLUDE=/usr/local /jdk /include; 2) INC = mecab-config --cflags -I $ (ВКЛЮЧИТЬ) -I$(ВКЛЮЧИТЬ) / linux. Знаете ли вы, какие значения должны быть в правой части каждого из этих назначений? Спасибо!

2. Я внес следующие изменения в Makefile: INCLUDE=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK INC = mecab-config --cflags -I $ (INCLUDE) -I $ (INCLUDE) / macOS Однако у меня все еще есть ошибки: MeCab_wrap.cxx: 159: 17: ошибка: jni.h: нет такого файла или каталога MeCab_wrap.cxx: 183: ошибка : переменная или поле ‘swig_javathrow exception’ объявлено недействительным MeCab_wrap.cxx:183: ошибка: ‘JNIEnv’ не был объявлен в этой области MeCab_wrap.cxx:183: ошибка: ‘jenv’ не был объявлен в этой области MeCab_wrap.cxx:183: ошибка: ожидаемое первичное выражение перед ‘code’

3. Никогда не пробовал это на Mac OS, но это может помочь. hideki.posterous.com/using-mecab-from-java-on-mac-os-x

4. хорошо, после изменения на INCLUDE=/System/Library/Frameworks/JavaVM.framework/Headers ‘sudo make’ работает. Теперь, какова точная команда для компиляции и запуска test.java ? Я делаю: 1) javac test.java ; 2) java — classpath MeCab.jar тест -d /usr/local/lib/mecab/dic. Это не работает, есть какие-нибудь советы?

5. Когда я делаю ‘make test’, он выводит, make: Ничего не нужно делать для `test’. Почему это?

Ответ №2:

Для OS X я обновил свой makefile. Я внес несколько изменений:

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

  2. Установите второй путь включения на include $(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=. , но я думаю, что это, вероятно, должно работать без изменений.

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

 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