Mat*_*son 13 python grammar parsing nltk tagged-corpus
我是NLTK和Python的新手.我一直在使用示例中给出的玩具语法创建句子解析,但我想知道是否可以使用从Penn Treebank的一部分学到的语法,而不是仅仅编写我自己的或使用玩具语法?(我在Mac上使用Python 2.7)非常感谢
Con*_*ine 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))
Run Code Online (Sandbox Code Playgroud)
但是,这可能不会给你一些有用的东西.由于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])
Run Code Online (Sandbox Code Playgroud)
可以在 treebank_chunk 或 conll2000 语料库上训练 Chunker。你不会从中得到语法,但你确实得到了一个可以解析短语块的可腌制对象。请参阅如何训练 NLTK 分块器、使用 NLTK 进行分块提取以及基于 NLTK 分类的分块器精度。