如何为 NLTK 中的歧义句子生成多个解析树?

Posted

技术标签:

【中文标题】如何为 NLTK 中的歧义句子生成多个解析树?【英文标题】:How to generate multiple parse trees for an ambiguous sentence in NLTK? 【发布时间】:2013-10-04 04:02:57 【问题描述】:

我在 Python 中有以下代码。

sent = [("very","ADJ"),("colourful","ADJ"),("ice","NN"),("cream","NN"),("van","NN")] 
patterns= r"""
  NP:<ADJ>*<NN>+  

"""
NPChunker=nltk.RegexpParser(patterns) # create chunk parser
for s in NPChunker.nbest_parse(sent):
    print s.draw()

输出是:

(S (NP very/ADJ colourful/ADJ ice/NN cream/NN van/NN))

但输出应该有另外 2 个解析树。

(S (NP very/ADJ colourful/ADJ ice/NN) (NP cream/NN) (NP van/NN))
(S (NP very/ADJ colourful/ADJ ice/NN cream/NN) van/NN)

问题是 RegexpParser 只采用第一个正则表达式。如何一次生成所有可能的解析树?

【问题讨论】:

【参考方案1】:

这对于 RegexpParser 类是不可能的。它从 ParserI 接口继承了 nbest_parse 方法,查看源代码 (https://github.com/nltk/nltk/blob/master/nltk/parse/api.py) 可以看出它只是默认运行基类的 parse 方法并将其作为可迭代对象返回。

正如有人试图在Chunking with nltk 中解释的那样,分块类不是用于此目的的工具(还没有!),看看http://nltk.org/book/ch08.html,有一些简单的例子,这只会让你半途而废与您想要实现的目标,需要大量的预处理和智能设计。

【讨论】:

以上是关于如何为 NLTK 中的歧义句子生成多个解析树?的主要内容,如果未能解决你的问题,请参考以下文章

在 NLTK 解析器中使用整数/日期作为终端

如何用 Python 中的 NLTK 对中文进行分析和处理

如何使用 nltk.Regexp.parser() 解析自定义标签

使用NLTK和MaltParser的依赖性解析器

nltk如何给出多个分隔的句子

搜索自然语言句子结构