如何在python n中使用malt解析器

2024-04-29 22:57:56 发布

您现在位置:Python中文网/ 问答频道 /正文

作为我学术项目的一部分,我需要把一堆任意的句子解析成依赖关系图。经过大量的搜索,我得到了一个解决方案,我可以使用Malt解析器来解析文本和它预先训练的语法。

我已经从http://www.maltparser.org/mco/mco.html下载了预先训练的模型(engmalt.linear-1.7.mco)。但是我不知道如何使用这个grammer文件和malt解析器(通过malt的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)

执行最后一行后,将显示以下eror消息

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'

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


Tags: inparserparselibpackagesusrlocaldist
1条回答
网友
1楼 · 发布于 2024-04-29 22:57:56

编辑

请注意,由于自2015年8月以来NLTK中的MaltParser API的更新版本,is answer不再工作。这个答案是为了遗产而保留的。

请看下面的答案,让MaltParser使用NLTK:

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


你的设置有几个问题:

  • train_from_file的输入必须是CoNLL格式的文件,而不是预先训练的模型。对于mco文件,可以使用mcoworking_directory参数将其传递给MaltParser构造函数。
  • 默认的java堆分配不够大,无法加载特定的mco文件,因此您必须告诉java在-Xmx参数中使用更多的堆空间。不幸的是,这在现有代码中是不可能的,所以我只是签入了一个更改,以允许为java参数添加一个构造函数参数。见here

所以你需要做的是:

首先,获取最新的NLTK版本:

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

(注意:如果不能使用git版本的NLTK,则必须手动更新文件malt.py,或者从here复制该文件以获得自己的版本。)

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

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

然后添加一个指向malt parser的环境变量:

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))'

相关问题 更多 >