使用 StanfordCoreNLP 时出错

Error when using StanfordCoreNLP

我正尝试在我的 java 程序中使用 Stanford CoreNLP 作为库。我使用 IntelliJ 作为 IDE。 我试图测试这个库,所以我写了这段代码:

import edu.stanford.nlp.pipeline.StanfordCoreNLP;

import java.util.Properties;

/**
 * Created by Benjamin on 15/5/4.
 */
public class SentimentAnaTest {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
        StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
    }
}

它显示如下错误:

Adding annotator tokenize
TokenizerAnnotator: No tokenizer type provided. Defaulting to PTBTokenizer.
Adding annotator ssplit
Adding annotator pos
Exception in thread "main" java.lang.RuntimeException: edu.stanford.nlp.io.RuntimeIOException: Unrecoverable error while loading a tagger model
    at edu.stanford.nlp.pipeline.AnnotatorFactories.create(AnnotatorFactories.java:292)
    at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:85)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.construct(StanfordCoreNLP.java:289)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:126)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:122)
    at SentimentAnaTest.main(SentimentAnaTest.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: edu.stanford.nlp.io.RuntimeIOException: Unrecoverable error while loading a tagger model
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:770)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:298)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:263)
    at edu.stanford.nlp.pipeline.POSTaggerAnnotator.loadModel(POSTaggerAnnotator.java:97)
    at edu.stanford.nlp.pipeline.POSTaggerAnnotator.<init>(POSTaggerAnnotator.java:77)
    at edu.stanford.nlp.pipeline.AnnotatorImplementations.posTagger(AnnotatorImplementations.java:59)
    at edu.stanford.nlp.pipeline.AnnotatorFactories.create(AnnotatorFactories.java:290)
    ... 10 more
Caused by: java.io.IOException: Unable to resolve "edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger" as either class path, filename or URL
    at edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:481)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:765)
    ... 16 more

我阅读了解决方案 here 但无法弄清楚问题出在哪里,因为我从 Maven 中央存储库添加了库,其中已经包含 "stanford-corenlp-3.5.2-models.jar".

从错误消息来看,程序似乎正在尝试从 edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger 加载文件,所以我从 here 下载标记器文件并将其放入 /edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger。然而还是不行。

谁能告诉我这个错误是怎么回事并帮助我解决它?谢谢!

标记器文件必须放在您的项目根目录中。

project
-- src --> SentimentAnaTest
-- english-left3words/english-left3words-distsim.tagger

在 Eclipse 项目中测试。

我遇到了同样的问题。固定使用:

<dependencies>
<dependency>
    <groupId>edu.stanford.nlp</groupId>
    <artifactId>stanford-corenlp</artifactId>
    <version>3.5.2</version>
</dependency>
<dependency>
    <groupId>edu.stanford.nlp</groupId>
    <artifactId>stanford-corenlp</artifactId>
    <version>3.5.2</version>
    <classifier>models</classifier>
</dependency>
</dependencies>

或 SBT:

"edu.stanford.nlp" % "stanford-corenlp" % "3.5.2",
"edu.stanford.nlp" % "stanford-corenlp" % "3.5.2" classifier "models",

问题可能是您通过 jar 文件启动服务器,您必须从已编译的类中创建该文件,因此请确保在将所需文件放入文件夹位置后重新创建 jar在错误控制台上看到。 重新创建 jar 后,启动服务器。

我遇到了同样的错误,花了很长时间才弄明白。本质上,我们需要两个主要的 jar 文件来解决错误。一个是稳定版3.6.0和当前版本3.7.0

因此,请从以下 link and link 下载这两个 jar 文件。现在提取这两个 jar 文件。 3.7.0 jar文件的解压文件夹目前没有models文件夹。在3.6.0 jar文件解压后的文件夹中可以找到这个文件夹。

将该文件夹从 3.6 版本复制到 3.7 版本。

现在从根文件夹 运行 执行以下命令:

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

它应该 运行 完美。要使用服务器,请遵循此 py-corenlp