【发布时间】:2011-08-14 13:13:35
【问题描述】:
我对 NLTK 和 Python 还很陌生。我一直在使用示例中给出的玩具语法来创建句子解析,但我想知道是否可以使用从 Penn Treebank 的一部分中学到的语法,而不是仅仅编写我自己的或使用玩具语法? (我在 Mac 上使用 Python 2.7) 非常感谢
【问题讨论】:
标签: python parsing grammar nltk tagged-corpus
我对 NLTK 和 Python 还很陌生。我一直在使用示例中给出的玩具语法来创建句子解析,但我想知道是否可以使用从 Penn Treebank 的一部分中学到的语法,而不是仅仅编写我自己的或使用玩具语法? (我在 Mac 上使用 Python 2.7) 非常感谢
【问题讨论】:
标签: python parsing grammar nltk tagged-corpus
如果您想要一个精确捕获 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])
【讨论】:
import nltk,调用 nltk.download(),在出现的窗口中单击“Corpora”选项卡,选择“treebank”,最后单击“Download”并在您关闭时关闭它重新完成。
可以在 treebank_chunk 或 conll2000 语料库上训练一个 Chunker。你没有从中得到语法,但你确实得到了一个可以解析短语块的可腌制对象。请参阅How to Train a NLTK Chunker、Chunk Extraction with NLTK 和 NLTK Classified Based Chunker Accuracy。
【讨论】: