Fabio Massimo Zanzotto (slides di Andrea Turbati con aggiunte)

Slides:



Advertisements
Presentazioni simili
PROGRAMMARE IN PASCAL (le basi)
Advertisements

Sommario Nelle lezioni precedenti abbiamo introdotto tutti gli elementi che formano un particolare tipo di linguaggio logico, denominato linguaggio predicativo.
Sintassi (prima parte)
Algebra parziale con predicati
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
Sequential Function Chart (SFC)
Alberi binari di ricerca
Sistemi computazionali per il linguaggio naturale
Semantica approcci computazionali
FMZ, Giugno 2001 Parsing del linguaggio naturale Fabio Massimo Zanzotto Università di Tor Vergata.
Maria Teresa PAZIENZA a.a
Intelligenza Artificiale 1 Gestione della conoscenza lezione 8
Sistemi basati su conoscenza Comunicazione basata sul linguaggio naturale Prof. M.T. PAZIENZA a.a
Sistemi basati su conoscenza Conoscenza e ragionamento Prof. M.T. PAZIENZA a.a
Algoritmi e strutture Dati - Lezione 7
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Soluzione FEM di problemi parabolici
Algoritmi e Strutture Dati
Tema 1: Integrazione di dati provenienti da sorgenti eterogenee
Semantica Operazionale Strutturata
Qualche esempio di tableaux
Semantica per formule di un linguaggio proposizionale p.9 della dispensa.
Unità Didattica 2 I Linguaggi di Programmazione
Programmazione logica
Lezione 2 Programmare in ASP
LINGUAGGI DI PROGRAMMAZIONE
AN FI Concetti. Linguaggi di alto livello u Hanno capacita' espressive superiori a quelle del linguaggio macchina u Suggeriscono concetti e modi.
4 Tipi di dati & variabili
ANTLR V.3 Renzi Alberto.
Linguaggi e Modelli Computazionali LS - Prof E.Denti
Esecuzione dei programmi Prolog Liste ed operatori aritmetici
Il primo passo: I basilari del Prolog
Recuperare tutte le risposte Gestione di input-output Fabio Massimo Zanzotto (slides di Andrea Turbati)
Strategie per il problem solving
Grammatiche, Linguaggio e Automi R. Basili TAL - a.a
Linguaggi e Modelli per i Dati e la Conoscenza Fabio Massimo Zanzotto.
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Linguaggi e modelli computazionali LS Manni Tiziano
Definire operatori Strutture dati Fabio Massimo Zanzotto (slides di Andrea Turbati)
ELETTRONICA GEORGE BOOLE FUNZIONI LOGICHE Lezione N° 1
Linguaggi e Modelli di Programmazione Fabio Massimo Zanzotto.
Sistemi basati su conoscenza Comunicazione basata sul linguaggio naturale (grammatica, semantica) Prof. M.T. PAZIENZA a.a
Lezione 3 Struttura lessicale del linguaggio
Sistemi basati su conoscenza Linguaggio naturale: grammatiche Prof. M.T. PAZIENZA a.a
Ordinamento e Operazioni su Strutture Dati Fabio Massimo Zanzotto.
Recuperare tutte le risposte Gestione di input-output Fabio Massimo Zanzotto (slides di Andrea Turbati)
Percorsi su grafi, Sottoalberi Comuni e Programmazione Dinamica Fabio Massimo Zanzotto.
Cenni di Logica Fabio Massimo Zanzotto. Calcolo proposizionale.
Controllare Tipi Dati Decomporre fatti Controllare il database Fabio Massimo Zanzotto (slides di Andrea Turbati)
Elaborazione del linguaggio naturale CFG: esercizi Maria Teresa PAZIENZA a.a
Intelligenza Artificiale 1 Gestione della conoscenza lezione 19 Prof. M.T. PAZIENZA a.a
Introduzione a Javascript
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Filosofia analitica del linguaggio: mod. ontologia esistenza e identità Francesco Orilia A.A I Semestre.
Il Linguaggio SQL. Le interrogazioni in SQL (continua…) La parte di SQL dedicata alla formulazione di interrogazioni fa parte del DML. SQL esprime le.
IV D Mercurio DB Lezione 2
1 Università degli Studi di Pisa Facoltà di Scienze Matematiche Fisiche e Naturali Corso di Laurea in Informaticaa Corso di Intelligenza Artificiale: Trattamento.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
Intelligenza Artificiale 2 Metodologie di ragionamento Prof. M.T. PAZIENZA a.a
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Intelligenza Artificiale Metodologie di ragionamento Prof. M.T. PAZIENZA a.a
I SOSTANTIVI.
Università degli studi di Modena e Reggio Emilia Facoltà di Scienze Fisiche, Informatiche e Matematiche Corso di Laurea in Informatica Progettazione e.
Comprensione frasale: Modelli interattivi e constraints-based
Corso di “Teorie e pratiche della traduzione” “La scrittura accademica attraverso le lingue e le culture: studio su corpus della voce autoriale” Dott.ssa.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Fate Adesso : Al ristorante. Cosa fai quando vai al ristorante? Meti in ordine logico le seguenti frasi. __ Chiedi il conto. __ Dici: > __ Lasci la mancia.
Transcript della presentazione:

Fabio Massimo Zanzotto (slides di Andrea Turbati con aggiunte) Grammatiche in Prolog Fabio Massimo Zanzotto (slides di Andrea Turbati con aggiunte)

Grammatica Prolog è in grado di interpretare direttamente una grammatica scritta in DCG (definite cluase grammar) La traduzione da una grammatica scritta in BNF (Backus-Naur Form) in DCG è praticamente immediata (è un semplice esercizio di riscrittura)

Esempio BNF -> DCG BNF: <s> ::= a b <s> ::= a <s> b DCG s --> [a], [b] . s --> [a], s, [b] .

Come Prolog interpreta la grammatica Prolog converte internamente una grammatica scritta in DCG in regole prolog Esempio: move --> step. move --> step, move. step --> [up] . step --> [down] .

Come Prolog interpreta la grammatica move(List, Rest) :- step(List, Rest). move(List1, Rest), step(List1, List2), move(List2, Rest). step([up|Rest], Rest). step([down|Rest], Rest).

esempio ?- s([a,a,b,b], []). ?-s([a,a,b],[]). ?-move([up,up,down],[]). true ?-s([a,a,b],[]). no ?-move([up,up,down],[]). yes ?-move([up,X,down],[]). X=up; X=down; ?- s([a,a,b,b,c,d,e], [c,d,e]).

Grammar for Natural Language 1 sentence --> noun_phrase, verb_phrase. verb_phrase --> verb, noun_phrase. noun_phrase --> determiner, noun. determiner --> [a]. determiner --> [the]. noun --> [cat]. noun --> [mouse]. verb --> [scares]. verb --> [hates].

Grammar for Natural Language 1 Questa grammatica riconosce le frasi: [the, cat, scares, the, mouse]. [the, mouse, hates, a, cat] Inoltre è in grado di generare le frasi o parti di esse: ?-sentence([the, cat, X, the, mouse],[]). X = scares; X = hates; false

Grammar for Natural Language 2 Aggiungiamo i plurali alla nostra grammatica noun --> [cats]. noun --> [mice]. verb --> [scare]. verb --> [hate].

Grammar for Natural Language 2 Ora possiamo riconoscere anche: [the, mice, hate, the, cat]. Ma purtroppo anche la seguente frase viene accettata: [the, mice, hates, the, cat]. Non abbiamo inserito in alcun modo l’informazione del fatto che se il soggetto è singolare anche il verbo lo deve essere

Singolare/plurale Si potrebbe rimediare dividendo le regole in singolari e plurali, ma questo produrrebbe troppe regole (almeno il doppio) La soluzione migliore è quella di inserire un parametro aggiuntivo nelle regole che indica il numero (singolare o plurale) per avere la dipendenza dal contesto

Grammar for Natural Language 3 sentence(Number) --> noun_phrase(Number), verb_phrase(Number). verb_phrase(Number) --> verb(Number), noun_phrase(_). noun_phrase(Number) --> determiner(Number), noun(Number). determiner(singular) --> [a]. determiner(_) --> [the]. noun(singular) --> [cat]. noun(singular) --> [mouse]. noun(plural) --> [cats]. noun(plural) --> [mice]. verb(singular) --> [scares]. verb(singular) --> [hates]. verb(plural) --> [scare]. verb(plural) --> [hate].

Come Prolog interpreta la grammatica sentence(Number) --> noun_phrase(Number), verb_phrase(Number). Diventa sentence(Number, List1, Rest):- noun_phrase(Number, List1, List2), verb_phare(Number, List2, Rest).

Grammar for Natural Language 3 ?- sentence(plural, [the, mice, hate, the, cat],[]). true sentence(plular, [the, mice, hates, the, cat],[]). false sentence(X, [the, mouse, hates, the, cat],[]). X = singular sentence(singular, [the, What, hates, the, cat],[]). What = cat; What = mouse;

Esercizi Scrivere un programma che, sfruttando la grammatica 3, prende in ingresso una frase (NON una lista) e restiuisca true o false se tale frase rispetta la grammatica o meno Il programma appena realizzato deve funzionare anche se nella frase ci sono variabili Prolog ( parole che hanno l’iniziale maiuscola ). In questo caso deve restituire il valore che tali variabili assumono affinché la grammatica sia rispettata, se possibile

Semantica/Significato

Grammatica Nella lezione scorsa abbiamo visto come usare le DCG (definite clause grammar) in Prolog Abbiamo anche aggiunto un parametro alle regole della grammatica per avere l’agreement singolare/plurale Ora vedremo come generare gli alberi sintattici e come associare il significato a ciò che analizziamo

Come rappresentare un albero noun_phrase determiner noun the cat noun_phrase(determiner(the), noun(cat)) root(figli_separati_da_virgola)

Grammatica con alberi sintattici Dobbiamo modificare la grammatica per poter avere gli alberi sintattici o parse tree Es: sentence(Number) --> noun_phrase(Number), verb_phrase(Number). diventa sentence(Number, sentence(NP, VP)) --> noun_phrase(Number, NP), verb_phrase(Number, VP).

Grammatica con alberi sintattici determiner(singular, determiner(a)) --> [a]. determiner(_,determiner(the)) --> [the]. noun(singular, noun(cat)) --> [cat]. noun(singular, noun(mouse)) --> [mouse]. noun(plural, noun(cats)) --> [cats]. noun(plural, noun(mice)) --> [mice]. verb(singular, verb(scares)) --> [scares]. verb(singular, verb(hates)) --> [hates]. verb(plural, verb(scare)) --> [scare]. verb(plural, verb(hate)) --> [hate]. sentence(Number, sentence(NP, VP)) --> noun_phrase(Number, NP), verb_phrase(Number, VP). verb_phrase(Number, verb_phrase(Verb, NP)) --> verb(Number, Verb), noun_phrase(_, NP). noun_phrase(Number, noun_phrase(Det, Noun)) --> determiner(Number, Det), noun(Number, Noun).

Grammatica con alberi sintattici ?- sentence(singular, Tree, [a, cat, scares, the, mice ], []). Tree = sentence(noun_phrase(determiner(a), noun(cat)), verb_phrase(verb(scares), noun_phrase(determiner(the), noun(mice)))) ?- sentence(singular, Tree, [a, X, scares, the, mice ], []). X=cat

Grammatica con alberi sintattici ?- sentence(Number, sentence(noun_phrase(determiner(a), noun(cat)), verb_phrase(verb(scares), noun_phrase(determiner(the), noun(mice)))), X, []). Number = singular, X = [a, cat, scares, the, mice]

Significato Per avere il significato di una frase o lista di comandi esistono due metodi: Ottenere l’albero sintattico o parse tree della frase e poi parsare tale albero per ottenere il significato Parsare direttamente la frase di partenza per avere il significato, senza passare per l’albero sintattico o parse tree

Usando il parse tree move(move(Step)) --> step(Step). move(move(Step, Move)) --> step(Step), move(Move). step(step(up)) --> [up]. step(step(down)) --> [down]. meaning(move(Step, Move), Dist):- meaning(Step, D1), meaning(Move, D2), Dist is D1 + D2. meaning(step(Step), Dist):- meaning(Step, Dist). meaning(step(up), 1). meaning(step(down), -1).

Usando il parse tree ?- move(Tree, [up,up,down, up, up], []), meaning(Tree, Dist). Tree = move(step(up), move(step(up), move(step(down), move(step(up), move(step(up)))))), Dist = 3 ?- move(Tree, [up,up,down, up, X], []), meaning(Tree, 1). Tree = move(step(up), move(step(up), move(step(down), move(step(up), move(step(down)))))), X = down

Usando il parse tree ?- move(Tree, [up, up, X, Y, up], []), meaning(Tree, 3). Tree = move(step(up), move(step(up), move(step(up), move(step(down), move(step(up)))))), X = up, Y = down Tree = move(step(up), move(step(up), move(step(down), move(step(up), move(step(up)))))), X = down, Y = up

Non usando il parse tree move2(D) --> step2(D). move2(D) --> step2(D1), move2(D2), {D is D1 + D2}. step2(1) --> [up]. step2(-1) --> [down].

Non usando il parse tree move2(Dist, [up, up,down, up, up],[]). Dist = 3 move2(3, [up, up,X, Y, up],[]). X = up, Y = down; X = down, Y = up;

Significato del linguaggio naturale Data una frase cosa si intende con il suo “significato”? Una volta estratto tale significato, cosa possiamo farci? Come possiamo rappresentarlo?

Significato del linguaggio naturale In Prolog il significato possiamo esprimerlo con i termini. paints(john). Può voler dire che John dipinge likes(john, mary). Può voler indicare che a John piace Mary

Significato del linguaggio naturale Adottiamo lo stesso approccio del non usare il parse tree (che in questo caso sarebbe l’albero sintattico) Quindi associamo il significato direttamente nella grammatica

Significato del linguaggio naturale sentence2(VP) --> noun_phrase2(Actor), verb_phrase2(Actor, VP). noun_phrase2(Name) --> properName(Name). verb_phrase2(Actor, VP) --> intrans_verb(Actor, VP). verb_phrase2(Somebody, VP) --> trans_verb(Somebody, Something, VP), noun_phrase2(Something).

properName(john) --> [john]. properName(mary) --> [mary] properName(john) --> [john]. properName(mary) --> [mary]. intrans_verb(Actor, paints(Actor)) --> [paints]. trans_verb(Somebody, Something, likes(Somebody, Something)) --> [likes].

Significato del linguaggio naturale ?- sentence2(Meaning, [john, paints], []). Meaning = paints(john) ?- sentence2(Meaning, [john, likes, mary], []). Meaning = likes(john, mary) sentence2(paints(john), [Who, paints], []). Who = john sentence2(likes(mary, john), [X, likes, Y], []). X = mary, Y = john.

Esercizio Modificare la grammatica precedente per avere il significato a partire dall’albero sintattico della frase. Quindi una query dovrà restituire oltre al significato anche l’albero sintattico

Significato di “a” “a man paints” significa “esiste almeno un uomo che dipinge” a ha il significato di esiste in First Order Logic There exists an X such that X is a man and X paints exists( X, man(X) and paints(X))

Significato di “a” exists(X, Property and Assertion) determiner(X, Prop, Assn, exists(X, Prop and Assn)) --> [a].

Significato di “every” “every woman dances” significa che tutte le donne danzano Every ha il significato di per ogni in First Order Logic For all X if X is a woman then X dances all(X, woman(X) => dances(X) )

Significato di “every” all(X, Property => Assertion) determiner(X, Prop, Assn, all(X, Prop=>Assn)) --> [every].

Esempio di “a” e “every” :- op( 100, xfy, and). :- op( 150, xfy, =>). sentence( S)  noun_phrase( X, Assn, S), verb_phrase( X, Assn). noun_phrase( X, Assn, S) --> determiner( X, Prop, Assn, S), noun( X, Prop). verb_phrase( X, Assn) --> intrans_verb( X, Assn). determiner( X, Prop, Assn, all( X, Prop => Assn)) --> [every]. determiner( X, Prop, Assn, exists( X, Prop and Assn)) --> [a]. noun( X, man(X)) --> [man]. noun( X, woman(X)) --> [woman]. intrans_verb( X, paints(X)) --> [paints].

Esempio di “a” e “every” ?- sentence(S, [a, man, paints], []). S = exists(_G530, man(_G530)and paints(_G530)) ?- sentence(S, [every, woman, paints], []). S = all(_G1188, woman(_G1188)=>paints(_G1188)

Relative clauses “Every man that paints admires Monet” significa che tutti gli uomini che dipingono ammirano Monet, cioè che se uno è un uomo e dipinge allora ammira Monet For all X, if X is a man and paints then X admires Monet

Relative clauses all(X, man(X) and paints(X) => admires(X, Monet) ). all(X, Prop1 and Prop2 => Assn). rel_clause( X, Prop1, Prop1 and Prop2) --> [that], verb_phrase( X, Prop2). noun_phrase( X, Assn, S) --> determiner( X, Prop12, Assn, S), noun( X, Prop1), rel_clause( X, Prop1, Prop12).

Esempi conclusivi ?- sentence( M, [john,paints],[]). M = paints(john) ?- sentence( M, [a, man, paints], []). M = exists(_G526, man(_G526)and paints(_G526)) ?- sentence( M, [every,man,that,paints,admires,monet],[]). M = all(_G895, man(_G895)and paints(_G895)=>admires(_G895, monet)) ?- sentence( M, [annie,admires,every,man,that,paints],[]). M = all(_G306, man(_G306)and paints(_G306)=>admires(annie, _G306)) ?- sentence( M, [every,woman,that,admires,a,man,that,paints,likes,monet],[]). all(_G1215, woman(_G1215)and exists(_G1227, (man(_G1227)and paints(_G1227))and admires(_G1215, _G1227))=>likes(_G1215, monet))

Esercizio Modificare la grammatica precedente affinchè venga memorizzato in prolog il significato della frase appena parsata in modo che sia possibile poi effettuare delle query fruttando la conoscenza appena aggiunta. Eventualmente gestire l’input non tramite liste, ma tramite frasi (non [a, man, paints], ma “a man paints”)