Courses‎ > ‎Python worksheets‎ > ‎

Demo: computational semantics in NLTK


import nltk
import nltk.data


#######
# The following grammar shows how to do syntactic analysis
# with context-free grammar in NLTK.
# There is no semantics construction in this grammar.

gramstring = r"""
% start S

S -> NP VP

NP -> PN

VP -> IV
VP -> TV NP

PN -> 'Vincent'
PN -> 'Mia'

IV -> 'sleeps'
TV -> 'loves'
"""

grammar = nltk.grammar.CFG.fromstring(gramstring)

parser = nltk.parse.ChartParser(grammar)

inputs = ["Vincent sleeps", "Vincent loves Mia"]

for sent in inputs:
    print("\nsentence:", sent, "\n")
    trees = parser.parse(sent.split())
    for tree in trees:
        print(tree)

#######
# Now we add semantics. We do this in brackets after each nonterminal (constituent or POS label).
# The following grammar only has proper nouns, no other NPs,
# and represents Vincent as simply "vincent", of type e.
gramstring = r"""
% start S

S[SEM = <?vp(?np)>] -> NP[SEM=?np] VP[SEM=?vp]

NP[SEM=?pn] -> PN[SEM=?pn]

VP[SEM=?v] -> IV[SEM=?v]
VP[SEM=<?v(?np)>] -> TV[SEM=?v] NP[SEM=?np]

PN[SEM=<vincent>] -> 'Vincent'
PN[SEM=<mia>] -> 'Mia'

IV[SEM=<\x.sleep(x)>] -> 'sleeps'
TV[SEM=<\y x.love(x,y)>] -> 'loves'
"""

grammar = nltk.grammar.FeatureGrammar.fromstring(gramstring)

parser = nltk.parse.FeatureChartParser(grammar)


inputs = ["Vincent sleeps", "Vincent loves Mia"]

for sent in inputs:
    print("\nsentence:", sent, "\n")
    trees = parser.parse(sent.split())
    for tree in trees:
        print(tree)

#######
# The following grammar has noun phrases that are either
# proper nouns or Det N.
# Noun phrases are of type <<e, t>, t>
gramstring = r"""
% start S

S[SEM = <?np(?vp)>] -> NP[SEM=?np] VP[SEM=?vp]

NP[SEM=?pn] -> PN[SEM=?pn]
NP[SEM=<?det(?n)>] -> Det[SEM=?det] N[SEM=?n]

VP[SEM=?v] -> IV[SEM=?v]
VP[SEM=<?v(?np)>] -> TV[SEM=?v] NP[SEM=?np]

PN[SEM=<\P.P(vincent)>] -> 'Vincent'
PN[SEM=<\P.P(mia)>] -> 'Mia'

N[SEM=<\x.robber(x)>] -> 'robber'

Det[SEM=<\P Q.all x.(P(x) -> Q(x))>] -> 'every'

IV[SEM=<\x.sleep(x)>] -> 'sleeps'
TV[SEM=<\X x.X(\y.love(x,y))>] -> 'loves'
"""

grammar = nltk.grammar.FeatureGrammar.fromstring(gramstring)

parser = nltk.parse.FeatureChartParser(grammar)

inputs = ["Vincent sleeps", "Mia loves every robber"]

for sent in inputs:
    print("\nsentence:", sent, "\n")
    trees = parser.parse(sent.split())
    for tree in trees:
        print(tree)

################
# Blackburn and Bos
# chapter 2
# This grammar only does the syntax!

gramstring = """
% start S
S -> NP VP

VP -> VBAR[FIN=fin]
VP -> MOD VBAR[FIN=inf]
VP -> VP COORD VP

NP -> DET NBAR
NP -> PN
NP -> PRO
NP -> NP COORD NP

NBAR -> N
NBAR -> N PP
NBAR -> N RC
NBAR -> NBAR COORD NBAR

VBAR[FIN=?f] -> TV[FIN=?f] NP
VBAR[FIN=?f] -> IV[FIN=?f]
VBAR[FIN=?f] -> VBAR[FIN=?F] COORD VBAR[FIN=?f]
VBAR[FIN=fin] -> COP NP
VBAR[FIN=fin] -> COP NEG NP

N -> N COORD N

PP -> PREP NP
RC -> RELPRO VP

##################
COORD -> 'and'
COORD -> 'or'

COP -> 'is'

DET -> 'every'
DET -> 'a'

IV[FIN=fin] -> 'collapses'
IV[FIN=fin] -> 'dances'
IV[FIN=fin] -> 'snorts'

IV[FIN=inf] -> 'collapse'
IV[FIN=inf] -> 'dance'
IV[FIN=inf] -> 'snort'

N -> 'bar'
N -> 'boxer'
N -> 'criminal'
N -> 'owner'
N -> 'woman'

PN -> 'Vincent'
PN -> 'Mia'

PREP -> 'of'

PRO -> 'she'
PRO -> 'he'

MOD -> "doesn't"

NEG -> 'not'

RELPRO -> 'that'

TV[FIN=fin] -> 'kills'
TV[FIN=fin] -> 'knows'
TV[FIN=fin] -> 'loves'

TV[FIN=inf] -> 'kill'
TV[FIN=inf] -> 'know'
TV[FIN=inf] -> 'love'
"""


grammar = nltk.grammar.FeatureGrammar.fromstring(gramstring)

parser = nltk.parse.FeatureChartParser(grammar)

inputs = ["Mia knows every owner of a bar", "Vincent or Mia dances", "every boxer that kills a criminal loves a woman", "Vincent doesn't love a boxer or criminal that snorts", "she doesn't love a boxer or criminal that snorts and dances", "a boxer snorts", "he collapses", "Mia is a woman", "Vincent is not a boxer"]


print( "************ B&B chapter 2 *****")

for sent in inputs:
    print("\nsentence:", sent, "\n")
    trees = parser.parse(sent.split())
    for tree in trees:
        print(tree)


Comments