以下是NLTK 3.2與斯坦福解析器-全2015年12月9日在Python 2.7.6(和JDK 8)在Ubuntu 14.04運行配對LTS。首先,有一點背景...選項字符串空間導致Java錯誤在nltk.parse.stanford解析器
我想在StanfordDependencyParser的輸出中保留標點符號,所以我嘗試了corenlp_options='-keepPunct'
,這不起作用。所以我發現如果你在命令行上使用java,那麼這樣做的方式是-outputFormatOptions "includePunctuationDependencies"
。
from nltk.parse.stanford import StanfordDependencyParser as SDP
dp = SDP(corenlp_options='-outputFormatOptions includePunctuationDependencies')
但是,當我試圖把它們遞過來corenlp_options,它似乎確定,直到我真正嘗試分析一些東西,然後我得到一個OSERROR:
print [parse.tree() for parse in dp.raw_parse('The quick brown fox jumps over the lazy dog.')]
WARNING! lexparser.Options: Unknown option ignored: -outputFormatOptions includePunctuationDependencies
[main] INFO edu.stanford.nlp.parser.lexparser.LexicalizedParser - Loading parser from serialized file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ...
done [0.4 sec].
Error loading parser, exiting...
Exception in thread "main" java.lang.IllegalArgumentException: Unknown option: -outputFormatOptions includePunctuationDependencies
at edu.stanford.nlp.parser.lexparser.Options.setOption(Options.java:175)
at edu.stanford.nlp.parser.lexparser.Options.setOptions(Options.java:68)
at edu.stanford.nlp.parser.lexparser.Options.setOptions(Options.java:49)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.setOptionFlags(LexicalizedParser.java:1007)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.loadModel(LexicalizedParser.java:188)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.main(LexicalizedParser.java:1412)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/nltk/parse/stanford.py", line 132, in raw_parse
return next(self.raw_parse_sents([sentence], verbose))
File "/usr/local/lib/python2.7/dist-packages/nltk/parse/stanford.py", line 150, in raw_parse_sents
return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose))
File "/usr/local/lib/python2.7/dist-packages/nltk/parse/stanford.py", line 216, in _execute
stdout=PIPE, stderr=PIPE)
File "/usr/local/lib/python2.7/dist-packages/nltk/internals.py", line 134, in java
raise OSError('Java command failed : ' + str(cmd))
OSError: Java command failed : ['/usr/lib/jvm/java-8-oracle/bin/java', u'-mx1000m', '-cp', '/home/dbl/stanford/stanford-english-corenlp-2016-10-31-models.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/stanford-parser-3.6.0-sources.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/slf4j-api.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/stanford-parser-3.6.0-models.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/stanford-parser.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/ejml-0.23.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/slf4j-simple.jar:/home/dbl/stanford/stanford-parser-full-2015-12-09/stanford-parser-3.6.0-javadoc.jar', u'edu.stanford.nlp.parser.lexparser.LexicalizedParser', u'-model', u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz', u'-sentences', u'newline', u'-outputFormat', u'conll2007', u'-encoding', u'utf8', '-outputFormatOptions includePunctuationDependencies', '/tmp/tmpbJ349q']
當然,如果我加入該名單空間和將其粘貼到shell提示符下,它運行良好。問題是NLTK的java使用Popen,並且它對corenlp_options中的空間不滿意。除了重寫corenlp_options來擴展cmd列表並分割字符串(因爲用空格添加字符串會破壞Popen),我有什麼好的選擇嗎?
下面是從nltk.parse.stanford.GenericStanfordParser相關片段(該依賴解析器繼承):
def _execute(self, cmd, input_, verbose=False):
encoding = self._encoding
cmd.extend(['-encoding', encoding])
if self.corenlp_options:
cmd.append(self.corenlp_options)
...
如果我創建POPEN這的確會工作和CMD列出自己(或者,如果我修修補補與代碼相關NLTK位),但我的問題是專門關於如何得到這個現有NLTK代碼和corenlp_options內工作。 – dbl
這裏是GenericStanfordParser類('.append(corenlp_options)',其中 '.extend(self.corenlp_options.split())'將實現你的建議): '如果self.corenlp_options: cmd。 append(self.corenlp_options)' – dbl
請編輯您的問題幷包含您用於注入選項的Python代碼。很難修復我看不到的代碼。也就是說,你可能只需要爲'corenlp_options'傳遞一個列表而不是一個字符串。 – alexis