2012-02-15 13 views
8

Stanford Parser ahora es 'thread-safe' desde version 2.0 (02.03.2012). Actualmente estoy ejecutando las herramientas de línea de comandos y no puedo entender cómo hacer uso de mis múltiples núcleos al enrutar el programa.Stanford Parser multithread usage

En el pasado, esta pregunta se había respondido con "Stanford Parser no es seguro para subprocesos", como aún dice la pregunta frecuente. Espero encontrar a alguien que haya tenido éxito en la última versión.

He intentado usar -t flag (-t10 y -tLLP) ya que eso fue todo lo que pude encontrar en mis búsquedas, pero ambos arrojaron errores.

Un ejemplo de un comando expido es:

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

Respuesta

16

partir de la versión 2.0.5, ahora se puede utilizar fácilmente múltiples hilos con la opción -nthreads k. Por ejemplo, el comando puede ser así:

java -mx6g edu.stanford.nlp.parser.lexparser.LexicalizedParser -nthreads 4 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz file.txt > file.stp 

(lanzamientos de la versión 2 antes de 2013 no tenían forma de permitir que múltiples hilos desde la línea de comandos, pero sólo cuando se utiliza la API.)

Internamente , puede ejecutar simultáneamente tantos subprocesos de análisis dentro de un proceso de JVM como desee. Puede hacer esto obteniendo y usando múltiples objetos LexicalizedParserQuery (a través del método parserQuery()) o implícitamente llamando al apply(...) o parseTree(...) desde un LexicalizedParser. La opción -nthreads k hace esto por usted enviando oraciones sucesivas a diferentes analizadores utilizando el marco Executor. También puede crear simultáneamente múltiples LexicalizedParser, por ejemplo, para analizar diferentes idiomas.

Varios objetos LexicalizedparserQuery comparten la misma gramática (LexicalizedParser), pero el ahorro de espacio de memoria no es enorme, ya que la mayor parte de la memoria se destina a las estructuras transitorias utilizadas en el análisis sintáctico de gráficos. Por lo tanto, si está ejecutando muchos procesos de análisis al mismo tiempo, tendrá que dar mucha memoria a la JVM, como en el ejemplo anterior.

p.s. Lo siento, sí, parte de la documentación aún necesita actualización. Pero -tLPP es una bandera para especificar recursos específicos del idioma. El analizador de Stanford no tiene indicador -t.

+1

Hola, quiero programar con la API en lugar de usar la línea de comandos. ¿Quiere decir que no hay necesidad de dividir el corpus manualmente y LexicalizedParser se ocupará de dividir y combinar el trabajo? ¿entonces el multihilo es transparente para el programador? – Matt

+3

No es transparente. Significa que puede llamar a los métodos parseTree() o apply() de LexicalizedParser en diferentes oraciones simultáneamente y que funcionará correctamente, mientras que no lo hizo antes de la versión 2.0. Cómo hacer las cosas después de eso depende de usted, pero la forma obvia de Java moderna sería no dividir el corpus, sino configurar un servicio Ejecutor y tener un montón de Ejecutor analizador ejecutando simultáneamente. –

+0

gracias, estaba viendo tu curso en línea PNL. Eso ayuda mucho también! El respeto. – Matt