如何使用python& amp;从Penn Treebank获取一组语法规则? NLTK?

时间:2011-08-14 13:13:36

标签: python parsing grammar nltk tagged-corpus

我是NLTK和Python的新手。我一直在使用示例中给出的玩具语法创建句子解析,但我想知道是否可以使用从Penn Treebank的一部分学到的语法,而不是仅仅编写我自己的或使用玩具语法? (我在Mac上使用Python 2.7) 非常感谢

2 个答案:

答案 0 :(得分:14)

如果你想要一个精确捕获NLTK附带的Penn Treebank样本的语法,你可以这样做,假设你已经下载了NLTK的Treebank数据(见下面的评论):

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应用程序没有使用从Treebank学习CFG规则的方法。最接近的技术是Ren Bods面向数据的解析方法,但它要复杂得多。

最后,这将是如此令人难以置信的缓慢,它是无用的。因此,如果您希望从单个句子中看到这种方法的语法只是为了证明它有效,请尝试以下代码(在上面的导入之后):

mini_grammar = ContextFreeGrammar(Nonterminal('S'),
                                  treebank.parsed_sents()[0].productions())
parser = nltk.parse.EarleyChartParser(mini_grammar)
print parser.parse(treebank.sents()[0])

答案 1 :(得分:3)

可以在treebank_chunk或conll2000语料库上训练Chunker。你没有得到它的语法,但你确实得到了一个可以解析短语块的pickle-able对象。请参阅How to Train a NLTK ChunkerChunk Extraction with NLTKNLTK Classified Based Chunker Accuracy