2017-01-01 67 views
1

首先,解析在一小組句子上運行平滑 - 按200ms到1s的順序 - 取決於句子大小。斯坦福分析器 - 多線程問題 - LexicalizedParser

我想實現什麼?

我想在1-2小時內解析50L句子。

不知怎的,我需要轉換這一點 - >

  for(String sentence: sentences){ 
       Tree parsed = AnalysisUtilities.getInstance().parseSentence(job).parse; 
      } 

到多線程調用。 我寫了一個多線程的執行要做到這一點,它看起來像這樣 - >

   MultiThreadExecutor<String> mte = new MultiThreadExecutor<String>(2, new JobExecutor<String>() { 
       @Override 
       public void executeJob(String job) { 
        Tree parsed = AnalysisUtilities.getInstance().parseSentence(job).parse; 
        inputTrees.add(parsed); 
       } 
      }, ""); 


      for(String sentence: sentences){ 
       mte.addJob(sentence); 
      } 

它工作正常,在一個線程中,但只要我給多線程它與斯坦福解析內部例外打破功能。例外是這樣的 - >

java.lang.ArrayIndexOutOfBoundsException:3 在java.util.ArrayList.add(ArrayList.java:441) 在edu.stanford.nlp.parser.lexparser.BaseLexicon.initRulesWithWord (BaseLexicon.java:300) at edu.stanford.nlp.parser.lexparser.BaseLexicon.isKnown(BaseLexicon.java:160) at edu.stanford.nlp.parser.lexparser.BaseLexicon.ruleIteratorByWord(BaseLexicon.java:212 ) 在edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.initializeChart(ExhaustivePCFGParser.java:1299) 在edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.parse(ExhaustivePCFGParser.java:388) 在edu.stan ford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:234) at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:189) at edu.cmu.ark.AnalysisUtilities。 (edu.cmu.ark.QuestionAsker $ 1.executeJob(QuestionAsker.java:144) at edu。 cmu.ark.MultiThreadExecutor $ 1.run(MultiThreadExecutor.java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java :615) at java.lang.Thread.run(Thread.java:745) java.lang.RuntimeException:依賴不等於:「寬敞/ CD「 - >」。*。/ CC「左邊0和」寬敞/ CD「 - >」easy/RB「右邊1 at edu.stanford.nlp.parser.lexparser.MLEDependencyGrammar.probTB(MLEDependencyGrammar.java: 586) 在edu.stanford.nlp.parser.lexparser.MLEDependencyGrammar.scoreTB(MLEDependencyGrammar.java:511) 在edu.stanford.nlp.parser.lexparser.AbstractDependencyGrammar.scoreTB(AbstractDependencyGrammar.java:229) 在EDU。 stanford.nlp.parser.lexparser.ExhaustiveDependencyParser.parse(ExhaustiveDependencyParser.java:322) at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:244) at edu.stanford.nlp.parser。 lexparser.LexicalizedParser.parse(LexicalizedParser.java:189) at edu.cmu.ark.AnalysisUtilities.parseSentence(AnalysisUtilities.java:262) at ed在edu.cmu.ark.QuestionAsker $ 1.executeJob(QuestionAsker.java:144) at edu.cmu.ark.MultiThreadExecutor $ 1.run(MultiThreadExecutor .java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor。的java:615) 在java.lang.Thread.run(Thread.java:745) 顯示java.lang.NullPointerException 在edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.projectHooks(BiLexPCFGParser.java:342) 在edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.processEdge(BiLexPCFGParser.java:546) at edu.stanford.nlp.parser.lexparser.BiLexPCFGParser.processItem(BiLexPCFGParser.java:571) at edu.stanford.nlp。 parser.lexparser.BiLexPCFGParser.parse(BiLexPCFGParser.java:854) at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:255) at edu.stanford.nlp.parser.lexparser.LexicalizedParser。解析(LexicalizedParser.java:189) at edu.cmu.ark.AnalysisUtilities.parseSentence(AnalysisUtilities.java:262) at edu.cmu.ark.QuestionAsker $ 1.executeJob(QuestionAsker.java:147) at edu.cmu.ark.QuestionAsker $ 1.executeJob(QuestionAsker.java:144) at edu.cmu.ark.MultiThreadExecutor $ 1.run (MultiThreadExecutor.java:37) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615) 在java.lang中.Thread.run(Thread.java:745)

有什麼辦法可以做到嗎?我可以涉及到以前問question,但沒有好處。

回答

1

下面是一個示例命令將運行分析器在多線程模式:

java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse -parse.nthreads 4 -ssplit.eolonly -file some-sentences.txt -outputFormat text 
+0

您可以在Java代碼中運行StanfordCoreNLP管道爲好,這裏是做一些文檔:HTTP:/ /stanfordnlp.github.io/CoreNLP/api.html – StanfordNLPHelp

+0

一定要獲得新的斯坦福CoreNLP 3.7.0! – StanfordNLPHelp