Java NLTK-Malton';t解析
我正在尝试使用NLTK中的MaltParser 我可以开始配置解析器:Java NLTK-Malton';t解析,java,python,parsing,nltk,Java,Python,Parsing,Nltk,我正在尝试使用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-p
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'
我尝试使用java命令运行jus,结果如下:
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()
我不确定这个问题是否还没有解决(但我认为它已经解决了), 但是,正如我不久前遇到同样的问题一样,我想分享我的知识 首先,解析器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']
现在,使用-w参数设置.conll文件的目录。使用此选项,您可以从任何给定文件夹加载任何.conll文件。
我还将从tempfile.gettempdir()
更改为self.working\u dir
,因为在“原始”NLTK版本中,/tmp/文件夹始终设置为工作目录。即使您使用另一个工作目录初始化语法分析器
我希望这些信息能帮助别人
还有一件事,
如果您想一次解析多个句子,但每个句子都是单独解析的,并且不依赖于所有其他句子,则必须在input.conll文件中添加一个空行,然后用1重新开始每个句子的计算。位于
/var/folders/77/ch5yxf153jl67kmqr5jqywgr0000gn/T/malt_output.conll的文件是否存在?程序是否有写入权限?文件不会生成,权限已修复/授予。请参阅
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']