# L?SNINGSFORSLAG, GRUPPEOPPGAVE 5 # OPPGAVE 2.1 import nltk 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"] parser1 = nltk.RecursiveDescentParser(versjon1) print("2.1 - Parser for grammatiske setninger:") for s in setn: print("-", s) for parse in parser1.parse(s.split()): print(" ", parse) # OPPGAVE 2.2 feil = ["Kari sover boka", "Ola finner"] print("\n2.2 - Parser for ugrammatiske setninger:") for s in feil: print("-", s) for parse in parser1.parse(s.split()): print(" ", parse) # OPPGAVE 2.3 ''' 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("\n2.3 - Parser for grammatiske setninger:") for s in setn: print("-", s) for parse in parser2.parse(s.split()): print(" ", parse) print("\n2.3 - Parser for ugrammatiske setninger:") for s in feil: print("-", s) for parse in parser2.parse(s.split()): print(" ", parse)