作为我的学术项目的一部分,我需要将一堆任意句子解析为一个依赖关系图。经过大量搜索后,我得到了可以使用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
使用mco
和working_directory
参数将其传递给构造函数。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的服务处理这些表达式。 角表达式不必访问全局变量喜欢 ,或。此限制是有意的。它可以防止意外访问