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.
fonte
2012-02-15 14:35:27
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
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. –
grazie, stavo guardando il tuo corso online NLP. Anche questo aiuta molto! Rispetto. – Matt