上下文无关文法(context-free grammar,CFG)是指文法中所有的产生式左边只有一个非终结符,比如:
S -> aSb
S -> ab
S -> aSb
S -> ab
这个文法有两个产生式,每个产生式左边只有一个非终结符S,这就是上下文无关文法,因为你只要找到符合产生式右边的串,就可以把它归约为对应的非终结符。下面是一个简单的上下文无关文法的例子:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May 8 12:58:28 2018
@author: dag
"""
import nltk
from nltk import CFG
grammar1 = CFG.fromstring("""
s -> NP VP
VP -> V NP | V NP PP
PP -> P NP
V -> "saw" | "ate" | "walked"
NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
Det -> "a" | "an" | "the" | "my"
N -> "man" | "dog" | "cat" | "telescope" | "park"
P -> "in" | "on" | "by" | "with"
""")
sent = "Mary saw Bob".split()
rd_parser = nltk.RecursiveDescentParser(grammar1)
for tree in rd_parser.parse(sent):
print (tree)
tree.draw()
output:
runfile('/Users/dag/cfg.py', wdir='/Users/dag')
(s (NP Mary) (VP (V saw) (NP Bob)))