1

Stanford NER と Stanford POS tagger を 1 つのアプリケーションで使用しようとしています。IncompatibleClassChangeErrorPOS tagger メソッドを実行しようとすると取得します。

クラス パスに NER と POS タガーの両方の jar ファイルがあります。クラスパスから NER の jar を削除すると、このエラーは発生しません。NER jar と POS jar に共通のクラスがいくつかあると思いますが、java は実行時にどのクラスを使用するかを判断できません。

以下はスタックトレースです:

java.lang.IncompatibleClassChangeError: Implementing class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.init(MaxentTagger.java:407)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:699)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:673)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:280)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:260)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.runTagger(MaxentTagger.java:1305)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.main(MaxentTagger.java:1499)
    at com.tcs.srl.stanford.POSWrapper.executePOSTagger(POSWrapper.java:39)
    at com.tcs.srl.stanford.test.POSWrapperTester.ExecutePOSTagger(POSWrapperTester.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

このエラーが発生する理由がわかりません。

4

2 に答える 2

1

これはよく知られた問題のようで、スタンフォードの人々はこの問題を認識しています。NER parser のメーリングリストにメールを送ったところ、John という人から次のような返事がありました。

これは既知の問題で、1 週間程度で修正される予定です。それまでの間、これら 2 つのライブラリに必要なすべてのクラスは StanfordCoreNLP にあります。

ジョン

彼らは API からこのバグを取り除こうとしているようで、パーサーとタガーの次のリリースではクリーンな API を取得する予定です。

現在、ここで入手できる CoreNLP パッケージを使用しています。この CoreNLP パッケージには、パーサー、タガー、ner などのすべてが含まれています。

于 2011-05-16T05:45:41.240 に答える
1

あなたは近いと思いますが、あなたの診断は完全には正しくありません。Java は常に、クラスパス内のクラスの最初のインスタンスを使用します。ただし、クラスローダーの階層があり、子クラスローダーが親が既に定義したクラスを定義しようとすると、このようなエラーが発生します。

私はスタンフォードの NER や POS コードに詳しくありません。ただし、いくつかのアドバイスを提供できます。

同じ名前のクラスが 2 つの jar で同一であると確信している場合は、2 つの jar を 1 つの jar に結合するだけです。これにより、重複が削除されます。

NER と POS のコードに互換性がないのではないかと心配している場合は、2 つのソース コードを 1 つのプロジェクトに移動し、再コンパイルして、重複を注意深く調べます。

別の方法として、1 つのプロジェクトからソース コードを取得し、それを別のパッケージに移動して、クラス名は同じままにしますが、パッケージは衝突しなくなります。優れた IDE は、これをかなり簡単に実行できるはずです。

ただし、このメーリング リストのような問題については、多くの場合、アドバイスを得るのに最適な場所です: http://www-nlp.stanford.edu/software/CRF-NER.shtml。これらのソフトウェアを一緒に使用しているのはあなただけではないと確信しています。上記の解決策はどれも必要ないはずなので、それらを使用している他の人からアドバイスを受けるのがおそらく最善です.

于 2011-05-13T08:23:24.920 に答える