2016-11-23 18 views
0

以下是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) 

... 

回答

1

傳遞選項和值作爲參數列表上的獨立參數,像所有其他選項你發現了。例如:..., u'-encoding', u'utf8', ...。所以只需寫'-outputFormatOptions', 'includePunctuationDependencies',你很好走。

+0

如果我創建POPEN這的確會工作和CMD列出自己(或者,如果我修修補補與代碼相關NLTK位),但我的問題是專門關於如何得到這個現有NLTK代碼和corenlp_options內工作。 – dbl

+0

這裏是GenericStanfordParser類('.append(corenlp_options)',其中 '.extend(self.corenlp_options.split())'將實現你的建議): '如果self.corenlp_options: cmd。 append(self.corenlp_options)' – dbl

+0

請編輯您的問題幷包含您用於注入選項的Python代碼。很難修復我看不到的代碼。也就是說,你可能只需要爲'corenlp_options'傳遞一個列表而不是一個字符串。 – alexis