Если вам нужна грамматика, точно фиксирующая образец Penn Treebank, который поставляется с NLTK, вы можете сделать это, предполагая, что вы загрузили данные Treebank для NLTK (см. Комментарий ниже):
import nltk
from nltk.corpus import treebank
from nltk.grammar import ContextFreeGrammar, Nonterminal
tbank_productions = set(production for sent in treebank.parsed_sents()
for production in sent.productions())
tbank_grammar = ContextFreeGrammar(Nonterminal('S'), list(tbank_productions))
Это, вероятно, не даст вам чего-то полезного.Поскольку NLTK поддерживает синтаксический анализ только с грамматиками со всеми указанными терминалами, вы сможете анализировать только предложения, содержащие слова в образце Treebank.
Кроме того, из-за плоской структуры многих фраз в Treebank эта грамматикабудет очень плохо обобщать предложения, которые не были включены в обучение.Вот почему приложения НЛП, которые пытались проанализировать древовидный банк, не использовали подход изучения правил CFG из древовидного банка.Наиболее близким к этому подходу был бы подход Ren Bods Data Oriented Parsing, но он гораздо более сложный.
Наконец, это будет невероятно медленным, бесполезным.Поэтому, если вы хотите увидеть этот подход в действии над грамматикой из одного предложения, просто чтобы доказать, что он работает, попробуйте следующий код (после импорта выше):
mini_grammar = ContextFreeGrammar(Nonterminal('S'),
treebank.parsed_sents()[0].productions())
parser = nltk.parse.EarleyChartParser(mini_grammar)
print parser.parse(treebank.sents()[0])