Multithreading 使用Stanford CoreNLP(3.5.2)进行并行处理
我在同时注释多个句子时面临并发问题。我不清楚我是否做错了什么,或者CoreNLP中是否有bug 我的目标是使用几个并行运行的线程,使用管道“tokenize、ssplit、pos、lemma、ner、parse、dcoref”注释句子。每个线程分配自己的StanfordCoreNLP实例,然后将其用于注释 问题在于,在某个时刻会引发异常: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
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-什么答案?谢谢您的更新。我会在他们发布新版本时尝试。