Nltk: chomsky_normal_form () para gramáticas

Creado en 13 nov. 2017  ·  4Comentarios  ·  Fuente: nltk/nltk

nltk.tree.Tree tiene una función chomsky_normal_form() , pero las gramáticas no. Dado que CNF es una forma de la gramática , también debería.

enhancement nice idea parsing

Todos 4 comentarios

El chomsky_normal_form() en NLTK es una función de binarización de árbol. Creo que no se puede aplicar directamente a las gramáticas, consulte https://github.com/nltk/nltk/blob/develop/nltk/treetransforms.py

La transformación gramatical a CNF es bastante compleja y aún no se ha implementado. Sería bueno si hubiera un intento, pero puede que no sea trivial.

Si alguien está interesado en contribuir, un buen algoritmo para comenzar es

  • Lange y Leiß (2009). "¿A CNF o no a CNF? Una versión eficiente pero presentable del algoritmo CYK"

Estaba buscando exactamente esto y tropecé aquí,
He creado esta funcionalidad explotando los componentes internos de nltk para uno de mis proyectos (y un analizador CKY encima también, aunque sin manejo de nulos, pero creo que es útil para muchas gramáticas de todos modos, por ejemplo, la gramática de prueba ATIS ), estaría encantado de enviar un PR, solo quería confirmar si este problema aún se mantiene y está disponible para trabajar (especialmente después de los últimos comentarios en https://github.com/nltk/nltk/issues/1722)

Además, si no hay un analizador CYK como se menciona en el otro número, también me complacerá enviar un PR para eso.

@virresh @alvations Lo siento por dejar que # 1722 se vuelva obsoleto. La vida se interpuso en el camino.

@virresh Si quieres

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

Recuerdo que reordenó los pasos en el algoritmo habitual, pero también recuerdo haberme convencido de que eran equivalentes. Proceda con precaución.

Voy a cerrar el otro tema.

Existe un problema con los CNF para CFG; están devolviendo producciones duplicadas. Puede probar esto de la siguiente manera:

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()))))

la gramática tiene producciones 20344 , que cuando se convierten en un conjunto dan producciones 12396 .

¿Fue útil esta página
0 / 5 - 0 calificaciones