Ответ 1
Если вам нужна грамматика, которая точно отображает образец 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 эта грамматика будет очень плохо обобщаться на предложения, которые не были включены в обучение. Вот почему приложения NLP, которые пытались разобрать древовидный банк, не использовали подход изучения правил CFG из Treebank. Ближайшей техникой для этого будет подход с привязкой данных с привязкой к данным в базе данных, но он намного более сложный.
Наконец, это будет так невероятно медленно, что это бесполезно. Поэтому, если вы хотите увидеть этот подход в действии по грамматике из одного предложения, чтобы доказать, что он работает, попробуйте следующий код (после импорта выше):
mini_grammar = ContextFreeGrammar(Nonterminal('S'),
treebank.parsed_sents()[0].productions())
parser = nltk.parse.EarleyChartParser(mini_grammar)
print parser.parse(treebank.sents()[0])