【问题标题】:How to use malt parser in python nltk如何在 python nltk 中使用麦芽解析器
【发布时间】:2012-12-23 07:18:02
【问题描述】:

作为我学术项目的一部分,我需要将一堆任意句子解析为依赖关系图。经过大量搜索后,我得到了可以使用 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'

请帮助我使用这个 malt 解析器来解析那句话。

【问题讨论】:

标签: python parsing nlp nltk


【解决方案1】:

已编辑

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

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

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


您的设置存在几个问题:

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

所以这是你需要做的:

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

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

(注意:如果您不能使用 NLTK 的 git 版本,则必须手动更新文件 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 parser:

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

【讨论】:

  • 我遇到异常 [code] 异常:MaltParser 解析 (java -Xmx512m -jar /usr/lib/malt-1.7.2/malt.jar -w /home/rohith/malt- 1.7.2 -c /home/rohith/malt-1.7.2/engmalt.linear-1.7 -i /home/rohith/malt-1.7.2/malt_input.conllQh6zIp -o /home/rohith/malt-1.7.2/ malt_output.conllm8yyes -m parse) 失败,退出代码为 1 [代码]
  • 看起来您将整个路径作为mco 参数而不只是文件名。你只需要做mco="engmalt.linear-1.7"
  • 在这两种情况下都得到相同的异常。 code 例外:MaltParser 解析(java -Xmx512m -jar /usr/lib/malt-1.7.2/malt.jar -w /home/rohith/malt-1.7.2 -c engmalt.linear-1.7 -i /home /rohith/malt-1.7.2/malt_input.conllDYGP0m -o /home/rohith/malt-1.7.2/malt_output.conllIyDCrc -m parse) 失败,退出代码为 1 code
  • 好的,从终端运行错误给你的命令,看看 malt 解析器实际上在说什么。 (您必须编辑 malt.py 以注释掉 os.remove 行,以免文件被删除。)
  • 我收到了与该线程第一条评论中提到的相同的错误。更具体地说,错误是:“异常:MaltParser 解析(java -Xmx512m -jar /usr/local/bin/malt.jar -w /home/satarupa -c engmalt.linear-1.7 -i /home/satarupa/malt_input. conlldTd4uy -o /home/satarupa/malt_output.conllcgU_Kq -m parse) failed with exit code 1” 我想我已经遵循了这个答案中提到的所有内容。我已经通过git克隆得到NLTK,所以我认为malt.py应该没问题。
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多