Java 斯坦福NLP,加载标记器模型时出错,从path读取模型时出错

Java 斯坦福NLP,加载标记器模型时出错,从path读取模型时出错,java,stanford-nlp,part-of-speech,ner,Java,Stanford Nlp,Part Of Speech,Ner,我正在使用斯坦福NLP 3.8.0进行我的工作项目 我读了很多关于我的问题的问题,没有在stackoverflow和任何其他网站上,但我仍然没有找到解决方案,在我寻找的所有地方都没有像我这样的情况,所以我创建了这个问题 在我的工作中,我需要在web应用程序中使用Stanford NLP,而不依赖于Stanford parse和Stanford模型,因此解决方案不适合我。为什么没有这两个依赖项?因为它们太重了。在我的项目中,我只能加载一个标准核心Nlp依赖项,仅此而已 问题是下一个 我有两个模型。

我正在使用斯坦福NLP 3.8.0进行我的工作项目 我读了很多关于我的问题的问题,没有在stackoverflow和任何其他网站上,但我仍然没有找到解决方案,在我寻找的所有地方都没有像我这样的情况,所以我创建了这个问题

在我的工作中,我需要在web应用程序中使用Stanford NLP,而不依赖于Stanford parse和Stanford模型,因此解决方案不适合我。为什么没有这两个依赖项?因为它们太重了。在我的项目中,我只能加载一个标准核心Nlp依赖项,仅此而已

问题是下一个

我有两个模型。第一个是ITMO大学学生MANASLU8项目的“俄语-ud-pos.tagger”,您可以下载。第二个是斯坦福CRF模型english.all.3class.distsim.CRF.ser.gz,它是一个标准模型,您可以下载

所以我得到了这两个文件,我得到了两个代码,几乎相同 两种代码的pom相同: edu.stanford.nlp斯坦福大学corenlp 3.8.0

这就是全部(是的,我的pom没有解析器、模型等,只有斯坦福核心)

1) 第一个代码运行良好。在这里,我将两个文件放在src/main/resources中 接下来就是代码

    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner");
    props.setProperty("pos.model", "russian-ud-pos.tagger");
    props.setProperty("ner.model", "english.all.3class.distsim.crf.ser.gz");
    props.setProperty("ner.useSUTime", "false");
    props.setProperty("ner.applyNumericClassifiers", "false");
    props.setProperty("sutime.includeRange", "false");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
如您所见,我在properties对象中不使用任何路径,只使用文件名

当我启动应用程序时,它会显示下一个stackTrace:

19:17:55.979 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator tokenize
19:17:55.994 [main] INFO  e.s.nlp.pipeline.TokenizerAnnotator - No tokenizer type provided. Defaulting to PTBTokenizer.
19:17:55.994 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator ssplit
19:17:55.994 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator pos
19:17:56.790 [main] INFO  e.s.nlp.tagger.maxent.MaxentTagger - Loading POS tagger from russian-ud-pos.tagger ... done [0.8 sec].
19:17:56.790 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator lemma
19:17:56.790 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator ner
19:18:00.737 [main] INFO  e.s.n.ie.AbstractSequenceClassifier - Loading classifier from english.all.3class.distsim.crf.ser.gz ... done [3.9 sec].
19:18:01.002 [main] INFO  e.s.nlp.tagger.maxent.MaxentTagger - Loading POS tagger from russian-ud-pos.tagger ... done [0.3 sec].
然后它成功地工作了

2) 这是第二个代码

    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner");
    props.setProperty("pos.model", "file:D:\\russian-ud-pos.tagger");
    props.setProperty("ner.model", "file:D:\\english.all.3class.distsim.crf.ser.gz");
    props.setProperty("ner.useSUTime", "false");
    props.setProperty("ner.applyNumericClassifiers", "false");
    props.setProperty("sutime.includeRange", "false");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
如您所见,我提供了将文件归档到属性的方法,如 (“文件:D:\english.all.3class.distsim.crf.ser.gz”)而不是(“english.all.3class.distsim.crf.ser.gz”), 当我启动代码时,stacktrace如下所示:

19:25:16.109 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator tokenize
19:25:16.109 [main] INFO  e.s.nlp.pipeline.TokenizerAnnotator - No tokenizer type provided. Defaulting to PTBTokenizer.
19:25:16.125 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator ssplit
19:25:16.125 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator pos
19:25:16.936 [main] INFO  e.s.nlp.tagger.maxent.MaxentTagger - Loading POS tagger from file:D:\russian-ud-pos.tagger ... done [0.8 sec].
19:25:16.936 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator lemma
19:25:16.936 [main] INFO  e.s.nlp.pipeline.StanfordCoreNLP - Adding annotator ner
19:25:21.257 [main] INFO  e.s.n.ie.AbstractSequenceClassifier - Loading classifier from file:D:\english.all.3class.distsim.crf.ser.gz ... done [4.2 sec].

edu.stanford.nlp.io.RuntimeIOException: Error while loading a tagger model (probably missing model file)

at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:791)
at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:312)
at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:265)
at stanfordapplication.StanfordApplication.start(StanfordApplication.java:49)
at Test1.stanfordStringReader(Test1.java:56)
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:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.io.IOException: Unable to open "russian-ud-pos.tagger" as class path, filename or URL
at edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:480)
at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:789)
... 26 more

Process finished with exit code -1
19:25:16.109[main]INFO e.s.nlp.pipeline.StanfordCoreNLP-添加注释器标记化
19:25:16.109[主]信息e.s.nlp.pipeline.TokenizerNotator-未提供标记器类型。默认为PTBTokenizer。
19:25:16.125[main]INFO e.s.nlp.pipeline.StanfordCoreNLP-添加注释器ssplit
19:25:16.125[主]信息e.s.nlp.pipeline.StanfordCoreNLP-添加注释器位置
19:25:16.936[main]INFO e.s.nlp.tagger.maxent.MaxentTagger-正在从文件D:\俄语-ud-POS.tagger加载POS tagger。。。完成[0.8秒]。
19:25:16.936[main]INFO e.s.nlp.pipeline.StanfordCoreNLP-添加注释器引理
19:25:16.936[main]INFO e.s.nlp.pipeline.StanfordCoreNLP-添加注释器
19:25:21.257[main]INFO e.s.n.ie.AbstractSequenceClassifier-从文件D:\english.all.3class.distsim.crf.ser.gz加载分类器。。。完成[4.2秒]。
edu.stanford.nlp.io.RuntimeIOException:加载标记器模型时出错(可能缺少模型文件)
位于edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:791)
在edu.stanford.nlp.tagger.maxent.MaxentTagger.(MaxentTagger.java:312)
在edu.stanford.nlp.tagger.maxent.MaxentTagger.(MaxentTagger.java:265)
位于stanfordapplication.stanfordapplication.start(stanfordapplication.java:49)
位于Test1.stanfordStringReader(Test1.java:56)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:137)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
位于com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
原因:java.io.IOException:无法将“俄语-ud-pos.tagger”作为类路径、文件名或URL打开
在edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:480)上
位于edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:789)
... 26多
进程已完成,退出代码为-1
在这里,正如您所看到的,斯坦福是“从文件D:\russian-ud-POS.tagger加载POS标记器”和“从文件D:\english.all.3class.distsim.crf.ser.gz加载分类器”,但没有像第一个代码那样加载“从russian-ud-POS.tagger加载POS标记器”

我试图使用其他版本的斯坦福核心NLP(3.9.1及以下)。 我当时正在看Sanford NLP的代码并对其进行调试,但我仍然无法理解其中的原因。 另外,我试图把文件放在迪克C和迪克D中(我考虑的是管理员权限),然后从管理权限开始。 并放置一个不带“file”的路径,如“D:\english.all.3class.distsim.crf.ser.gz”。 另外,我还尝试将一些标志应用于属性,如(“ner.useSUTime”、“false”)或(“ner.applyNumericClassifiers”、“false”)等

听起来很奇怪,因为斯坦福加载了前两个文件(据我所知) 为什么它读不到最后一段

也许吧