Stanford Parser多线程使用

时间:2012-02-15 01:10:40

标签: multithreading nlp multiprocessing stanford-nlp

截至version 2.0(2012年3月2日),Stanford Parser现在是“线程安全的”。我目前正在运行命令行工具,无法通过线程化程序来弄清楚如何利用我的多核。

在过去,这个问题已被回答“斯坦福分析师不是线程安全的”,正如常见问题解答仍然说的那样。我希望找到一个成功穿越最新版本的人。

我尝试过使用-t标志(-t10和-tLLP),因为这是我在搜索中找到的所有内容,但都抛出错误。

我发出的命令的一个例子是:

java -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser \
-outputFormat "oneline" ./grammar/englishPCFG.ser.gz ./corpus > corpus.lex

1 个答案:

答案 0 :(得分:16)

从版本2.0.5开始,您现在可以使用选项-nthreads k轻松使用多个线程。例如,您的命令可以是这样的:

java -mx6g edu.stanford.nlp.parser.lexparser.LexicalizedParser -nthreads 4 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz file.txt > file.stp

(2013年之前的版本2发布无法从命令行启用多线程,但仅限于使用API​​时。)

在内部,您可以根据需要在一个JVM进程中同时运行尽可能多的解析线程。您可以通过获取和使用多个LexicalizedParserQuery对象(通过parserQuery()方法)或通过调用apply(...)parseTree(...)关闭一个LexicalizedParser来执行此操作。 -nthreads k选项通过使用Executor框架向不同的解析器发送连续的句子来为您执行此操作。您还可以同时创建多个LexicalizedParser,例如,用于解析不同的语言。

多个LexicalizedparserQuery对象共享相同的语法(LexicalizedParser),但节省的内存空间并不大,因为大多数内存都转到图表解析中使用的瞬态结构。因此,如果您同时运行大量解析线程,则需要为JVM提供大量内存,如上例所示。

P.S。对不起,是的,有些文档仍需要更新。但是-tLPP是用于指定特定于语言的资源的一个标志。斯坦福分析师没有-t标志。