Stanford Parser多线程使用

ear*_*Lon 8 multithreading nlp multiprocessing stanford-nlp

截至2.0版本(02.03.2012),斯坦福分析师现在是"线程安全的" .我目前正在运行命令行工具,无法通过线程化程序来弄清楚如何利用我的多核.

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

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

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

java -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser \
-outputFormat "oneline" ./grammar/englishPCFG.ser.gz ./corpus > corpus.lex
Run Code Online (Sandbox Code Playgroud)

Chr*_*ing 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 它不透明.这意味着您可以同时在不同的句子上调用LexicalizedParser的parseTree()或apply()方法,它可以正常工作,而在2.0版之前它不习惯.你如何做到这一点取决于你,但显而易见的现代Java方法是不拆分语料库,而是设置一个Executor服务并让一堆解析器Executor同时运行. (3认同)