Начиная с версии 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
(Выпуски версии 2 до 2013 года не было никакого способа, чтобы включить многопоточного из командной строки, но только при использовании API.)
Внутренне , вы можете одновременно запускать столько раз синтаксических потоков внутри одного JVM-процесса, сколько хотите. Вы можете сделать это, получив и используя несколько объектов LexicalizedParserQuery (с помощью метода parserQuery()
) или неявно, вызывая apply(...)
или parseTree(...)
с одного LexicalizedParser. Опция -nthreads k
делает это для вас, отправляя последовательные предложения для разных парсеров, используя фреймворк Executor
. Вы также можете одновременно создавать несколько файлов LexicalizedParser, например, для разбора разных языков.
Несколько объектов LexicalizedparserQuery используют одну и ту же грамматику (LexicalizedParser), но экономия пространства памяти невелика, так как большая часть памяти обращается к структурам переходного процесса, используемым при разборе диаграмм. Итак, если вы одновременно запускаете множество парсинга потоков, вам нужно будет предоставить много памяти JVM, как в приведенном выше примере.
p.s. К сожалению, некоторые из документации по-прежнему нуждаются в обновлении. Но -tLPP - это один флаг для указания ресурсов, специфичных для языка. У Стэнфордского Парсера нет флага -t.
Здравствуйте, я хочу запрограммировать API вместо использования командной строки. Вы имеете в виду, что нет необходимости разделить корпус вручную, и LexicalizedParser позаботится о разделении и объединении работы? поэтому многопоточность прозрачна для программиста? – Matt
Это не прозрачно. Это означает, что вы можете одновременно вызвать методы parseTree() или apply() метода LexicalizedParser для разных предложений, и он будет работать корректно, тогда как он не использовался до версии 2.0. Как вы это делаете после этого, но очевидный современный способ Java состоит в том, чтобы не расколоть корпус, а создать службу Исполнителя и одновременно запустить кучу анализатора Executor. –
спасибо, я смотрел ваш онлайн-курс NLP. Это тоже помогает! Уважение. – Matt