1

我正在尝试使用 MeCab (http://mecab.sourceforge.net/#download) 对日语句子进行分词,并按词性标记每个单词。我按照这些说明http://mecab.sourceforge.net/#install-unix安装了 MeCab 。由于我不想编写 shell 脚本来处理 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 ("EOS\n");
  }
}

这是自述文件:

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。有什么想法吗,伙计们?谢谢!

4

2 回答 2

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 以查看是否可以在自己的环境中构建它。

于 2011-05-04T03:45:57.253 回答
0

对于 OS XI,更新了我的 makefile。我做了几个改变:

  1. 我将 设置INCLUDE为指向 OS X JAVA_HOME/include (使用该/usr/libexec/java_home实用程序,我认为这是 OS X 安装的标准)

  2. 将第二个包含路径设置为包含$(INCLUDE)/darwin而不是/linux

  3. -dynamiclib更改 CXX 命令以使用编译器标志构建 dylib 而不是 linux .so 库。
  4. 我还重命名了库,因为常规的 mecab 库和 jni 包装器出于某种原因使用相同的名称构建,并且由于默认的 OS X 安装将使用不区分大小写的文件系统,这可能会产生很大的问题。lib$(TARGET).so我在建造而不是建造lib$(TARGET)Jni.dylib
  5. 我还在make testto中更改了 LD_LIBRARY_PATH ,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
于 2016-03-02T07:15:08.073 回答