【发布时间】:2018-05-02 17:03:29
【问题描述】:
我正在为我的工作项目使用 Stanford-NLP 3.8.0 我正在阅读很多关于我的问题的问题,在 stackoverflow 和任何其他站点中都没有,但我仍然没有找到解决方案,并且在我正在寻找的所有地方都没有像我这样的情况,所以我创建了这个问题
在我的工作中,我需要在不依赖于 Stanford-parse 和 Stanford-models 的 Web 应用程序中使用 Stanford NLP,所以像 here 这样的解决方案不适合我。为什么没有这两个依赖项?因为它们太重了。在我的项目中,我只能加载一个 Standord-Core-Nlp 依赖项,仅此而已。
问题是下一个。
我有两个模型。第一个是来自ITMO大学学生MANASLU8项目的“russian-ud-pos.tagger”,你可以下载它here。第二个是斯坦福CRF模型english.all.3class.distim.crf.ser.gz,它是一个标准模型,你可以下载here
所以我得到了这两个文件,我得到了两个代码,几乎相同 两个代码的 pom 是相同的: edu.stanford.nlp stanford-corenlp 3.8.0
仅此而已(是的,我的 pom 没有解析器、模型等,只有 Stanford-Core)
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);
如你所见,我没有在属性对象中使用任何路径,只是文件名
当我启动我的应用程序时,它会显示下一个 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);
如您所见,我将文件分配给属性,例如 ("file:D:\english.all.3class.dissim.crf.ser.gz") 但不是 ("english.all.3class.dissim.crf.ser.gz"), 当我开始我的代码时,堆栈跟踪如下:
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
在这里,如您所见,Stanford 是“从文件加载 POS 标记器:D:\russian-ud-pos.tagger”和“从文件加载分类器:D:\english.all.3class.distim.crf。 ser.gz”,但没有加载“从 russian-ud-pos.tagger 加载 POS 标记器”,就像在第一个代码中一样
我尝试使用其他版本的 Stanford-Core-NLP(3.9.1 及更低版本)。 我正在看 Sanford NLP 的代码并调试它,但我仍然无法理解原因。 另外,我试图将文件放在 dick C 和 dick D 中(我正在考虑管理员权限)并使用管理权限启动 IDEA。 并放置一个没有“文件”的路径,例如“D:\english.all.3class.dissim.crf.ser.gz”。 另外,我试图将一些标志应用于属性,例如 ("ner.useSUTime", "false") 或 ("ner.applyNumericClassifiers", "false") 等。
听起来很奇怪,因为斯坦福加载了前两个文件,(据我了解) 为什么它不能读取最后一个?
也许斯坦福读不懂,或者不记得,或者读了不止一次
任何人,请帮助我,我试图解决这个问题大约一个星期!
【问题讨论】:
标签: java stanford-nlp part-of-speech named-entity-recognition