Как я могу получить набор правил грамматики от Penn Treebank, используя python & NLTK? - PullRequest
14 голосов
/ 14 августа 2011

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

Ответы [ 2 ]

14 голосов
/ 14 сентября 2011

Если вам нужна грамматика, точно фиксирующая образец 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])
3 голосов
/ 14 августа 2011

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

...