我对 NLTK 和 Python 还很陌生。我一直在使用示例中给出的玩具语法来创建句子解析,但我想知道是否可以使用从 Penn Treebank 的一部分中学到的语法,而不是仅仅编写我自己的或使用玩具语法?(我在 Mac 上使用 Python 2.7)非常感谢
问问题
11636 次
2 回答
13
如果您想要一个精确捕获 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 应用程序没有使用从树库中学习 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])
于 2011-09-14T14:43:19.557 回答
3
可以在 treebank_chunk 或 conll2000 语料库上训练一个 Chunker。你没有从中得到语法,但你确实得到了一个可以解析短语块的可腌制对象。请参阅如何训练 NLTK 分块器、使用 NLTK 进行块提取和基于分类的 NLTK 分块器准确性。
于 2011-08-14T17:01:23.480 回答