Stanford Parser многопоточное использование - PullRequest
8 голосов
/ 15 февраля 2012

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 Ответ

16 голосов
/ 15 февраля 2012

Начиная с версии 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 много памяти, как в примере выше.

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

...