Nltk: chomsky_normal_form() für Grammatiken

Erstellt am 13. Nov. 2017  ·  4Kommentare  ·  Quelle: nltk/nltk

nltk.tree.Tree hat eine chomsky_normal_form() Funktion, aber Grammatiken nicht. Da CNF eine Form der Grammatik ist , sollte es das auch.

enhancement nice idea parsing

Alle 4 Kommentare

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

  • Lange und Leiß (2009). "Auf CNF oder nicht auf CNF? Eine effiziente, aber vorzeigbare Version des CYK-Algorithmus"

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen