14

作为我学术项目的一部分,我需要将一堆任意句子解析成依赖图。经过大量搜索后,我得到了可以使用 Malt Parser 及其预先训练的语法分析文本的解决方案。

我已经从http://www.maltparser.org/mco/mco.html下载了预训练模型 (engmalt.linear-1.7.mco) 。但是我不知道如何使用这个语法文件和麦芽解析器(通过麦芽的 python 接口)来解析我的句子。我已经下载了最新版本的 malt parser (1.7.2) 并将其移至“/usr/lib/”

import nltk; 
parser =nltk.parse.malt.MaltParser()
txt="This is a test sentence"
parser.train_from_file('/home/rohith/malt-1.7.2/engmalt.linear-1.7.mco')
parser.raw_parse(txt)

执行最后一行后,显示以下错误消息

Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
parser.raw_parse(txt)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 88, in raw_parse
return self.parse(words, verbose)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 75, in parse
return self.tagged_parse(taggedwords, verbose)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/malt.py", line 122, in tagged_parse
return DependencyGraph.load(output_file)
File "/usr/local/lib/python2.7/dist-packages/nltk-2.0b5-py2.7.egg/nltk/parse/dependencygraph.py", line 121, in load
return DependencyGraph(open(file).read())
IOError: [Errno 2] No such file or directory: '/tmp/malt_output.conll'

请帮助我使用这个麦芽解析器来解析那个句子。

4

1 回答 1

20

已编辑

请注意,由于自 2015 年 8 月以来 NLTK 中 MaltParser API 的更新版本,答案不再有效。此答案保留为旧版。

请参阅此答案以使 MaltParser 与 NLTK 一起使用:

免责声明:这不是一个永恒的解决方案。上述链接(2016 年 2 月发布)中的答案现在可以使用。但是当 MaltParser 或 NLTK API 发生变化时,它也可能将语法更改为在 NLTK 中使用 MaltParser。


您的设置有几个问题:

  • 输入train_from_file必须是 CoNLL 格式的文件,而不是预训练的模型。对于文件,您可以使用and参数mco将其传递给MaltParser构造函数。mcoworking_directory
  • 默认的 java 堆分配不足以加载该特定mco文件,因此您必须通过-Xmx参数告诉 java 使用更多堆空间。不幸的是,现有代码无法做到这一点,所以我只是签入了一个更改,以允许为 java args 提供额外的构造函数参数。见这里

所以这就是你需要做的:

首先,获取最新的 NLTK 修订版:

git clone https://github.com/nltk/nltk.git

(注意:如果你不能使用 NLTK 的 git 版本,那么你必须malt.py手动更新文件或从这里复制它以获得你自己的版本。)

其次,将 jar 文件重命名为malt.jar,这是 NLTK 所期望的:

cd /usr/lib/
ln -s maltparser-1.7.2.jar malt.jar

然后添加一个指向 malt 解析器的环境变量:

export MALTPARSERHOME="/Users/dhg/Downloads/maltparser-1.7.2"

最后,在 python 中加载和使用 malt 解析器:

>>> import nltk
>>> parser = nltk.parse.malt.MaltParser(working_dir="/home/rohith/malt-1.7.2", 
...                                     mco="engmalt.linear-1.7", 
...                                     additional_java_args=['-Xmx512m'])
>>> txt = "This is a test sentence"
>>> graph = parser.raw_parse(txt)
>>> graph.tree().pprint()
'(This (sentence is a test))'
于 2012-12-28T05:46:52.230 回答