如何在Python中使用斯坦福解析器的类型依赖?

3 投票
2 回答
1181 浏览
提问于 2025-04-18 11:40

想看看带类型依赖的例子,可以去看看这个在线示例的输出结果。

当我在命令行运行stanford parser,使用lexparser.sh的时候,它会输出树形结构和类型依赖。

但是当我用nltk.parse.stanford来运行时,只能得到树形结构,没有类型依赖。如果我想让它返回依赖关系,可以通过设置-outputFormat="penn,typedDependencies"来修改,具体可以参考这里,不过那样我只会得到文本。我在想,是否有人已经把这些处理成更有用的形式了。

斯坦福的CoreNLP网站列出了几个Python的扩展,不过大部分看起来都是相关的分支。从源代码看,这个库在处理依赖关系方面看起来很有前途,不过完全没有文档,我也不太确定怎么用。

很多这些库提供作为服务运行,并通过HTTP进行通信。我在想,这样会不会比NLTK与解析器的交互更快,因为这样可能不需要重复启动新的JVM。

我不太确定CoreNLP和Stanford Parser之间有什么区别。

我还发现了这个,不过它使用了JPype,我没能成功编译。

2 个回答

0

我刚刚回答了另一个问题,觉得那个答案更适合这个问题 :)

我一直在用minidom解析CoreNLP的输出。这里有一些入门代码,你可以试试,不过你可能还想看看这个链接

注意,你需要获取斯坦福CoreNLP使用的分词信息,因为返回的数据是基于句子和词语的偏移量。

from xml.dom import minidom    
xmldoc = minidom.parseString(raw_xml_data)
for sentence_xml in xmldoc.getElementsByTagName('sentences')[0].getElementsByTagName('sentence'):
    parse = parser.parse(sentence_xml.getElementsByTagName('parse')[0].firstChild.nodeValue)
    tokens = [(i,j) for i,j in zip(sentence_xml.getElementsByTagName('tokens')[0].getElementsByTagName('token'),parse.get_leaves())]
    # example for processing dependencies
    elements = sentence_xml.getElementsByTagName('dependencies')
    for element in elements:
        if element.getAttribute('type')=="collapsed-ccprocessed-dependencies":
            dependencies += [i for i in element.getElementsByTagName('dep')]
1

我最近做了一个项目,主要用到了CoreNLP和斯坦福解析器。首先,如果你打算使用这些工具,我强烈建议你用Java来写代码,因为用Python来搞这个真的是太麻烦了。不过,我还是成功让它工作了。

我推荐使用这个来和CoreNLP进行交流,这对我来说效果最好。使用这个需要启动JVM(Java虚拟机),然后和它本地沟通(不过这个工具会帮你搞定)。不过,它有个“可爱的”错误,有时候会返回上一次的解析结果,而不是刚刚发送的,或者根本不返回。我们使用了一个装饰器,可以在设定的时间后重新启动解析,这个方法可以在这里找到。

祝你好运,这个任务可不简单。另外要注意,NTLK的斯坦福解析器相比完整的CoreNLP来说是不完整的。你不需要NTLK就可以使用CoreNLP,它基本上能提供你从命名实体识别到词性标注再到依赖关系分析所需的一切。

撰写回答