2012-03-01 68 views
2

我試圖從NLTK使用MaltParser。NLTK MaltParser不會解析

我能得到配置解析器點:

import nltk 
parser = nltk.parse.malt.MaltParser() 
parser.config_malt() 
parser.train_from_file('malt_train.conll') 

,但是當涉及到實際的解析,解析器返回一個錯誤:

File "<stdin>", line 1, in <module> 
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 98, in raw_parse 
return self.parse(words, verbose) 
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 85, in parse 
return self.tagged_parse(taggedwords, verbose) 
File "/Library/Python/2.7/site-packages/nltk/parse/malt.py", line 139, in tagged_parse 
return DependencyGraph.load(output_file) 
File "/Library/Python/2.7/site-packages/nltk/parse/dependencygraph.py", line 121, in load 
return DependencyGraph(open(file).read()) 
IOError: [Errno 2] No such file or directory:'/var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll' 

下面是給出了錯誤的命令(來自malt.py):

['java', '-jar /usr/lib/malt-1.6.1/malt.jar', '-w /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T', '-c malt_temp', '-i /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_input.conll', '-o /var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll', '-m parse'] 

我試着運行jus java命令,這裏是我得到的:

The file entry 'malt_temp_singlemalt.info' in the mco file '/var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_temp.mco' cannot be loaded. 

也試圖與預先訓練engmalt.poly.mco相同,engmalt.linear.mco

任何建議都非常歡迎。

編輯:這裏是malt.py

def tagged_parse(self, sentence, verbose=False): 
    """ 
    Use MaltParser to parse a sentence. Takes a sentence as a list of 
    (word, tag) tuples; the sentence must have already been tokenized and 
    tagged. 

    @param sentence: Input sentence to parse 
    @type sentence: L{list} of (word, tag) L{tuple}s. 
    @return: C{DependencyGraph} the dependency graph representation of the sentence 
    """ 

    if not self._malt_bin: 
     raise Exception("MaltParser location is not configured. Call config_malt() first.") 
    if not self._trained: 
     raise Exception("Parser has not been trained. Call train() first.") 

    input_file = os.path.join(tempfile.gettempdir(), 'malt_input.conll') 
    output_file = os.path.join(tempfile.gettempdir(), 'malt_output.conll') 

    execute_string = 'java -jar %s -w %s -c %s -i %s -o %s -m parse' 
    if not verbose: 
     execute_string += ' > ' + os.path.join(tempfile.gettempdir(), "malt.out") 

    f = None 
    try: 
     f = open(input_file, 'w') 

     for (i, (word,tag)) in enumerate(sentence): 
      f.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % 
        (i+1, word, '_', tag, tag, '_', '0', 'a', '_', '_')) 
     f.write('\n') 
     f.close() 

     cmd = ['java', '-jar %s' % self._malt_bin, '-w %s' % tempfile.gettempdir(), 
       '-c %s' % self.mco, '-i %s' % input_file, '-o %s' % output_file, '-m parse'] 
     print cmd 

     self._execute(cmd, 'parse', verbose) 

     return DependencyGraph.load(output_file) 
    finally: 
     if f: f.close() 
+0

是否存在'/ var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll'文件?程序是否有權在那裏寫入? – 2012-03-01 21:43:28

+0

該文件不會生成並且權限被修復/授予。 – Stpn 2012-03-01 21:46:06

+1

請參閱http://stackoverflow.com/a/35681125/610569 – alvas 2016-02-28 10:04:46

回答

2

蔭不知道,如果問題仍然沒有解決的全功能(但我認爲它已經解決了), 但我有同樣的問題,而以前,我想分享我的知識。

首先,MaltParser-Jar不接受一個.connl文件,其文件前面有一個直接路徑。如上所見。 爲什麼如此......我不知道。

但是你可以很容易地通過命令行來改變這樣的修正:

  cmd = ['java', '-jar %s' % self._malt_bin,'-w %s' %self.working_dir,'-c %s' % self.mco, '-i %s' % input_file, '-o %s' % output_file, '-m parse'] 

這裏現在.conll文件的目錄使用-w參數設置。使用這個你可以從任何給定文件夾加載任何.conll文件。 我也從tempfile.gettempdir()更改爲self.working_dir,因爲在「原始」NLTK版本中,總是將/ tmp /文件夾設置爲工作目錄。即使您將Maltparser與其他工作目錄初始化。

我希望這些信息能幫助別人。

另一件事, 如果你想分析許多句子一次,但每個單獨和不依賴於所有其他句子,你必須在input.conll文件中添加一個空行,並開始每個句子的計數再與1.