2016-03-28 13 views
1
grammar = nltk.CFG.fromstring(""" 
S -> NP VP Q |Q NP VP| 
NP -> Det N | Det N PP 
VP -> V NP | V NP PP 
PP -> P NP 
NP -> 'I' 
N -> 'man' | 'park' | 'telescope' | 'dog'|'car' 
Det -> 'the' | 'a' 
P -> 'in' | 'with' 
V -> 'saw' 
Q ->'As'|null 
""") 
sent = 'I saw a car in the park'.split() 

parser = nltk.ChartParser(grammar, trace=2) 
t= parser.parse(sent) 
for tree in t: 
#print(tree) 
tree.draw() 

Yukarıdaki cümlede 'As' isteğe bağlıdır. Nltk dilbilgisine null veya lambda yazarım?CFG'de null veya lambda nasıl tanımlanır?

+1

Bu özel dilbilgisinde, ilk satırı aşağıdaki gibi değiştirerek Q ihtiyacını ortadan kaldırabilirsiniz: S -> 'As' NP VP | NP VP 'As' | NP VP –

+0

@ScottHunter, Q'nun birden fazla değere sahip olabileceğini düşünür Q -> 'Ama' | 'As' | "ne zaman" | null. Dilbilgisinde null yazmayı öğrenmek istiyorum. – gully

cevap

1
'u null nolu boşluğa ve geri kalanını Qx numaralı telefondan ayırdık. Daha sonra S için kuralı yeniden yazabilirsiniz:

S -> Qx NP VP | NP VP Qx | NP VP

ve Q'a ihtiyaç yoktur.

Aslında boş dizeyi kabul etmeniz gerekmedikçe, herhangi bir CFG "boş" değerine sahip olmayacak şekilde dönüştürülebilir.

+0

evet bu bir olasılık ama dilbilgisinde nasıl yazılacağını bilmek istedim. Ayrıca eğer üretimlerim artarsa, o zaman karmaşıklaşır. – gully

İlgili konular