8

从版本 2.0 (02.03.2012)开始,Stanford Parser 现在是“线程安全的” 。我目前正在运行命令行工具,无法弄清楚如何通过线程化程序来利用我的多个内核。

过去,这个问题已经用“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
4

1 回答 1

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 提供大量内存,如上例所示。

ps 抱歉,是的,有些文档还需要更新。但是 -tLPP 是用于指定特定语言资源的标志之一。斯坦福解析器没有 -t 标志。

于 2012-02-15T14:35:27.913 回答