Java 斯坦福NLP注释文本非常慢

Java 斯坦福NLP注释文本非常慢,java,performance,stanford-nlp,Java,Performance,Stanford Nlp,我正在使用斯坦福CoreNLP在Windows机器上运行Java的NLP项目。我想从这篇文章中注释一篇大型文本文章。我写的代码如下 Properties props = new Properties(); props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref, regexner"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props); Ann

我正在使用斯坦福CoreNLP在Windows机器上运行Java的NLP项目。我想从这篇文章中注释一篇大型文本文章。我写的代码如下

Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref, regexner");
StanfordCoreNLP pipeline =   new StanfordCoreNLP(props);
Annotation document = new Annotation("Text to be annotated. This text is very long!");
pipeline.annotate(document); // this line takes a long time
文本的注释占用了相当长的时间。 大约60个单词,这一行大约需要16秒,太长了

有没有办法加快这一进程,或者我有没有遗漏什么。 请告诉我我能做什么。 Thanx提前:-)

编辑

代码示例

    public TextReader() {
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, regexner");
pipeline = new StanfordCoreNLP(props);
extractor = CoreMapExpressionExtractor.
                            createExtractorFromFiles(TokenSequencePattern.getNewEnv(), "Stanford NLP\\stanford-corenlp-full-2015-01-29\\stanford-corenlp-full-2015-01-30\\tokensregex\\color.rules.txt");
text = "Barak Obama was born on August 4, 1961,at Kapiolani Maternity & Gynecological Hospital "
+ " in Honolulu, Hawaii, and would become the first President to have been born in Hawaii. His mother, Stanley Ann Dunham,"
+ " was born in Wichita, Kansas, and was of mostly English ancestry. His father, Barack Obama, Sr., was a Luo from Nyang’oma"
+ " Kogelo, Kenya. He studied at the University of Westminster. His favourite colour is red.";
Logger.getLogger(TextReader.class.getName()).log(Level.INFO, "Annotator starting...", text); // LOG 1
Annotation document = new Annotation(text);
pipeline.annotate(document);
Logger.getLogger(TextReader.class.getName()).log(Level.INFO, "Annotator finished...", props); // LOG 2
sentences = document.get(SentencesAnnotation.class);
for (CoreMap sentence : sentences) {
   //the tokens of the sentence are taken and iterated over
   // the NER, POS and lemma of the tokens are stores iteratively
}
}
我意识到日志1和日志2之间的时间大约是16秒。我需要的是处理更长的文本,这需要很长时间。请告诉我我做错了什么


Thanx=D

这篇课文是一个长句吗?相对于句子的长度,解析器的运行时间是O(n^3),对于长度超过40个单词的句子,其运行速度非常慢。如果删除“parse,dcoref,regexner”注释器,它会加快速度吗?如果重新添加“parse”,是否会再次减慢速度


如果您关心的是依赖项解析而不是选区解析,那么新的“depprase”注释器将更快地生成这些解析;尽管如此,我们的coref还不能处理依赖项解析(很快就会出现!)。

好吧,您正在使用一组注释器,有些注释器可以完成真正的工作(例如,
ner
)。首先,我会删除那些“可能”占用时间的问题,看看(a)您的性能问题在哪里,以及(b)您是否需要它们提供的功能。一旦你开始对每个单词进行分类,事情就会变得棘手。我猜这16秒钟中95%的时间都花在加载数据和初始化内部数据结构上。正如Dave提到的,尝试删除不需要的注释器。我相信新版本的库是线程安全的,因此您可以初始化管道一次(可能在启动时)并重用它,而不是为每个需要注释的文档创建一个新实例。thanx用于您的注释,但管道的非斜体化(即我放置注释器并创建管道对象的位置)不包括在16秒中。我需要多次运行最后一行,这样剩下的代码只运行一次。最后一行单独为不同的文本段运行需要16秒。那么我能做些什么来保证行
pipeline.annotate(document)的运行时间呢更快?我刚从他们的网站上读到“处理这样的短文本效率很低。在处理开始之前加载所有内容需要一分钟。你应该批量处理。”看起来是slowI无法删除解析和regexner注释器,因为我需要获取依赖关系树,并且我已经编写了一些regexner使用的NER规则
我使用的是我可以通过“parse”获得的依赖项和选区解析。根据文档,“depparse”只提供依赖项解析。文本不是一个句子。该文本类似于维基百科文章中的文本。标准的句子长度,大多数不超过每行40个单词。你能举一个花费太长的程序的小例子吗?60个单词的文本,如果不是一句话,应该不会花那么长的时间…我已经添加了一个示例代码作为问题的编辑。Thanx:)将“parse”替换为“depparse”,对我来说,运行时间减少了约10秒。我正在使用引号注释器。