Recursion in Linguistic Structure
Building Nested Structure with Cascaded Chunkers
So far, our chunk structures have been relatively flat. Trees
consist of tagged tokens, optionally grouped under a chunk node such
as NP. However, it is possible to
build chunk structures of arbitrary depth, simply by creating a
multistage chunk grammar containing recursive rules. Example 7-9 has patterns for noun phrases,
prepositional phrases, verb phrases, and sentences. This is a
four-stage chunk grammar, and can be used to create structures having
a depth of at most four.
Example 7-9. A chunker that handles NP, PP, VP, and S.
grammar = r"""
NP: {<DT|JJ|NN.*>+} # Chunk sequences of DT, JJ, NN
PP: {<IN><NP>} # Chunk prepositions followed by NP
VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
CLAUSE: {<NP><VP>} # Chunk NP, VP
"""
cp = nltk.RegexpParser(grammar)
sentence = [("Mary", "NN"), ("saw", "VBD"), ("the", "DT"), ("cat", "NN"),
("sit", "VB"), ("on", "IN"), ("the", "DT"), ("mat", "NN")]>>> print cp.parse(sentence)
(S
(NP Mary/NN)
saw/VBD
(CLAUSE
(NP the/DT cat/NN)
(VP sit/VB (PP on/IN (NP the/DT mat/NN)))))Unfortunately this result misses the VP headed by saw. It
has other shortcomings, too. Let’s see what happens when we apply this
chunker to a sentence having deeper nesting. Notice that it fails to
identify the VP chunk starting at
.
>>> sentence = [("John", "NNP"), ("thinks", "VBZ"), ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access