2012-02-15 56 views
8

斯坦福分析器現在是'線程安全的'截至version 2.0(02.03.2012)。我目前正在運行命令行工具,並不知道如何通過線程化程序來使用我的多個內核。斯坦福分析器多線程使用

在過去,這個問題已經被回答爲「斯坦福分析器不是線程安全的」,正如常見問題解答所說。我希望能夠找到一個已經成功穿越最新版本的人。

我試過使用-t標誌(-t10和-tLLP),因爲那是我在我的搜索中可以找到的所有東西,但都拋出錯誤。

我發出了一個命令的一個例子是:

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

回答

16

與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()方法)或隱式地通過關閉一個LexicalizedParser調用apply(...)parseTree(...)來完成此操作。 -nthreads k選項通過使用Executor框架向不同的解析器發送連續的句子來爲您做到這一點。您也可以同時創建多個LexicalizedParser,例如解析不同的語言。

多個LexicalizedparserQuery對象共享相同的語法(LexicalizedParser),但內存空間節省不是很大,因爲大部分內存都會轉到圖表解析中使用的瞬態結構。因此,如果您同時運行大量解析線程,則需要爲JVM提供大量內存,如上例所示。

p.s.對不起,是的,一些文檔仍然需要更新。但-tLPP是用於指定語言特定資源的一個標誌。斯坦福解析器沒有標誌。

+1

你好,我想用API編程而不是使用命令行。你的意思是沒有必要手動分割語料庫,LexicalizedParser會照顧分割和合並工作嗎?所以多線程對程序員來說是透明的? – Matt 2012-06-19 22:17:50

+3

它不透明。這意味着您可以同時對不同的句子調用LexicalizedParser的parseTree()或apply()方法,並且它可以正常工作,但它在2.0版之前並未使用。你如何做到這一點取決於你,但顯而易見的現代Java方法是不分割語料庫,但建立一個Executor服務,並有一堆解析器Executor同時運行。 – 2012-06-20 15:32:12

+0

謝謝,我在看你的NLP在線課程。這也有很大幫助!尊重。 – Matt 2012-06-20 18:14:53