Stanford Parser многопоточное использование

Stanford Parser теперь «потокобезопасный» сверсия 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

Ответы на вопрос(1)

Решение Вопроса

теперь вы можете легко использовать несколько потоков с опцией-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, как в примере выше.

постскриптум Извините, да, часть документации все еще нуждается в обновлении. Но -tLPP - это один флаг для указания языковых ресурсов. У Stanford Parser нет флага -t.

 Christopher Manning20 июн. 2012 г., 17:32
Это не прозрачно. Это означает, что вы можете вызывать методы parseTree () или apply () в LexicalizedParser одновременно для разных предложений, и он будет работать правильно, тогда как раньше не использовался до версии 2.0. То, как вы будете действовать после этого, зависит от вас, но очевидный современный способ Java состоит в том, чтобы не разделять корпус, а настроить службу Executor и одновременно запустить несколько анализаторов Executor.
 Matt20 июн. 2012 г., 00:17
Здравствуйте, я хочу программировать с помощью API вместо использования командной строки. Вы имеете в виду, что нет необходимости разделять корпус вручную, а LexicalizedParser позаботится о разделении и объединении работы? так многопоточность прозрачна для программиста?
 Preston Lee31 окт. 2013 г., 19:15
Была ли проделана какая-либо работа над этим с тех пор? Если нет, то мне может быть интересно помочь усилиям по повышению производительности для пользователей командной строки.
 Matt20 июн. 2012 г., 20:14
спасибо, я смотрел ваш онлайн курс НЛП. Это тоже очень помогает! Уважение.
 Christopher Manning03 нояб. 2013 г., 00:28
Да. Ответ изменился в версии 2.0.5. Я обновлю основной ответ.

Ваш ответ на вопрос