Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

# Natural Language Toolkit: Generating from a CFG 

# 

# Copyright (C) 2001-2012 NLTK Project 

# Author: Steven Bird <sb@csse.unimelb.edu.au> 

# URL: <http://www.nltk.org/> 

# For license information, see LICENSE.TXT 

# 

from __future__ import print_function 

 

from nltk.grammar import Nonterminal, parse_cfg 

 

def generate(grammar, start=None): 

    if not start: 

        start = grammar.start() 

    return _generate_all(grammar, [start])[0] 

 

def _generate_all(grammar, items): 

    frags = [] 

    if len(items) == 1: 

        if isinstance(items[0], Nonterminal): 

            for prod in grammar.productions(lhs=items[0]): 

                frags.append(_generate_all(grammar, prod.rhs())) 

        else: 

            frags.append(items[0]) 

    else: 

        for frag1 in _generate_all(grammar, [items[0]]): 

            for frag2 in _generate_all(grammar, items[1:]): 

                for frag in _multiply(frag1, frag2): 

                    frags.append(frag) 

    return frags 

 

def _multiply(frag1, frag2): 

    frags = [] 

    if len(frag1) == 1: 

        frag1 = [frag1] 

    if len(frag2) == 1: 

        frag2 = [frag2] 

    for f1 in frag1: 

        for f2 in frag2: 

            frags.append(f1+f2) 

    return frags 

 

grammar = parse_cfg(""" 

  S -> NP VP 

  NP -> Det N 

  VP -> V NP 

  Det -> 'the' 

  Det -> 'a' 

  N -> 'man' | 'park' | 'dog' | 'telescope' 

  V -> 'saw' | 'walked' 

  P -> 'in' | 'with' 

""") 

 

for sent in generate(grammar): 

    print(' '.join(sent))