Как получить набор правил грамматики из Penn Treebank с помощью python & NLTK?

Я новичок в NLTK и Python. Я создавал парсисы предложений, используя грамматики игрушек, приведенные в примерах, но я хотел бы знать, можно ли использовать грамматику, полученную из части Penn Treebank, скажем, в отличие от простого написания моего или использования игрушки грамматик? (Я использую Python 2.7 на Mac) Большое спасибо

Ответы

Ответ 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])

Ответ 2

Можно обучить Chunker на treebank_chunk или conll2000 корпусах. Вы не получите грамматики, но у вас есть объект, способный распутать, который может разбирать фразовые фрагменты. См. Как подключить Chunker NLTK, Извлечение фрагментов с помощью NLTK, и Точность Chunker, классифицированная по NLTK.