nltk.tree.Tree
にはchomsky_normal_form()
関数がありますが、文法にはありません。 CNFは文法の一形態であるため、これも必要です。
NLTKのchomsky_normal_form()
は、ツリーの2値化関数です。 文法に直接適用することはできないと思います。https://github.com/nltk/nltk/blob/develop/nltk/treetransforms.pyを参照して
CNFへの文法変換はかなり複雑で、まだ実装されていません。 それを試みればいいのですが、些細なことではないかもしれません。
誰かが貢献することに興味があるなら、始めるための良いアルゴリズムは
私はまさにこれを探していて、ここでつまずいた、
私は自分のプロジェクトの1つでnltk内部を利用してこの機能を作成しました(ヌル処理はありませんが、その上にあるCKYパーサーも同様ですが、ATISテスト文法などの多くの文法に役立つと思います)、PRを送信していただければ幸いです。この問題がまだ発生していて、作業できるかどうかを確認したいだけです(特に、https://github.com/nltk/nltk/issues/1722の最後のコメントの後)
また、他号に記載されているCYKパーサーがない場合は、PRもお送りします。
@virresh @ alvations #1722を古くしてすみません。 人生は邪魔になっています。
@virreshこれで
https://github.com/aetilley/pcfg/blob/master/src/pcfg.py#L524
通常のアルゴリズムでステップを並べ替えたことを覚えていますが、それらが同等であると自分自身に納得させたことも覚えています。 注意して続行してください。
もう1つの問題を閉じます。
CFGのCNFには問題があります。 彼らは複製された作品を返しています。 これは次の方法でテストできます。
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
プロダクションになります。