2012-02-15 21 views
8

Stanford Parser è ora 'thread-safe' come di version 2.0 (02.03.2012). Attualmente sto eseguendo gli strumenti da riga di comando e non riesco a capire come utilizzare i miei core multipli tramite il threading del programma.Stanford Parser utilizzo multithread

In passato, questa domanda è stato risposto con "Stanford Parser non è thread-safe", come la FAQ, dice ancora. Spero di trovare qualcuno che abbia avuto successo inserendo l'ultima versione.

Ho provato con bandiera -t (-T10 e -tLLP) dal momento che era tutto quello che potevo trovare nelle mie ricerche, ma entrambi gli errori di tiro.

Un esempio di un comando che problema è:

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

risposta

16

A partire dalla versione 2.0.5, ora è possibile utilizzare facilmente più thread con l'opzione -nthreads k. Ad esempio, il comando può essere simile a questo:

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

(Uscite della versione 2 prima del 2013 non ha avuto modo di abilitare il multithreading dalla riga di comando, ma solo quando si utilizza l'API.)

Internamente , è possibile eseguire contemporaneamente tanti thread di analisi all'interno di un processo JVM come si desidera. È possibile eseguire questa operazione da ottenere e l'utilizzo di più oggetti LexicalizedParserQuery (tramite il metodo parserQuery()) o implicitamente chiamando apply(...) o parseTree(...) fuori uno LexicalizedParser. L'opzione -nthreads k esegue questa operazione per te inviando frasi successive a diversi parser utilizzando il framework Executor. È anche possibile creare contemporaneamente più LexicalizedParser, ad es. Per analizzare lingue diverse.

Multiple Lexicalizedparser Gli oggettiQuery condividono la stessa grammatica (LexicalizedParser), ma i risparmi di spazio di memoria non sono enormi, poiché la maggior parte della memoria va alle strutture transitori utilizzate nell'analisi dei grafici. Quindi, se si stanno eseguendo numerosi thread di analisi contemporaneamente, sarà necessario fornire molta memoria alla JVM, come nell'esempio sopra riportato.

p.s. Spiacenti, sì, parte della documentazione deve ancora essere aggiornata. Ma -tLPP è un indicatore per specificare le risorse specifiche della lingua. Lo Stanford Parser non ha flag.

+1

Ciao, voglio programmare con l'API invece di usare la riga di comando. Intendi dire che non è necessario dividere il corpus manualmente e LexicalizedParser si occuperà di suddividere e combinare il lavoro? quindi il multithreading è trasparente per il programmatore? – Matt

+3

Non è trasparente. Significa che è possibile chiamare simultaneamente i metodi parseTree() o apply() di LexicalizedParser su frasi diverse e funzionerà correttamente, mentre non era usato prima della versione 2.0. Come si fanno le cose dopo quello dipende da voi, ma l'ovvio modo moderno di Java sarebbe quello di non dividere il corpus ma impostare un servizio Executor e avere un po 'di parser Executor in esecuzione contemporaneamente. –

+0

grazie, stavo guardando il tuo corso online NLP. Anche questo aiuta molto! Rispetto. – Matt