nltk.tree.Tree
hat eine chomsky_normal_form()
Funktion, aber Grammatiken nicht. Da CNF eine Form der Grammatik ist , sollte es das auch.
Das chomsky_normal_form()
in NLTK ist eine Baum-Binarisierungsfunktion. Ich denke, es kann nicht direkt auf Grammatiken angewendet werden, siehe https://github.com/nltk/nltk/blob/develop/nltk/treetransforms.py
Die Grammatikumwandlung in CNF ist ziemlich komplex und wurde noch nicht implementiert. Es wäre gut, wenn es einen Versuch geben würde, aber es ist vielleicht nicht trivial.
Wenn jemand daran interessiert ist, einen Beitrag zu leisten, ist ein guter Algorithmus für den Anfang
Ich habe mich genau danach umgesehen und bin hier gestolpert,
Ich habe diese Funktionalität erstellt, indem ich nltk-Interna für eines meiner Projekte ausgenutzt habe (und darüber hinaus einen CKY-Parser, wenn auch ohne Nullbehandlung, aber ich glaube, es ist sowieso für viele Grammatiken nützlich, z. B. für die ATIS-Testgrammatik ), schicke gerne eine PR, wollte nur bestätigen, ob dieses Thema noch besteht und zur Bearbeitung verfügbar ist (insbesondere nach den letzten Kommentaren in https://github.com/nltk/nltk/issues/1722)
Auch wenn es keinen CYK-Parser gibt, wie in der anderen Ausgabe erwähnt, schicke ich auch gerne eine PR dafür
@virresh @alvations Entschuldigung, dass #1722 veraltet wird. Das Leben ist dazwischengekommen.
@virresh Wenn Sie sich das
https://github.com/aetilley/pcfg/blob/master/src/pcfg.py#L524
Ich erinnere mich, dass es die Schritte im üblichen Algorithmus neu anordnete, aber ich erinnere mich auch daran, mich davon überzeugt zu haben, dass sie gleichwertig waren. Mit Vorsicht fortfahren.
Ich schließe das andere Thema.
Es gibt ein Problem mit CNFs für CFGs; sie geben doppelte Produktionen zurück. Sie können dies testen, indem Sie:
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()))))
Grammatik hat 20344
Produktionen, die, wenn sie in ein Set umgewandelt werden, 12396
Produktionen ergeben.