Nltk: chomsky_normal_form() 用于语法

创建于 2017-11-13  ·  4评论  ·  资料来源: nltk/nltk

nltk.tree.Tree有一个chomsky_normal_form()函数,但语法没有。 由于 CNF 是语法的一种形式,它也应该如此。

enhancement nice idea parsing

所有4条评论

NLTK 中的chomsky_normal_form()是一个树二值化函数。 我认为它不能直接应用于语法,参见https://github.com/nltk/nltk/blob/develop/nltk/treetransforms.py

向 CNF 的语法转换相当复杂,尚未实现。 如果有尝试的话会很好,但它可能不是微不足道的。

如果有人对贡献感兴趣,一个好的开始算法是

  • 朗格和莱斯(2009 年)。 “CNF 还是不 CNF?CYK 算法的一个有效但可展示的版本”

我正在四处寻找这个并偶然发现这里,
我通过为我的一个项目利用 nltk 内部结构(以及在它之上的 CKY 解析器,虽然没有空处理,但我相信它无论如何对很多语法有用,例如 ATIS 测试语法)创建了这个功能),很乐意发送 PR,只是想确认这个问题是否仍然存在并且可以处理(特别是在 https://github.com/nltk/nltk/issues/1722 中的最后一条评论之后)

此外,如果没有其他问题中提到的 CYK 解析器,我也很乐意为此发送 PR

@virresh @alvations很抱歉让 #1722 变得陈旧。 生活受到了阻碍。

@virresh如果您想

https://github.com/aetiley/pcfg/blob/master/src/pcfg.py#L524

我记得它重新排序了通常算法中的步骤,但我也记得说服自己它们是等效的。 谨慎行事。

我将关闭另一个问题。

CFGs的CNFs有问题; 他们正在返回重复的作品。 您可以通过以下方式进行测试:

import nltk
grammar = nltk.data.load("grammars/large_grammars/atis.cfg")
grammar = grammar.chomsky_normal_form()
print(len(grammar.productions()))
print(len(list(set(grammar.productions()))))

语法有20344产生式,当转换为集合时会产生12396产生式。

此页面是否有帮助?
0 / 5 - 0 等级