import nltk ## Oppgave 2 versjon1 = nltk.CFG.fromstring(""" S -> NP VP NP -> "Per" | "Kari" | "Ola" | "middag" | "boka" NP -> D N D -> "en" N -> "bok" PP -> P NP P -> "til" VP -> V VP -> V NP VP -> V NP PP VP -> V NP NP V -> "gir" V -> "sover" V -> "spiser" V -> "finner" """) setn = ["Per gir en bok til Kari", "Kari gir Per boka", "Ola sover", "Kari spiser", "Kari spiser middag", "Per finner boka"] feil = ["Kari sover boka", "Ola finner"] parser1 = nltk.RecursiveDescentParser(versjon1) print("Parser for grammatiske setninger:") for s in setn: print("-", s) for parse in parser1.parse(s.split()): print(" ", parse) print("Parser for ugrammatiske setninger:") for s in feil: print("-", s) for parse in parser1.parse(s.split()): print(" ", parse) print("=====") # # # Problemet er at VP-regelen ikke holder styr p? hva slags argumenter verbene # # # krever. Vi deler verbene inn i *fire* kategorier: intransitive verb som ikke # # # tar objekt (sover), strengt transitive verb som tar objekt (finner), # # # ditransitive verb som tar to objekter (gir), og valgfritt transitive verb # # # som *kan* ta objekt (spiser). De forskjellige VP-konstruksjonene krever s? # # # de riktige typene verb til hver konstruksjon slik av vi utelukker de # # # ugrammatiske variantene. versjon2 = nltk.CFG.fromstring(""" S -> NP VP NP -> "Per" | "Kari" | "Ola" | "middag" | "boka" NP -> D N D -> "en" N -> "bok" PP -> P NP P -> "til" VP -> Vintrans | Vtrans-opt VP -> Vtrans NP VP -> Vditrans NP PP VP -> Vditrans NP NP Vtrans -> Vtrans-opt | Vtrans-strict Vditrans -> "gir" Vintrans -> "sover" Vtrans-opt -> "spiser" Vtrans-strict -> "finner" """) parser2 = nltk.RecursiveDescentParser(versjon2) print("Parser for grammatiske setninger:") for s in setn: print("-", s) for parse in parser2.parse(s.split()): print(" ", parse) print("Parser for ugrammatiske setninger:") for s in feil: print("-", s) for parse in parser2.parse(s.split()): print(" ", parse)