nltk.tree.Tree
有一个chomsky_normal_form()
函数,但语法没有。 由于 CNF 是语法的一种形式,它也应该如此。
NLTK 中的chomsky_normal_form()
是一个树二值化函数。 我认为它不能直接应用于语法,参见https://github.com/nltk/nltk/blob/develop/nltk/treetransforms.py
向 CNF 的语法转换相当复杂,尚未实现。 如果有尝试的话会很好,但它可能不是微不足道的。
如果有人对贡献感兴趣,一个好的开始算法是
我正在四处寻找这个并偶然发现这里,
我通过为我的一个项目利用 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
产生式。