首先,解析在一小組句子上運行平滑 - 按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,但沒有好處。
您可以在Java代碼中運行StanfordCoreNLP管道爲好,這裏是做一些文檔:HTTP:/ /stanfordnlp.github.io/CoreNLP/api.html – StanfordNLPHelp
一定要獲得新的斯坦福CoreNLP 3.7.0! – StanfordNLPHelp