使用R中的Stanford NLP库,使用rJava包

使用R中的Stanford NLP库,使用rJava包,java,r,stanford-nlp,rjava,Java,R,Stanford Nlp,Rjava,有人有在R中使用StanfordCoreNLP(通过rJava)的经验吗?我已经努力让它工作了两天了,我想我已经把Google和以前关于StackOverflow的问题都问完了 基本上,我试图从R内部使用StanfordNLP库。我没有Java经验,但有其他语言的经验,因此了解类和对象等的基础知识 据我所见,库附带的demo.java文件似乎表明,要使用java中的类,您需要导入库,然后创建一个新对象,如下所示: import java.io.*; import java.util.*; im

有人有在R中使用StanfordCoreNLP(通过rJava)的经验吗?我已经努力让它工作了两天了,我想我已经把Google和以前关于StackOverflow的问题都问完了

基本上,我试图从R内部使用StanfordNLP库。我没有Java经验,但有其他语言的经验,因此了解类和对象等的基础知识

据我所见,库附带的demo.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函数;这很好,这让我认为是我试图访问斯坦福图书馆的方式导致了这个问题

我将Stanford 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
  • stanford-corenlp-1.3.4-sources.jar
  • xom.jar
  • jollyday.jar
如果我尝试从命令行访问NLP工具,它可以正常工作

在R中,我初始化了JVM并设置了classpath变量:

.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:\stanfordcore”

然而,当我尝试创建一个新对象(不确定这是否是正确的Java术语)时,我得到了一个错误

我尝试过用几十种不同的方式创建对象(虽然基本上是在黑暗中拍摄),但最有希望的方式是(因为它似乎真的找到了类):

管道成功

经过几个小时的修修补补,我终于找到了工作。如果有人感兴趣,我就是这么做的:

  • 使用Eclipse,我启动了一个新项目

  • 然后,我在项目根目录下创建了一个名为“lib”的目录,并将所有Stanford.jar文件复制到这个目录中

  • 在此之后,我在Eclipse中编辑了项目的属性,转到“Java构建路径”,单击库选项卡

  • 然后,我选择导入Java系统库

  • 我还单击了“添加外部JAR”,并从lib目录中选择了所有Stanford JAR

  • 然后,我创建了Intermediariary Java类来调用Stanford类(而不是试图直接从R调用它们)

例如:

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目录(这不是严格必需的,因为您可以添加classpath目录,但它简化了事情)

然后,可以在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调用Stanford类,但这个方法是有效的。我怀疑@ChristopherManning是对的,我的问题在于从R调用外部jar。通过从头开始构建,Stanford jar在构建过程中是链接的,所以我想这就是修复它的方法。

您的类路径I这是错误的-您使用的是一个目录,但您有JAR文件。您必须将所有JAR文件解压缩到指定的目录中(不常见),或者将所有JAR文件添加到类路径中(更常见)。[显然,您必须修复您的打字错误,但我假设这些错误来自您没有使用复制/粘贴的事实]


PS:如果您想要更及时的回答,请使用邮件列表。

没有,但我在openNLP方面取得了很好的成功,它似乎完成了您的目标:。在这和
tm
包之间,我认为您将拥有一系列经过测试的工具,并且可以很容易地使用R。我没有rjava经验,我的第一次尝试也失败了。(我确实在rjava帮助中看到,它建议使用.jpackage,而不是像您一样使用.jinit。)但这只是找不到类时出现的一般性错误。您的问题似乎并不特定于StanfordCoreNLP,而是学习如何让rjava在jar文件中加载任何外部库的问题……谢谢@Tylerlinker。实际上,我已经有了一个使用tm、OpenNLP和Wordnet的设置,这很好。但是,对于我的新project I确实需要一个语法分析器,它似乎仍处于OpenNLP的实验阶段(至少文档在其网站上所说的).斯坦福图书馆有一个很棒的解析器,它包括预先训练好的模型,所以如果我能让它与R一起工作,那将是完美的。@ChristopherManning:谢谢。不过,我刚刚尝试调用一个外部的“hello world”类(如下面的回答:)它工作得很好,所以对于更复杂的.jar文件结构,我可能需要做一些稍微不同的事情(尽管我也尝试过提取.jar文件并直接引用类文件,但仍然是相同的错误)…谢谢!我曾尝试将StanfordCore JAR文件直接添加到类路径中,但没有意识到我还需要添加其他JAR…我想我太天真了。我刚刚用正确的类路径测试了我的R代码,现在它正在工作,再次感谢!
Name_of_var_to_store_return_value = . jcall(class name, signature type, method, paramters)