2012-02-15 2 views
8

Stanford Parser теперь «потокобезопасен» от version 2.0 (02.03.2012). В настоящее время я запускаю инструменты командной строки и не могу понять, как использовать мои несколько ядер путем потоковой передачи программы.Stanford Parser многопоточное использование

В прошлом на этот вопрос ответил: «Стэнфордский парсер не является потокобезопасным», как часто говорится в FAQ. Я надеюсь найти кого-то, у кого был успех, нарезающий последнюю версию.

Я пробовал использовать флаг -t (-t10 и -tLLP), поскольку это было все, что я мог найти в моих поисках, но оба бросали ошибки.

Пример команды я выполняю это:

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

ответ

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 

(Выпуски версии 2 до 2013 года не было никакого способа, чтобы включить многопоточного из командной строки, но только при использовании API.)

Внутренне , вы можете одновременно запускать столько раз синтаксических потоков внутри одного JVM-процесса, сколько хотите. Вы можете сделать это, получив и используя несколько объектов LexicalizedParserQuery (с помощью метода parserQuery()) или неявно, вызывая apply(...) или parseTree(...) с одного LexicalizedParser. Опция -nthreads k делает это для вас, отправляя последовательные предложения для разных парсеров, используя фреймворк Executor. Вы также можете одновременно создавать несколько файлов LexicalizedParser, например, для разбора разных языков.

Несколько объектов LexicalizedparserQuery используют одну и ту же грамматику (LexicalizedParser), но экономия пространства памяти невелика, так как большая часть памяти обращается к структурам переходного процесса, используемым при разборе диаграмм. Итак, если вы одновременно запускаете множество парсинга потоков, вам нужно будет предоставить много памяти JVM, как в приведенном выше примере.

p.s. К сожалению, некоторые из документации по-прежнему нуждаются в обновлении. Но -tLPP - это один флаг для указания ресурсов, специфичных для языка. У Стэнфордского Парсера нет флага -t.

+1

Здравствуйте, я хочу запрограммировать API вместо использования командной строки. Вы имеете в виду, что нет необходимости разделить корпус вручную, и LexicalizedParser позаботится о разделении и объединении работы? поэтому многопоточность прозрачна для программиста? – Matt

+3

Это не прозрачно. Это означает, что вы можете одновременно вызвать методы parseTree() или apply() метода LexicalizedParser для разных предложений, и он будет работать корректно, тогда как он не использовался до версии 2.0. Как вы это делаете после этого, но очевидный современный способ Java состоит в том, чтобы не расколоть корпус, а создать службу Исполнителя и одновременно запустить кучу анализатора Executor. –

+0

спасибо, я смотрел ваш онлайн-курс NLP. Это тоже помогает! Уважение. – Matt

Смежные вопросы