如何用python和NLTK从宾夕法尼亚树库获取一组语法规则?
我对NLTK和Python还比较陌生。我一直在用示例中提供的简单语法来创建句子解析,但我想知道是否可以使用从Penn Treebank的一部分学习到的语法,而不是仅仅自己写或者使用那些简单的语法?(我在Mac上使用Python 2.7)非常感谢!
2 个回答
3
你可以在 treebank_chunk 或 conll2000 这些数据集上训练一个分块器(Chunker)。虽然你不能从中得到一个完整的语法规则,但你会得到一个可以保存的对象,它能解析短语块。想了解更多,可以看看这些链接:如何训练一个 NLTK 分块器,使用 NLTK 进行分块提取,还有 NLTK 分类器基础的分块器准确性。
13
如果你想要一个能准确捕捉到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中许多短语的结构比较简单,这种语法对那些没有在训练中出现的句子泛化能力很差。这就是为什么一些尝试解析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])