200 likes | 301 Vues
Explore deep natural language processing (NLP) using Defined Clause Grammars (DCGs) from Jacques Robin's approach with LIFE. Learn how to convert grammar rules into logical clauses in Prolog, enabling efficient sentence parsing and generation.
E N D
Gramáticas de Cláusulas Definidas Jacques Robin CIn-UFPE
Porque LIFE para Processamento de Linguagem Natural (PLN)? • Como linguagem de programação em lógica, inclui built-in: • Gramáticas de Cláusulas Definidas (DCGs) • um Formalismo de Representação do Conhecimento (FRC) lingüístico para PLN • A maioria dos sistemas de PLN profundo modernos: • usam como estrutura de dados termos de traços tipados • muito semelhantes aos termos LIFE • Sistemas de PLN requer conhecimento: • muito heterogêneo porém altamente interdependente, como • morfo-sintaxe da língua, semântica do domínio, estrutura do discurso, objetivos dos agentes comunicativos, etc. • que só pode ser adequadamente codificado • por um FRC flexível, integrando vários paradigmas
DCGs: Gramáticas de Cláusulas Definidas • Pré-processador built-in da programação em lógica: • convertendo regras de gramáticas em cláusulas lógicas, e assim • re-aproveitando o provador de teorema da programação em lógica para implementar “de graça” parser ou gerador de frases • Usa diferença de listas como estrutura de dados: • frase da linguagem cuja gramática é representada pela DCG - lista de palavras ainda a ser processadas = listas de palavras já processadas • Cada regra DCG: • associada a uma categoria sintática genérica cat • instancia 2 argumentos adicionais implícitos: 1. lista de palavras do constituinte const da frase de catégoria cat 2. lista de palavras do resto da frase na direita de const
Regras de gramáticas: sn --> det, subs. Entradas do dicionário: det --> [o]. det--> [a]. det --> [os]. det --> [as]. subs --> [menino]. subs --> [meninos]. subs --> [menina]. subs --> [meninas]. Conversão para cláusulas Prolog: sn(Csn,Rsn) :- det(Csn,Rdet), subs(Rdet,Rsn). det([o|Rdet], Rdet). det([a|Rdet], Rdet). det([os|Rdet], Rdet). det([as|Rdet], Rdet). subs([menino|Rsubs], Rsubs). subs([meninos|Rsubs], Rsubs). subs([menina|Rsubs], Rsubs). subs([meninas|Rsubs], Rsubs). Exemplo mínimo de Prolog DCG: conversão regra DCG / cláusula Prolog
sn(Csn,Rsn) :- det(Csn,Rdet), subs(Rdet,Rsn). det([o|Rdet], Rdet). det([a|Rdet], Rdet). det([os|Rdet], Rdet). det([as|Rdet], Rdet). subs([menino|Rsubs], Rsubs). subs([meninos|Rsubs], Rsubs). subs([menina|Rsubs], Rsubs). subs([meninas|Rsubs], Rsubs). ?- sn([o,menino],[]). call sn([o,menino],[]). call det([o,menino],Rdet). exit det([o,menino],[menino]). call subs([menino], []). exit subs([menino], []). exit sn([o,menino],[]). yes ?- subs([menino],[]). yes ?- det([o, menino],[menino]). yes ?- sn([minha, menina],[]). no ?- sn([o,meninas],[]). yes Exemplo mínimo de Prolog DGC: execução
Regras de gramáticas: sn(G,N) --> det(G,N), subs(G,N). Entradas do dicionário: det(masc,sing) --> [o]. det(fem,sing) --> [a]. det(masc,plur) --> [os]. det(fem,plur) --> [as]. subs(masc,sing) --> [menino]. sub(masc,plur) --> [meninos]. subs(fem,sing) --> [menina]. subs(fem,plur) --> [meninas]. Conversão para cláusulas Prolog: sn(G,N,Csn,Rsn) :- det(G,N, Csn,Rdet), subs(G,N, Rdet,Rsn). det(masc,sing,[o|Rdet], Rdet). det(fem,sing,([a|Rdet], Rdet). det(masc,plur,[os|Rdet], Rdet). det(fem,plur,[as|Rdet], Rdet). subs(masc,sing,[menino|Rsubs], Rsubs). subs(masc,plur,[meninos|Rsubs], Rsubs). subs(fem,sing,[menina|Rsubs], Rsubs). subs(fem,plur,[meninas|Rsubs], Rsubs). Regras com argumentos de concordância
Regras genéricas com restrições • Regras de sintaxe: const(sn,G,N) --> const(det,G,N), const(subs,G,N). • Dicionário: const(subs,menino,masc,sing). const(det,o,masc,sing). • Regras de morfologia: const(Cat,LexMS,masc,sing) --> [LexMS], {member(Cat,[subs,adj,det])}. const(Cat,LexMS,masc,plur) --> [LexMP], {member(Cat,[subs,adj,det]), plur(LexMP,LexMS)}. const(Cat,LexMS,fem,sing) --> [LexFS], {member(Cat,[subs,adj,det]), fem(LexFS,LexMS)}. const(Cat,LexMS,fem,plur) --> [LexFP], {member(Cat,[subs,adj,det]), plur(LexFP,LexFS), fem(LexFS,LexSM). • Predicados de restrições: plur(LexMP,LexMS) :- concatom(LexMS,s,LexMP). fem(LexFS,LexMS) :- concatom(LexRad,a,LexFS), concatom(LexRad,o,LexMS). concatom(A,B,AB) :- name(A,Sa), list(La,Sa), name(B,Sb), list(Lb,Sb), append(La,Lb,Lab), list(Lab,Sab), name(AB,Sab).
Argumentos para mapeamento frase, estrutura sintática, conteúdo semântico sn(sn(Det,Subs),G,N) --> det(Det,G,N), subs(Subs,G,N). det(det(o),masc,sing) --> const(det,o,masc,sing). subs(subs(menino),masc,sing). --> const(subs,livro,masc,sing). const(Cat,LexMS,masc,sing) --> [LexMS], {member(Cat,[subs,adj,det])}. const(Cat,LexMS,masc,plur) --> [LexMP], {member(Cat,[subs,adj,det]), plur(LexMP,LexMS)}. const(Cat,LexMS,fem,sing) --> [LexFS], {member(Cat,[subs,adj,det]), fem(LexSF,LexMS)}. const(Cat,LexMS,fem,plur) --> [LexFP], {member(Cat,[subs,adj,det]), plur(LexFP,LexFS), fem(LexFS,LexSM).
DCG: interpretador ou gerador de frases ?- sn(ParseTree,G,N,[o,menino],[]). ParseTree = sn(det(o),subs(menino)), G = masc, N = sing. yes ?- sn(sn(det(o),subs(menino)),G,N,WordList,[]). WordList = [o, menino], G = masc, N = plur. yes ?- sn(sn(det(o),subs(menino)),_,_,[o,menino],[]). yes
Ferramenta poderosa para simplificar o desenvolvimento de grandes programas São usados como difference lists. Exemplo de uso não lingüístico: > import(“accumulators”)? > acc_info(myacc, X, In, Out, acc_pred=>(Out=[X|In]))? > pred_info(loop, myacc)? > loop(0) :-- !? > loop(N) :-- N + myacc, loop(N-1)? > main(N, L) :- loop(N) with myacc([], L)? Programa é traduzido para: loop(0, in_myacc=>A, out_myacc=>A) :- !, succeed. loop(N, in_myacc=>B, out_myacc=>C) :- D=[N|B], loop(N-1, in_myacc=>D, out_myacc=>C). main(N, L) :- loop(N, in_myacc=>[], out_myacc=>L). Execução: > main(9,L)? L = [1,2,3,4,5,6,7,8,9]. Acumuladores em LIFE
LIFE DCGs • Sintaxe: const(...,X:, ...,Y:, ...) --> subconst1(...,X,...) , ... , subconstM(...,Y,...) {pred1(...,X,...,Y,...), ..., predN(...,X,...,Y,...)} • Expansão em LIFE const(...,X:, ...,Y:, ..., in_dcg=>_A, out_dcg=>_Z) :- subconst1(...,X,..., in_dcg=>_A, out_dcg=>_B), ... , subconst25(...,Y,..., in_dcg=>_Y, out_dcg=>_Z), pred1(...,X,...,Y,...), ..., predN(...,X,...,Y,...)
Extended Definite Clause Grammar sn --> det(@(agreeFt=>Agf)), sub(@(agreeFt=>Agf))? det(@(syntcat=>defArt, agreeFt=>@(gen=>fem, num=>sing)) --> [“a”]? sub(@(syntcat=>comNoun, agreeFt=>@(gen==>fem, num=>sing)) --> [“pera”]? Tradução em LIFE: det(@(syntcat => defArt, agreeFt => @(gen => fem, num => sing)), in_dcg => ["a"|_A], out_dcg => _A) :- succeed. sub(@(syntcat => comNoun, agreeFt => @(gen => fem, num => sing)), in_dcg => ["pera"|_A], out_dcg => _A) :- succeed. Gramáticas EDCG
Análise Morfológica em LIFEVerbos (3a. Pessoa do Sing) const (syntr(syntcat => main, agreeFt => @(num=>sing, pers=>3), conjug => @(tense => present), lex => Lex), semr(semcat=>Semcat)) --> [PVerb], {rverb(lex=>Lex, semcat=>Semcat), PVerb=strcon(Lex,"s")}? rverb(lex=>"smell", semcat=>percep) --> ["smell"]? rverb(lex=>"walk", semcat=>action) --> ["walk"]?
Análise Sintática de Superfície em LIFE % “I see a glitter at 1 2” const (syntr(syntcat => clause, conjug => Conjug:@(mood=>declar, voice=>active), syntRoles => @(pred => Pred, args => @(subj => Subj, dobj => DObj)) mods => @(frtAd1 => FAd1, endAd1 => EAd1)))) --> const(FAd1:syntr(syntcat=>pp, optional=>yes)), const(Subj:syntr(syntcat=>nominal, funct=>subj, optional=>no, agreeFt=>Sva)), const(Pred:syntr(syntcat=>vg, optional=> no, conjug=>Conjug, agreeFt=>Sva), semr(semcat=>percep)), const(DObj:syntr(syntcat=>nominal, funct=>dobj, optional=>no)) const(EAd1:syntr(syntcat=>pp, optional=>yes))?
Análise Sintática de Superfície em LIFE nominal := {np; pronoun}. pronoun := {perPron; indPron; demPron}. const (syntr(syntcat => np, det => Det, agreeFt => @(pers => 3, num => Num), head => Noun, preMod => PMod)) --> const(Det:syntr(syntcat=>determ, optional=>no, num=>Num)), const(PMod:syntr(syntcat=>ap, optional=>yes)), const(Noun:syntr(syntcat=>noun, optional=>no, num=>Num))? const (syntr(syntcat=>perPron, func=>subj, agreeFt=> @(pers => 1, num => sing))) --> ["I"]?
Análise Sintática de Superfície em LIFE const (syntr(syntcat => vg, conjug => Conjug, agreeFt=>Agree, head => Main), semr(semcat=>Sem)) --> const(Main:syntr(syntcat=>verb, agreeFt=>Agree conjug=>Conjug), semr(semcat=>Sem))? determ := {article}. const (syntr(syntcat=>article, lex=>"a", ref=>indef, num=>sing)) --> ["a"]? const (syntr(optional=>yes)) --> []?
Análise Sintática Profunda em LIFE % “I see the gold” const (syntr(conjug => @(mood => declar, voice => active), semr(themRoles => @(situation => Pred, partic => @(agent => Subj, percept => DObj) --> const(Subj:syntr(syntcat=>nominal, funct=>subj, optional=>no, agreeFt=>Sva)), const(Pred:syntr(syntcat=>vg, optional=> no, conjug=>Conjug, agreeFt=>Sva), semr(semcat=>percep)), const(DObj:syntr(syntcat=>nominal, funct=>dobj, optional=>no))
Análise Sintática Profunda em LIFE % “the gold is seen by me” const (syntr(conjug => @(mood => declar, voice => active) semr(themRoles => @(situation => Pred, partic => @(agent => Comp, percept => Subj)))) --> const(Subj:syntr(syntcat=>nominal, funct=>subj, optional=>no, agreeFt=>Sva)), const(Pred:syntr(syntcat=>vg, optional=>no, conjug=> Conjug, agreeFt=>Sva), semr(semcat=>percep)), const(Comp:syntr(syntcat=>pp, optional=>no))?
Frases interrogativas % “do you smell a stench?” const (syntr(syntcat => clause, conjug => Conjug:@(mood=>inter, voice=>active), syntRoles => @(pred => Pred, args => @(subj => Subj, dobj => DObj))), semr(themRoles => @(situation => Pred, partic => @(agent=>Subj,percept => DObj)))) --> const(QAux:syntr(syntcat=>auxiliar)), const(Subj:syntr(syntcat=>nominal, agreeFt=>Sva)), const(Pred:syntr(syntcat=>vg, conjug=>Conjug, agreeFt=>Sva, aux => QAux) semr(semcat=>percep)), const(DObj:syntr(syntcat=>nominal))?
Frases imperativas % “shoot the wumpus” const (syntr(syntcat => clause, conjug => Conjug:@(mood=>imper, voice=>active), syntRoles => @(pred => Pred, args => @(subj => Ocult:@(syntr(syntcat=>nominal, agreeFt=> Sva:@(num=>sing, pers=>2)) obj => Obj))), semr(themRoles => @(situation => Pred, partic => @(agent => Ocult, comp => Comp)))) --> const(Pred:syntr(syntcat=>vg, conjug=>Conjug, agreeFt=>Sva) const(Obj:syntr(syntcat=>{pp;adv;nominal}))?