如何在python nltk中使用麦芽解析器

Roh*_*ith 14 python parsing nlp nltk

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

我从http://www.maltparser.org/mco/mco.html下载了预训练模型(engmalt.linear-1.7.mco).我不知道如何使用这个语法文件和麦芽解析器解析我的句子(通过python接口获取麦芽).我已下载最新版本的malt解析器(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)
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

请帮我用这个麦芽解析器解析那句话.

dhg*_*dhg 20

编辑

请注意,由于自2015年8月以来NLTK中MaltParser API的更新版本,答案已不再有效.这个答案是为了传统而保留的.

请查看此答案以使MaltParser与NLTK合作:

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


您的设置存在两个问题:

  • 输入train_from_file必须是CoNLL格式的文件,而不是预先训练的模型.对于mco文件,MaltParser使用mcoworking_directory参数将其传递给构造函数.
  • 默认的Java堆分配不足以加载该特定mco文件,因此您必须告诉java使用更多的堆空间和-Xmx参数.不幸的是现有的代码是不可能的,所以我只是检查了一个更改,以允许java args的其他构造函数参数.看到这里.

所以这就是你需要做的:

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

git clone https://github.com/nltk/nltk.git
Run Code Online (Sandbox Code Playgroud)

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

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

cd /usr/lib/
ln -s maltparser-1.7.2.jar malt.jar
Run Code Online (Sandbox Code Playgroud)

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

export MALTPARSERHOME="/Users/dhg/Downloads/maltparser-1.7.2"
Run Code Online (Sandbox Code Playgroud)

最后,在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))'
Run Code Online (Sandbox Code Playgroud)