当前位置: 首页 > 面试题库 >

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

那鹏
2023-03-14
问题内容

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

我已经从http://www.maltparser.org/mco/mco.html下载了预训练模型(engmalt.linear-1.7.mco)。但是我不知道如何使用此语法文件和麦芽解析器(通过麦芽的python接口)解析我的句子。我已经下载了最新版本的麦芽解析器(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'

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


问题答案:

请注意,由于自2015年8月以来NLTK中MaltParser API的更新版本,因此该答案不再起作用。保留该答案是为了保留原有的原因。

免责声明 :这不是永恒的解决方案。上面链接中的答案(发布于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

(注意:如果您不能使用NLTK的git版本,则必须malt.py手动更新文件或从此处复制文件以拥有自己的版本。)

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

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

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

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

最后,在python中加载并使用麦芽解析器:

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


 类似资料:
  • 问题内容: 我已经尝试在阳光下进行所有操作,以使Malt Parser(1.7.1)与他们的预训练模型(添加了.mco hack)一起工作。我得到的最接近的是一个DependencyGraph,每个单词的第一个字母作为标签。我只到过那里一次,无法回去。99%的时间,我得到的是: 如果我对正在写入临时文件的目录进行了整理,或者在sudo下执行python,就会发生这种情况。我尝试过使用Malt Pa

  • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。

  • 问题内容: 我正在尝试解析JSON但收到此错误: 在没有更多上下文的情况下,表达类型不明确 我的代码是: 在没有尝试捕获的情况下,在Xcode 6.4中可以正常工作,但是在Xcode 7中则无法工作。 问题答案: 不要为已解码对象声明类型,因为您希望它是an,并且您正在执行转换来做到这一点。 另外,最好将零选项用于NSJSONSerialization而不是随机选项。 在我的示例中,我还使用了一个

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 问题内容: 可能这是最简单的事情,但是我无法以角度将字符串解析为Int。 我正在尝试做的是: 如何求和这些num1和num2值? 谢谢! 问题答案: 您不能(至少目前)不能使用内部角度表达式,因为它们不会直接求值。引用 文档 : Angular不使用JavaScript 来评估表达式。相反,Angular的服务处理这些表达式。 角表达式不必访问全局变量喜欢 ,或。此限制是有意的。它可以防止意外访问