#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 файла:
- MeCab.jar
- 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. Я внес несколько изменений:
-
Я установил
INCLUDE
так, чтобы он указывал на OS X JAVA_HOME / include (используя/usr/libexec/java_home
утилиту, которая, как я полагаю, является стандартной при установке OS X) -
Установите второй путь включения на include
$(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=.
, но я думаю, что это, вероятно, должно работать без изменений.
Вот как выглядит мой полный 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