Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用Stanford CoreNLP(3.5.2)进行并行处理_Multithreading_Concurrency_Stanford Nlp - Fatal编程技术网

Multithreading 使用Stanford CoreNLP(3.5.2)进行并行处理

Multithreading 使用Stanford CoreNLP(3.5.2)进行并行处理,multithreading,concurrency,stanford-nlp,Multithreading,Concurrency,Stanford Nlp,我在同时注释多个句子时面临并发问题。我不清楚我是否做错了什么,或者CoreNLP中是否有bug 我的目标是使用几个并行运行的线程,使用管道“tokenize、ssplit、pos、lemma、ner、parse、dcoref”注释句子。每个线程分配自己的StanfordCoreNLP实例,然后将其用于注释 问题在于,在某个时刻会引发异常: java.util.ConcurrentModificationException 在java.util.ArrayList$Itr.checkForCom

我在同时注释多个句子时面临并发问题。我不清楚我是否做错了什么,或者CoreNLP中是否有bug

我的目标是使用几个并行运行的线程,使用管道“tokenize、ssplit、pos、lemma、ner、parse、dcoref”注释句子。每个线程分配自己的StanfordCoreNLP实例,然后将其用于注释

问题在于,在某个时刻会引发异常:

java.util.ConcurrentModificationException
在java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)中
在java.util.ArrayList$Itr.next(ArrayList.java:851)
位于java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1042)
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:463)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.analyzeNode(grammaticstructure.java:488)上
在edu.stanford.nlp.trees.grammaticstructure.(grammaticstructure.java:201)
在edu.stanford.nlp.trees.EnglishGrammaticStructure.(EnglishGrammaticStructure.java:89)
位于edu.stanford.nlp.semgraph.SemanticGraphFactory.makeFromTree(SemanticGraphFactory.java:139)
位于edu.stanford.nlp.pipeline.deterministicCoreFarnotator.annotate(deterministicCoreFarnotator.java:89)
位于edu.stanford.nlp.pipeline.AnnotationPipeline.annotate(AnnotationPipeline.java:68)

在edu.stanford.nlp.pipeline.StanfordCoreNLP.annotate(StanfordCoreNLP.java:412)
您是否尝试过使用
线程
选项?您可以为单个
StanfordCoreNLP
管道指定多个线程,然后它将并行处理语句

例如,如果要在8个核上处理句子,请将
threads
选项设置为
8

Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
props.put("threads", "8")
StanfordCoreNLP pipeline  = new StanfordCoreNLP(props);

尽管如此,我认为您的解决方案也应该有效,我们将检查是否存在一些并发错误,但同时使用此选项可能会解决您的问题。

我也遇到了同样的问题,使用最新的github版本(今天)的构建解决了问题。因此,我认为这是一个自3.5.2以来已经解决的CoreNLP问题


另请参见

谢谢您的建议。我想试试,但我不知道如何使用该界面。假设我设置了“threads”属性,我应该如何传递要并行注释的句子?使用多个使用相同StanfordCoreNLP实例的线程?或者通过一种不同于“annotate()”的方法同时传递几个句子?谢谢调用
注释的构造函数的参数实际上不是一个句子,而是一个完整的文档。在
语句
变量中存储多个(甚至全部)句子,并用“\n”分隔。还可以将选项“ssplit.eolonly”设置为“true”,以防止分句器错误地拆分实际句子。解析之后,注释对象包含一个句子列表,其中每个句子都有解析、词性、引理等注释。谢谢,我试过了。但是,注释由“\n”分隔的多个句子的模式有问题,或者我做错了什么。我能解析100个句子,但不是1000或2000个。当输入1000或2000个句子时,对annotate()的调用将无休止地运行。此外,当我用100个句子进行测试时,1、2或4个线程(我的硬件有4个)之间的性能几乎没有差别。它比使用单个线程一次调用一个句子的annotate()稍慢。我这里有一个更新的示例代码:要运行它,可以使用3个参数:annotationMode-要么“一起”(一次调用annotate(),多个句子用“\n”分隔)要么“分开”(多次调用annotate()每一个都有一句话);coresMode-单芯、一半芯数或所有芯;MaxQuences—要分析的最大句子数。如果您能尝试运行此代码并让我知道您是否能够重现这些问题,我将不胜感激。@RajVJain-什么答案?谢谢您的更新。我会在他们发布新版本时尝试。