作为我学术项目的一部分,我需要将一堆任意句子解析成依赖图。经过大量的搜索后,我得到了一个解决方案,我可以使用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'
请帮我用这个麦芽解析器解析那句话。
答案 0 :(得分:20)
请注意,由于自2015年8月以来NLTK中MaltParser API的更新版本,答案已不再有效。此答案是为了传统而保留的。
请参阅此答案,让MaltParser与NLTK合作:
免责声明:这不是一个永恒的解决方案。以上链接(2016年2月发布)中的答案现在可以使用。但是当MaltParser或NLTK API发生变化时,它也可能会将语法更改为在NLTK中使用MaltParser。
您的设置存在两个问题:
train_from_file
的输入必须是CoNLL格式的文件,而不是预先训练的模型。对于mco
文件,您可以使用MaltParser
和mco
参数将其传递给working_directory
构造函数。mco
文件,因此您必须告诉java使用-Xmx
参数的更多堆空间。不幸的是现有的代码是不可能的,所以我只是检查了一个更改,以允许java args的其他构造函数参数。见here。所以这就是你需要做的事情:
首先,获取最新的NLTK修订版:
git clone https://github.com/nltk/nltk.git
(注意:如果你不能使用NLTK的git版本,那么你必须手动更新文件malt.py
或从here复制它以拥有自己的版本。)< / p>
其次,将jar文件重命名为malt.jar
,这是NLTK所期望的:
cd /usr/lib/
ln -s maltparser-1.7.2.jar malt.jar
然后添加一个指向malt解析器的环境变量:
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))'