300 likes | 453 Views
grammatiker. 21.1 G 1 (BBS 7). dagens föreläsning. definitioner kontextfria regler (cfg) hur implementerar man cfg i prolog? vänsterrekursion. definitioner. några lingvistiska förkortningar: s = sentence np = noun phrase vp = verb phrase det = determiner n = noun v = verb. np.
E N D
grammatiker 21.1 G 1 (BBS 7) Pontus Johansson [ponjo@ida.liu.se]
dagens föreläsning • definitioner • kontextfria regler (cfg) • hur implementerar man cfg i prolog? • vänsterrekursion Pontus Johansson [ponjo@ida.liu.se]
definitioner • några lingvistiska förkortningar: s = sentence np = noun phrase vp = verb phrase det = determiner n = noun v = verb Pontus Johansson [ponjo@ida.liu.se]
np • np = noun phrase (noun group) pelle flyger… en skabbig hund grubblar… hon sparras… tre bra band från seattle spelar… en tuff tvättbjörn som oskar äter… Pontus Johansson [ponjo@ida.liu.se]
np (forts.) • ett ”bevis” på att vissa ord hänger ihop inom samma np tycks alltså vara att de uppstår i liknande syntaktiska kontexter (t ex följs av ett verb) • men individuella ord inom frasen behöver nödvändigtvis inte kunna det… Pontus Johansson [ponjo@ida.liu.se]
np (forts.) *skabbig grubblar… *från spelar… *tuff äter… Pontus Johansson [ponjo@ida.liu.se]
modell • matematiska modeller • kontextfri grammatik (cfg), eller • frasstrukturgrammatik, och sägs vara i • backus-naur form (bnf) • grundidé är hur som helst: • regler + ett lexikon Pontus Johansson [ponjo@ida.liu.se]
definitioner (forts.) • ett språk är en ändlig mängd satser • en sats är en lista av terminaler… • …som ingår i ett alfabete (en mängd av terminaler) • en grammatik är en ändlig samling regler som definierar ett språk • regler består av terminaler och icke-terminaler Pontus Johansson [ponjo@ida.liu.se]
regler En kontextfri regel har formen: X0 -> X1 … Xn där X0 är en icke-terminal och Xi är terminaler ELLER icke-terminaler Pontus Johansson [ponjo@ida.liu.se]
regler (forts.) • en icke-terminal återfinns i vänsterled (kallas också fras eller kategori) • en terminal finns aldrig i vänsterledet, och utgörs typiskt av ord/element i lexikon/alfabete. Pontus Johansson [ponjo@ida.liu.se]
exempel s -> np vp np -> det n vp -> v np det -> en n -> hund n -> bil v -> jagar ”en hund jagar en bil” Pontus Johansson [ponjo@ida.liu.se]
np vp icke-terminaler v np det n det n en hund jagar en bil terminaler trädrepresentation (’parse tree’) s -> np vp s np -> det n vp -> v np det -> en n -> hund n -> bil v -> jagar Pontus Johansson [ponjo@ida.liu.se]
cfg i prolog (1) s([en,hund,jagar,en,bil]) np([en,hund]) vp([jagar,en,bil]) append( [en,hund], [jagar,en,bil], [en,hund,jagar,en,bil] ) % append version append([],L,L). append([H|T],L2,[H|L3]) :- append(T,L2,L3). s(Z) :- np(X), vp(Y), append(X,Y,Z). np(Z) :- det(X), n(Y), append(X,Y,Z). vp(Z) :- v(X), np(Y), append(X,Y,Z). det([en]). n([hund]). n([bil]). v([jagar]). np([en,hund]) det([en]) n([hund]) append([en],[hund],[en,hund]) vp([jagar,en,bil]) v([jagar]) np([en,bil]) append([jagar],[en,bil],[jagar,en,bil]) Pontus Johansson [ponjo@ida.liu.se]
s np vp Rest List2 List1 cfg i prolog (2) % difference list version s(List1, Rest) :- np(List1, List2), vp(List2, Rest). np(List,Rest) :- det(List,List2), n(List2,Rest). vp(List,Rest) :- v(List,List2), np(List2,Rest). det([en|Rest],Rest). n([hund|Rest],Rest). v([jagar|Rest],Rest). n([bil|Rest],Rest). skillnaden mellan List1 och Rest är en s om: skillnaden mellan List1 och List2 är en np, och skillnaden mellan List2 och Rest är en vp. Pontus Johansson [ponjo@ida.liu.se]
körning… ?- s([en,bil,jagar,en,hund],[]). yes ?- s([en,bil,jagar,en,hund|[]],[]). yes ?- s([en,bil,jagar,en,hund,jättefort],[]). no ?- s([en,bil,jagar,en,hund,jättefort],Rest). Rest = [jättefort] ?- s([en,bil,jagar,en,hund,jättefort],[jättefort]). yes Pontus Johansson [ponjo@ida.liu.se]
s [en,hund] [jagar,en,bil] [jättefort] List2 List1 Pontus Johansson [ponjo@ida.liu.se]
cfg i prolog • dcg = definite clause grammar (nästa föreläsning!) • ”syntaktiskt socker för att dölja differenslistornas notation” Pontus Johansson [ponjo@ida.liu.se]
cfg i prolog (3) % append version append([],L,L). append([H|T],L2,[H|L3]) :- append(T,L2,L3). s(Z) :- np(X), vp(Y), append(X,Y,Z). np(Z) :- det(X), n(Y), append(X,Y,Z). vp(Z) :- v(X), np(Y), append(X,Y,Z). det([en]). n([hund]). n([bil]). v([jagar]). %difference list version s(List1, Rest) :- np(List1, List2), vp(List2, Rest). np(List,Rest) :- det(List,List2), n(List2,Rest). vp(List,Rest) :- v(List,List2), np(List2,Rest). det([en|Rest],Rest). n([hund|Rest],Rest). v([jagar|Rest],Rest). n([bil|Rest],Rest). % DCG (CFG) version s --> np,vp. np --> det,n. vp --> v,np. det --> [en]. n --> [hund]. v --> [jagar]. n --> [bil]. Pontus Johansson [ponjo@ida.liu.se]
mer cfg • hur utökar vi vårt språk? vp --> v, np, adv . adv --> [jättefort]. Pontus Johansson [ponjo@ida.liu.se]
körning… ?- s([en,bil,jagar,en,hund,Hur],[]). Hur = jättefort Pontus Johansson [ponjo@ida.liu.se]
körning… • språket blir dubbelt så stort! ?- s(X,[]). X = [en,bil,jagar,en,bil] ? ; X = [en,bil,jagar,en,hund] ? ; X = [en,bil,jagar,en,bil,jättefort] ? ; X = [en,bil,jagar,en,hund,jättefort] ? ; X = [en,hund,jagar,en,bil] ? ; X = [en,hund,jagar,en,hund] ? ; X = [en,hund,jagar,en,bil,jättefort] ? ; X = [en,hund,jagar,en,hund,jättefort] ? ; no Pontus Johansson [ponjo@ida.liu.se]
användning • parsning • testar om en sträng accepteras av grammatiken (dvs om den ”känns igen”) • egentligen ska parsern ge info om strukturen (t ex genom ett parseträd) också… ?- s([en,hund,jagar,en,bil],[]). yes • generering • låter grammatiken generera strängar (parsningens motsats) ?- s(Generated,[]). Generated = [en,hund,jagar,en,bil] Pontus Johansson [ponjo@ida.liu.se]
% satser s --> np, vp . % verbfraser vp --> v . vp --> v, np . vp --> vp, pp . % nominalfraser np --> namn . np --> pron . np --> n . np --> det, n . % prepositionsfraser pp --> prep, np . en grammatik till Pontus Johansson [ponjo@ida.liu.se]
en grammatik till (forts.) n --> [hund] . n --> [kastrull] . det --> [en] . v --> [kastar] . v --> [sover] . namn --> [pelle] . pron --> [han] . prep --> [på] . Pontus Johansson [ponjo@ida.liu.se]
några exempel en hund kastar en kastrull på pelle pelle sover han kastar en hund på en kastrull en hund sover pelle på han en kastrull kastar etc… Pontus Johansson [ponjo@ida.liu.se]
vp --> vp, pp. kan få prolog i oändlig loop vp(List,Rest) :- vp(List,List2), pp(List2,Rest). vänsterrekursion vp(List,… vp(List,… vp(List,… vp(List,… etc… Pontus Johansson [ponjo@ida.liu.se]
vp --> v . vp --> v, np . vp --> vp, pp . vad innebär detta? ”efter varje vp kan en pp följa” vänsterrekursion (forts.) vp --> v, somePP . % skriv om med ”somePP” vp --> v, np, somePP . % skriv om med ”somePP” somePP --> [] . somePP --> pp . Pontus Johansson [ponjo@ida.liu.se]
vänsterrekursion (forts.) • obs! vänsterrekursion är ett prolog-problem (alltså inte ett lingvistiskt problem) • deklarativt är det ok • procedurellt är det inte ok • alla vänsterrekursiva grammatiker kan skrivas om till icke-vänsterrekursiva grammatiker Pontus Johansson [ponjo@ida.liu.se]
n --> [dog] . n --> n1, [t2], n3, [t4] . n([dog|Rest],Rest) . n(List1, Rest) :- n1(List1, [t2|List3]), n3(List3, [t4|Rest]). mixa terminaler och icke-terminaler Pontus Johansson [ponjo@ida.liu.se]
nästa föreläsning • mer om dcg • argument • prologanrop från dcg • och lite till • litteratur • 21.2 • G 2.3 • M 8.1.2 • (BBS 8) Pontus Johansson [ponjo@ida.liu.se]