6

R でrJavaを介してStanfordCoreNLP ( http://nlp.stanford.edu/software/corenlp.shtml )を使用した経験がある人はいますか?私はそれを 2 日間動作させるのに苦労しており、疲れ果てたと思いますGoogle と StackOverflow に関する以前の質問。

基本的に、R 内から StanfordNLP ライブラリを使用しようとしています。Java の経験はありませんが、他の言語の経験があるため、クラスやオブジェクトなどの基本を理解しています。

私が見る限り、ライブラリに付属するデモ .java ファイルは、Java 内からクラスを使用するには、ライブラリをインポートしてから、次の行に沿って新しいオブジェクトを作成することを示しているようです。

import java.io.*;
import java.util.*;

import edu.stanford.nlp.io.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.util.*;

    public class demo {

        etc.
        etc.

        StanfordCoreNLP pipeline = new StanfordCoreNLP();

        etc.

R 内から、いくつかの標準的な Java 関数を呼び出してみました。これは問題なく動作するため、問題の原因となっているスタンフォード ライブラリにアクセスしようとしている方法だと思います。

スタンフォード ZIP をh:\stanfordcoreに展開したので、.jar ファイルはすべてこのディレクトリのルートにあります。zip に含まれる他のさまざまなファイルと同様に、メインの .jar ファイルが含まれています。

  • joda-time.jar
  • スタンフォード-corenlp-1.3.4.jar
  • スタンフォード-corenlp-1.3.4-javadoc.jar
  • スタンフォード-corenlp-1.3.4-models.jar
  • joda-time-2.1-sources.jar
  • jollyday-0.4.7-sources.jar
  • スタンフォード-corenlp-1.3.4-sources.jar
  • xom.jar
  • jollyday.jar

コマンド ラインから NLP ツールにアクセスしようとすると、正常に動作します。

R 内から、JVM を初期化し、クラスパス変数を設定しました。

.jinit(classpath = " h:/stanfordcore", parameters = getOption("java.parameters"),silent = FALSE, force.init = TRUE)

この後、コマンドを使用すると

.jclassPath() 

これは、必要な .jar ファイルを含むディレクトリが追加されたことを示しており、R で次の出力が得られます。

[1] "H:\RProject-2.15.1\library\rJava\java" "h:\スタンフォードコア"

ただし、新しいオブジェクトを作成しようとすると (これが正しい Java 用語かどうかはわかりません)、エラーが発生します。

私は何十もの異なる方法でオブジェクトを作成しようとしましたが(基本的には暗闇で撮影します)、最も有望な方法です(単に実際にクラスを見つけているように見えるからです):

pipeline <- .jnew(class="edu/stanford/nlp/pipeline/StanfordCoreNLP",check=TRUE,silent=FALSE)

クラス パラメータを API にリストされていないものに変更すると、クラスが見つからないというエラーが発生するため、これでクラスが検出されることはわかっています。

ただし、現状では、次のエラーが表示されます。

.jnew(class = "edu/stanford/nlp/pipeline/StanfordCoreNLP" のエラー、チェック = TRUE、: java.lang.NoClassDefFoundError: クラス edu.stanford.nlp.pipeline.StanfordCoreNLP を初期化できませんでした

私のグーグルは、これが必要な.jarファイルを見つけられないことに関係している可能性があることを示していますが、私は完全に立ち往生しています. 明らかな何かが欠けていますか?

誰かが私を正しい方向に少しでも向けることができれば、私は信じられないほど感謝しています.

前もって感謝します!

ピーター

4

2 に答える 2

0

成功!

何時間もいじくり回した後、なんとか回避策を見つけました。誰かが興味を持っているなら、これは私がやったことです:

  • Eclipse を使用して、新しいプロジェクトを開始しました。

  • 次に、プロジェクトのルートの下に「lib」というディレクトリを作成し、すべてのスタンフォード .jar ファイルをこのディレクトリにコピーしました。

  • この後、Eclipse でプロジェクトのプロパティを編集し、[Java ビルド パス] に移動して、[ライブラリ] タブをクリックしました。

  • 次に、Java システム ライブラリをインポートすることを選択します。

  • また、「Add External Jars」をクリックして、lib ディレクトリからすべての Stanford jar を選択しました。

  • 次に、R から直接呼び出そうとするのではなく、Stanford クラスを呼び出す中間 Java クラスを作成しました。

例:

import java.lang.Object;
import java.util.Properties;
import java.io.*;
import java.util.*;

import edu.stanford.nlp.io.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.util.*;


public class NLP {

    public static void main(String[] args) {

        Properties props = new Properties();
        props.put("annotators", "tokenize");
        StanfordCoreNLP coreNLP = new StanfordCoreNLP(props);
      }

}

これは何も返しませんが、Stanford オブジェクトを作成する方法を示しています。

  • Eclipse を使用してプロジェクトをビルドします。

  • R 内から、作業ディレクトリを Java プロジェクトの /bin ディレクトリに設定します (代わりにクラスパス ディレクトリを追加できるため、これは厳密には必要ではありませんが、作業が簡素化されます)。

次に、オブジェクトは R で次のように作成できます。

.jinit(classpath = ".")    // This initilizes the JVM
obj = .jnew("NLP")   

この後、中間 Java クラス内で作成したメソッドは次のように呼び出すことができます。

Name_of_var_to_store_return_value = . jcall(class name, signature type, method, paramters)

R からスタンフォード クラスを直接呼び出すことができない理由はまだわかりませんが、この方法は機能します。@ChristopherManning は正しいと思います。私の問題は、R から外部 jar を呼び出すことにあります。最初からビルドすることで、ビルド中にスタンフォード jar がリンクされるため、それが修正されたと思います。

于 2012-12-19T17:58:05.550 に答える