DEPARTAMENTO DE INFORMÁTICA Faculdade de Ciências - Universidade de Lisboa Bloco C5 - Piso 1 - Campo Grande, 1700 Lisboa Tel & Fax: 351.1.7500084 RELATÓRIO DE ESTÁGIO realizado no âmbito do projecto INQUER – Interacção Pessoa-Máquina em Linguagem Natural MÓDULO I – Análise Sintáctico - Semântica CLG – Grupo de Computação do Conhecimento Léxico-Gramatical CENTRO DE LINGUÍSTICA DA UNIVERSIDADE DE LISBOA Catarina Santiago Ribeiro Lisboa, Março de 2003 Universidade de Lisboa Faculdade de Ciências DEPARTAMENTO DE INFORMÁTICA Faculdade de Ciências - Universidade de Lisboa Bloco C5 - Piso 1 - Campo Grande, 1700 Lisboa Tel & Fax: 351.1.7500084 RELATÓRIO DE ESTÁGIO realizado no âmbito do projecto INQUER – Interacção Pessoa-Máquina em Linguagem Natural MÓDULO I – Análise Sintáctico - Semântica CLG – Grupo de Computação do Conhecimento Léxico-Gramatical CENTRO DE LINGUÍSTICA DA UNIVERSIDADE DE LISBOA Catarina Santiago Ribeiro Responsável pela FCUL: Prof. Doutor António Branco Responsável pelo CLUL: Prof.ª Doutora Palmira Marrafa Lisboa, Março de 2003 Resumo O interesse em sistemas de pergunta-resposta tem vindo a aumentar nos últimos anos com a expansão de novas tecnologias na área das bases de dados e da Internet. O aumento da informação disponível torna necessário o desenvolvimento de sistemas que permitam uma interacção com o utilizador de forma mais natural e eficaz. Nos últimos anos, a necessidade de desenvolver sistemas de pergunta-resposta tem vindo a crescer à medida que cresce o interesse por parte de investigadores, empresas e utilizadores. Estes sistemas, ao contrário do que o que acontece nos sistemas de extracção de informação convencionais, permitem a inserção de perguntas em língua natural e devolvem respostas também em língua natural em vez de apresentarem listas de documentos. Na sua forma mais simples, que é lidar com interrogativas totais polares, estes sistemas têm de ser capazes de determinar o valor de verdade da proposição que está em causa. Um sistema de pergunta-resposta capaz de lidar com qualquer tipo de estrutura interrogativa (descrito numa dada gramática computacional) em qualquer contexto (fornecido por uma dada base de dados) tem de compreender a pergunta de uma forma não trivial. O projecto INQUER tem como objectivo o desenvolvimento de um sistema deste genéro que permita a extracção de informação contida na WordNet.PT. O desenvolvimento deste sistema foi dividido em módulos, respeitando este relatório ao Módulo I – Análise Sintáctico – Semântica. Índice Índice 1. INTRODUÇÃO ..............................................................................................................................11 1.1 INSTITUIÇÃO DE ACOLHIMENTO .....................................................................................11 1.2 INTERACÇÃO PESSOA-MÁQUINA EM LINGUAGEM NATURAL – INQUER.................16 1.3 ESTRUTURA DO RELATÓRIO FINAL DE ESTÁGIO.........................................................17 2. OBJECTIVOS DO ESTÁGIO E CONTEXTO DO TRABALHO ................................................19 2.1 OBJECTIVOS DO ESTÁGIO.................................................................................................19 2.2 CONTEXTO DO TRABALHO...............................................................................................19 3. METODOLOGIA E CALENDARIZAÇÃO DO TRABALHO.....................................................23 3.1 METODOLOGIA ...................................................................................................................23 3.2 CALENDARIZAÇÃO DO TRABALHO ................................................................................23 4. ESTUDO SOBRE A WORDNET.PT .............................................................................................29 5. MÉTODO DE PROCESSAMENTO DAS PERGUNTAS .............................................................31 6. LINGUAGEM DE PROGRAMAÇÃO ..........................................................................................33 7. ESCOLHA DO PARSER................................................................................................................35 7.1 ESTRATÉGIAS DE ANÁLISE...............................................................................................35 7.2 PARSER ESCOLHIDO...........................................................................................................36 8. FORMALISMOS SINTÁCTICO E SEMÂNTICO .......................................................................39 8.1 FORMALISMO SINTÁCTICO ..............................................................................................39 8.2 FORMALISMO SEMÂNTICO...............................................................................................41 9. TIPOS DE PERGUNTAS...............................................................................................................47 9.1 QUESTIONÁRIO ...................................................................................................................47 9.2 RESULTADOS OBTIDOS .....................................................................................................47 9.3 TRATAMENTO DOS RESULTADOS ...................................................................................48 10. BASE DE DADOS LEXICAL ......................................................................................................51 10.1 EXPRESSÕES NOMINAIS SIMPLES .................................................................................52 10.3 EXPRESSÕES NOMINAIS QUE SELECCIONAM COMPLEMENTO................................54 10.2 EXPRESSÕES VERBAIS.....................................................................................................55 10.4 OUTRAS EXPRESSÕES......................................................................................................55 11. A GRAMÁTICA ...........................................................................................................................57 11.1 META-ENTRADAS LEXICAIS...........................................................................................58 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 7 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 11.2 REGRAS LEXICAIS ............................................................................................................72 11.3 REGRAS SINTAGMÁTICAS ..............................................................................................73 12. ALGORITMO DE CONVERSÃO ...............................................................................................93 13. CONCLUSÕES E TRABALHO FUTURO..................................................................................95 13.1 TRABALHO FUTURO..........................................................................................................95 REFERÊNCIAS..................................................................................................................................97 ANEXOS...........................................................................................................................................101 ANEXO 1 – AVALIAÇÃO DOS PARSERS .............................................................................103 ANEXO 2 – QUESTIONÁRIO..................................................................................................113 ANEXO 3 – LISTA DE PERGUNTAS RECEBIDAS .............................................................115 ANEXO 4 – EXCERTO DA BASE DE DADOS LEXICAL ....................................................119 ANEXO 5 – MECANISMO DE HERANÇA DE TRAÇOS.........................................................123 ANEXO 6 – IMPLEMENTAÇÃO DA GRAMÁTICA ..................................................................125 ANEXO 7 – EXEMPLOS DO PROCESSAMENTO SINTÁCTICO E SEMÂNTICO DE INTERROGATIVAS................................................................................................145 ANEXO 8 – IMPLEMENTAÇÃO DO ALGORITMO DE CONVERSÃO ....................................149 ANEXO 9 – EXEMPLOS DA REPRESENTAÇÃO SEMÂNTICA DE INTERROGATIVAS EM PORTUGUÊS UTILIZANDO O ALGORITMO DE CONVERSÃO .........................157 8 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Índice de Figuras, Quadros e Regras Sintagmáticas Índice de Figuras, Quadros e Regras Sintagmáticas FIGURAS FIGURA 1 – RELAÇÃO HIPERONÍMIA/HIPONÍMIA ......................................................................................29 FIGURA 2 – ESQUEMA GERAL DO MÓDULO I ...........................................................................................57 FIGURA 3 – META-ENTRADA LEXICAL ....................................................................................................58 FIGURA 4 – REGRA SINTAGMÁTICA ........................................................................................................73 FIGURA 5 – REPRESENTAÇÃO EM ÁRVORE DA ESTRUTURA SINTÁCTICA ADOPTADA PARA AS ADJUNÇÕES A N’........................................................................................................................................77 FIGURA 6 – EXEMPLO DA APLICAÇÃO DA REGRA SINTAGMÁTICA 3 .........................................................78 FIGURA 7 – REPRESENTAÇÃO DA ESTRUTURA SINTÁCTICA ADOPTADA PARA A ADJUNÇÃO DO QUANTIFICADOR “TODOS” A N’’............................................................................................80 FIGURA 8 – REPRESENTAÇÃO EM ÁRVORE DA ESTRUTURA SINTÁCTICA ADOPTADA PARA A ADJUNÇÃO DO OPERADOR DE NEGAÇÃO A SV ..............................................................................................81 FIGURA 9 – REPRESENTAÇÃO EM ÁRVORE DA ESTRUTURA SINTÁCTICA ADOPTADA PARA AS CONJUNÇÕES ....................................................................................................................... 84 FIGURA 10 – REPRESENTAÇÃO EM ÁRVORE DA ESTRUTURA SINTÁCTICA ADOPTADA PARA O ESPECIFICADOR-NÚCLEO .......................................................................................................87 QUADROS QUADRO 1– CALENDARIZAÇÃO DO PLANO .............................................................................................23 QUADRO 2 – TEMPO DA ANÁLISE DAS FRASES.........................................................................................37 QUADRO 3 – CORRESPONDÊNCIA ENTRE SÍMBOLOS LPO E OPERADORES DEFINIDOS PARA A REPRESENTAÇÃO EM PROLOG ............................................................................................42 QUADRO 4 – REPRESENTAÇÃO SEMÂNTICA DE QUANTIFICADORES ..........................................................44 QUADRO 5 – TRAÇOS DAS EXPRESSÕES NOMINAIS SIMPLES .....................................................................53 QUADRO 6 – TRAÇOS DAS EXPRESSÕES NOMINAIS QUE SELECCIONAM COMPLEMENTOS ...........................54 QUADRO 7 – TRAÇOS DAS EXPRESSÕES VERBAIS ....................................................................................55 QUADRO 8 – TRAÇOS DE OUTRAS EXPRESSÕES PRESENTES NA BASE DE DADOS LEXICAL...........................56 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 9 INQUER – Interacção Pessoa – Máquina em Linguagem Natural REGRAS SINTAGMÁTICAS REGRA SINTAGMÁTICA 1 – PROMOÇÃO DE X PARA X’............................................................................74 REGRA SINTAGMÁTICA 2 – ORAÇÕES RELATIVAS RESTRITIVAS ...............................................................74 REGRA SINTAGMÁTICA 3 – ADJUNÇÃO DE UM MODIFICADOR (SP/VR) A UM N’ UM N’ ’ E DE UM QUANTIFICADOR A .........................................................................................................76 REGRA SINTAGMÁTICA 4 – ADJUNÇÃO DA NEGAÇÃO A SV .....................................................................81 REGRA SINTAGMÁTICA 5 – SNS MARCADOS ...........................................................................................83 REGRA SINTAGMÁTICA 6 – COORDENAÇÕES ..........................................................................................84 REGRA SINTAGMÁTICA 7 – ESPECIFICADOR - NÚCLEO ............................................................................87 REGRA SINTAGMÁTICA 8 – VERBO EXISTIR COM INVERSÃO DE SUJEITO ...................................................89 REGRA SINTAGMÁTICA 9 – GAP À DIREITA DE UM NÚCLEO VERBAL ........................................................90 REGRA SINTAGMÁTICA 10 – PREDICADOS COM UM COMPLEMENTO IN SITU .............................................90 10 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Introdução 1. Introdução O presente estágio insere-se no 5º ano da Licenciatura em Engenharia da Linguagem e do Conhecimento da Faculdade de Letras e da Faculdade de Ciências da Universidade de Lisboa. É nesta última instituição que, através do departamento de informática (http://www.di.fc.ul.pt/), o estágio está inscrito. O estágio tem a duração de seis meses com início a 1 de Setembro de 2002 e fim a 28 de Fevereiro de 2003. A Prof. Doutora Palmira Marrafa1 é a orientadora por parte da instituição de acolhimento, sendo o Prof. Doutor António Branco2 co-orientador por parte do departamento de informática. 1.1 INSTITUIÇÃO DE ACOLHIMENTO O estágio decorreu numa unidade de investigação, mais especificamente, no Grupo de Computação do Conhecimento Léxico-Gramatical – CLG, do Centro de Linguística da Universidade de Lisboa (CLUL), situado no Complexo Interdisciplinar da Universidade de Lisboa. 1.1.1 CENTRO DE LINGUÍSTICA DA UNIVERSIDADE DE LISBOA – CLUL 1.1.1.1 HISTÓRIA O Centro de Linguística da Universidade de Lisboa – CLUL, homologado oficialmente em Maio de 1976 como adstrito ao Instituto Nacional de Investigação Científica (INIC), continua o Centro de Estudos Filológicos (CEF), criado em 1932 na dependência do Instituto de Alta Cultura. Apesar do seu nome e da estreita relação que desde a sua criação mantém com a Universidade de Lisboa, nunca esteve, de facto, ligado a qualquer departamento dessa universidade, tendo desde sempre procurado preservar a sua identidade e a sua autonomia em matéria de planeamento e execução da actividade científica, como forma de garantir as condições e as estruturas básicas para uma actividade de investigação e desenvolvimento planeada a longo prazo e de carácter interdisciplinar. Aquando da extinção do INIC, a sua dimensão, o seu riquíssimo património e a especificidade dos trabalhos nele realizados justificaram a manutenção de um estatuto de autonomia relativa e a sua integração na Universidade de Lisboa como centro de investigação directamente dependente da Reitoria, estando ainda em curso as diligências necessárias para homologação de estatutos próprios, condizentes com esta nova situação. 1 A Profª Doutora Palmira Marrafa é Professora do Departamento de Linguística Geral e Românica, da Faculdade de Letras da Universidade de Lisboa, sendo docente da Licenciatura em Engenharia da Linguagem e do Conhecimento, e directora e coordenadora científica do CLG. 2 O Prof. Doutor António Branco é Professor do Departamento de Informática, da Faculdade de Ciências da Universidade de Lisboa, sendo docente da Licenciatura em Engenharia da Linguagem e do Conhecimento. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 11 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 1.1.1.2 OBJECTIVOS E ESTRUTURA O Centro de Linguística da Universidade de Lisboa – CLUL (http://www.clul.ul.pt/) é uma unidade que depende directamente da Reitoria da Universidade de Lisboa e se dedica à investigação, formação e divulgação científicas. Tem como principais objectivos a realização de actividades de investigação e de desenvolvimento experimental nas áreas da Linguística e a promoção e realização de investigação interdisciplinar, associando às áreas especificamente linguísticas áreas afins, nomeadamente a da Filologia, Antropologia e Engenharia da linguagem e do Conhecimento. Contribui para a formação de investigadores nessas áreas e para o conhecimento da língua portuguesa, apoiando a sua divulgação formação. Actualmente, conta com cinco grupos de investigação a saber: Fala, Linguística de Corpus, Computação do Conhecimento Gramatical (CLG), Variação e Filologia. Fazem parte deste centro cerca de 50 investigadores, assistentes e professores repartidos pelos vários grupos dependendo da área da sua especialidade. Projectos do grupo de Fala: - Estudo sobre a Relação entre Factores Segmentais e Prosódicos em Português Europeu; - DIXI+: Um Sintetizador Texto-para-Fala em Português para Comunicação Alternativa e Aumentativa; - Alguns aspectos da Fonologia do Português no Quadro Auto-Segmental. Projectos do grupo de Linguística de Corpus: - Recursos Linguísticos Disponíveis (RLD): Corpora e Léxicos; - CRPC – Corpus de Referência do Português Contemporâneo; - C-ORAL-ROM – Integrated Reference Corpora for Spoken Romance Languages; - Recursos Linguísticos para o Português: um corpus e instrumentos para a sua consulta e análise; - Léxico Multifuncional Computorizado do Português Contemporâneo; - SIMPLE – Semantic Information for Multifunctional Plurilingual Lexica; - Tábuas de concordâncias, uma ferramenta para o estudo da língua portuguesa; - Análise Sintáctica e Semântica dos Verbos Psicológicos do Português, Passagens Semânticas e Homonímia; - AUDIOLING-LP Língua Portuguesa: som e pronúncia; - Estudo do uso e do Significado da Preposição DE em Contextos Nominais SN DE SN; - Ensino de Aspectos de Morfologia e de Sintaxe do Português Língua Materna; - ENABLER: European National Activities for Basic Language Resources. Projectos do grupo de Computação do Conhecimento Léxico-Gramatical: 12 - WordNet.PT – Rede Semântica-Lexical da Língua Portuguesa; - PROGRAM – Laboratório de Processamento Gramatical; Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Introdução - TFNL – Teorias Formais das Línguas Naturais: Fundamentos Conceptuais, Arquitecturas e Computação. - LexNet – Especificação de Padrões de Lexicalização para uma Extensão da WordNet.PT - A interface léxico-enciclopédia na construção de léxicos computacionais - INQUER – Interacção Pessoa – Máquina em linguagem natural Projectos do grupo de Variação: - ALEPG – Atlas Linguístico-Etnográfico de Portugal e da Galiza; - ALEAç – Atlas Linguístico e Etnográfico dos Açores; - ALLP – Atlas Linguístico do Litoral Português; - ALiR – Atlas Linguistique Roman; - ALE – Atlas Linguarum Europae; - Linguagens Fronteiriças: Mirandês; - Linguagens Fronteiriças: Barranquenho; - CORDIAL-SIN – Corpus Dialectal com Anotação Sintáctica; - Estudo das Variantes Flexionais do Verbo em Português Continental Falado. Projectos do grupo de Filologia: - DRA: Dicionário de Regionalismos e Arcaísmos; - Estudos de Lírica Galego-Portuguesa; - Bibliografia da Prosa Medieval em Língua Portuguesa; - Filologia Medieval; - Filologia do Manuscrito Moderno; - Fontes para a História do Português Clássico; - Onomástico Português e Românico. 1.1.1.3 ÓRGÃOS DE GESTÃO Assembleia Plenária A Assembleia Plenária é o órgão representativo máximo do CLUL. À Assembleia Plenária compete: aprovar e propor superiormente eventuais alterações estatutárias; eleger os vogais da Comissão Directiva e decidir da sua eventual substituição ou destituição; discutir quaisquer assuntos que lhe sejam submetidos pelo Conselho Científico, pela Comissão Directiva ou por iniciativa de um terço dos seus membros. Conselho Científico O Conselho Científico é o órgão responsável pela definição e pela condução da política científica do CLUL, compreendendo a planificação, a orientação e a coordenação, nas suas grandes linhas, das actividades sectoriais. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 13 INQUER – Interacção Pessoa – Máquina em Linguagem Natural Compete ao Conselho Científico: definir, criar ou reestruturar os sectores de investigação do CLUL; orientar e estimular a actividade do CLUL; discutir e aprovar os programas dos sectores, seus projectos de investigação e actividades complementares; apreciar e aprovar os planos e relatórios anuais e plurianuais de actividade científica; planificar as acções de formação do CLUL; emitir directrizes gerais relativas às actividades da biblioteca, do serviço de documentação, do serviço de edições e de quaisquer outros serviços que no CLUL venham a ser criados; aprovar os acordos e convénios de incidência científica e pedagógica entre o CLUL e quaisquer outras entidades; fazer propostas relativas à aquisição de equipamentos e de material bibliográfico e documental. Comissão Directiva A Comissão Directiva é o órgão de gestão administrativa e financeira do CLUL. É composta por quatro membros, um presidente e três vogais. Os vogais são eleitos pela Assembleia Plenária. As funções de Presidente da Comissão Directiva são desempenhadas, por inerência, pelo Coordenador Científico do CLUL. Compete à Comissão Directiva: velar pelo cumprimento da lei e dos estatutos e dirigir os serviços; executar, dentro das possibilidades orçamentais, as deliberações da Assembleia Plenária e do Conselho Científico e coordenar toda a actividade inerente à gestão administrativa e financeira ou relativa ao património do CLUL; assegurar a realização de todas as eleições previstas nos estatutos; elaborar e/ou aprovar os orçamentos e os relatórios de contas anuais ou plurianuais, de acordo com as prioridades definidas pelo Conselho Científico; executar as políticas definidas pelo Conselho Científico e elaborar os planos de desenvolvimento do CLUL; propor a abertura de concursos de admissão ou de promoção de pessoal não científico e propor as respectivas nomeações e contratações; deliberar sobre as aquisições necessárias ao bom funcionamento do CLUL e promovê-las; aceitar liberalidades feitas ao CLUL. 14 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Introdução Coordenador Científico O Coordenador Científico é, por inerência, Presidente da Comissão Directiva, sendo eleito pelo Conselho Científico. Compete ao Coordenador Científico: convocar o Conselho Científico e presidir às suas reuniões; dar publicidade às deliberações do Conselho Científico e promover a discussão das que não forem directamente cometidas a outros membros do Conselho; coordenar as actividades do CLUL e assegurar a elaboração dos planos, relatórios anuais e plurianuais de actividade científica; fomentar a discussão das grandes opções programáticas; supervisionar a negociação de acordos ou convénios entre CLUL e quaisquer outras entidades, cabendo-lhe propor ao Conselho Científico a sua aprovação; presidir aos júris de concursos de admissão ou promoção de pessoal científico do CLUL. 1.1.2 GRUPO DE COMPUTAÇÃO DO CONHECIMENTO LÉXICOGRAMATICAL – CLG A Prof. Doutora Palmira Marrafa é a coordenadora deste grupo, que tem como principais linhas de investigação (i) a modelização computacional das línguas naturais e (ii) o estudo dos fundamentos conceptuais das teorias formais das línguas naturais. A primeira destas linhas subdivide-se em semântica lexical do Português e modelização das línguas naturais, e sistemas de parsing. No âmbito do primeiro subdomínio estão em fase de desenvolvimento três projectos dos quais se destaca, pela sua importância neste estágio, o projecto WordNet.PT. Este projecto visa a construção de uma Base de Dados Lexicais susceptível de ser utilizada em várias aplicações no âmbito da Linguística Computacional e da Engenharia da Linguagem, tais como instrumentos de apoio ao ensino do Português, tradução automática, busca de informação com base em perguntas em Português, interfaces em Português, etc. Os resultados deste projecto estão já, em parte, gratuitamente disponíveis na Internet (http://www.clul.ul.pt/WordNet/index.html). Ainda dentro deste domínio está em fase de desenvolvimento o projecto LexNet – Especificação de Padrões de Lexicalização para uma Extensão da WordNet.PT– e o projecto “A interface léxicoenciclopédica na construção de léxicos computacionais”. No domínio da modelização das línguas naturais e sistemas de parsing estão a ser desenvolvidas várias dissertações de doutoramento e monografias, enquadradas no projecto PROGRAM –Laboratório de Processamento Gramatical, que envolve a modelização e a computação de diversos fenómenos Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 15 INQUER – Interacção Pessoa – Máquina em Linguagem Natural gramaticais e análise comparativa de algoritmos de parsing para diferentes quadros de representação gramatical. Da segunda grande linha de investigação (ii) destaca-se o projecto TFNL-Teorias Formais das Línguas Naturais: Fundamentos Conceptuais, Arquitecturas e Computação, no âmbito do qual está a ser desenvolvida uma cartografia conceptual comparativa das ferramentas e dos temas mais importantes nas arquitecturas das teorias formais das línguas naturais. 1.2 INTERACÇÃO PESSOA-MÁQUINA EM LINGUAGEM NATURAL – INQUER A estagiária integrou uma equipa de dois elementos que tinha como objectivo o planeamento e desenvolvimento da primeira fase de um projecto denominado INQUER – Interacção Pessoa-Máquina em Linguagem Natural. Este projecto destina-se a desenvolver um sistema de pergunta-resposta em Linguagem Natural que permitirá a interacção entre o utilizador e a máquina, sendo que esta última responderá a questões simples sobre o mundo real. Para isso o sistema utilizará a WordNet.PT que contém informação suficiente e organizada de forma a facilitar a busca e extracção dessa mesma informação. O sistema INQUER será um recurso tecnológico capaz de explorar as potencialidades da WordNet.PT uma vez que permitirá um fácil acesso à informação aí descrita. Para além disso, será também uma ferramenta linguística, na medida em que recebe perguntas em linguagem natural e as analisa de forma a construir uma representação semântica capaz de permitir a extracção da informação relevante. Embora esta ferramenta tenha sido pensada para a exploração de recursos da WordNet.PT, os mecanismos e metodologias que utiliza podem ser facilmente adaptáveis a outro tipo de base de dados. O desenvolvimento deste sistema foi subdividido em três grandes módulos sendo, nesta primeira fase, implementados apenas dois. O primeiro módulo consiste na implementação de um analisador sintáctico de perguntas em Linguagem Natural e de um gerador de representações semânticas adequadas, de forma a serem utilizadas no Módulo II – Inferência. Nesse módulo será pesquisada e extraída a informação necessária à elaboração da resposta, sendo o resultado utilizado no módulo III para a construção de uma resposta em língua natural – Geração (módulo não desenvolvido nesta fase do projecto). Devido à modularidade deste sistema é necessária uma constante interacção entre os responsáveis pela implementação dos diferentes módulos. Assim, durante todo o desenvolvimento desta fase do projecto houve um trabalho de equipa que cabe salientar. 16 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Introdução A importância deste projecto, assim como a sua complexidade, fazem com que o seu desenvolvimento não se limite aos 6 meses de duração do estágio, sendo que outras fases de desenvolvimento estão já a ser planeadas (nomeadamente a fase da Geração). Os objectivos gerais do desenvolvimento desta primeira fase do projecto passam pelos seguintes itens: 1. Enriquecimento da base de dados extraída da WordNet.PT 2. Construção de um sistema de análise de estruturas gramaticais 3. Construção de um sistema de busca e extracção de informação 4. Construção de uma interface que permita a introdução de perguntas em língua natural e devolva uma resposta 1.3 ESTRUTURA DO RELATÓRIO FINAL DE ESTÁGIO Neste relatório são apresentadas todas as opções tomadas durante a construção do módulo I, da responsabilidade da estagiária, que no que respeita à implementação quer no que respeita à motivação linguística. No capítulo seguinte – Objectivos do estágio e contexto do trabalho – são apresentados os objectivos do estágio, o plano de trabalho inicialmente delineado, assim como uma pequena descrição de todas as suas fases. No capítulo 3 – Metodologia e calendarização do trabalho – é apresentada a calendarização inicial do plano descrito no capítulo 2, as alterações ao plano inicial e a justificação dessas mesmas alterações. No capítulo 4 – Estudo sobre a WordNet.PT – é apresentada brevemente a base de dados de conhecimento linguístico que serve de base de dados ao sistema. Nos capítulos seguintes são apresentadas e justificadas as várias opções tomadas para a implementação da do sistema. No capítulo 5 – Método de processamento das perguntas – é descrita a opção tomada para o tratamento das perguntas introduzidas pelo utilizador. No capítulo 6 – Linguagem de programação – é apresentada a justificação para a escolha da linguagem de programação escolhida para a implementação do sistema. O capítulo 7 – A escolha do parser – descreve as razões que levaram à escolha do parser a utilizar neste sistema. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 17 INQUER – Interacção Pessoa – Máquina em Linguagem Natural No capítulo 8 – Formalismos Sintáctico e Semântico – é justificada a escolha dos formalismos adoptados no desenvolvimento deste sistema. No Capítulo 9 – Tipos de Perguntas – são apresentados os vários tipos de construções interrogativas aceites pelo sistema nesta primeira fase, assim como a justificação para a sua preferência em relação a outros. No Capítulo 10 – Base de dados lexical – é descrito todo o processo de escolha e tratamento dos lexemas que constituem a base de dados lexical deste sistema. O Capítulo 11 – A Gramática – descreve a implementação da gramática deste sistema, assim como a justificação de todas as opções tomadas do ponto de vista linguístico. No capítulo 12 – Algoritmo de conversão – é apresentado o algoritmo que recebe uma interrogativa em língua natural e devolve uma ou mais representações semânticas adequadas. Por fim, no Capítulo 13 – Conclusões e Trabalho Futuro – é feita uma análise crítica ao trabalho efectuado e apontadas as perspectivas para um trabalho futuro. 18 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Objectivos do estágio e contexto do trabalho 2. Objectivos do estágio e contexto do trabalho 2.1 OBJECTIVOS DO ESTÁGIO O projecto INQUER pretende desenvolver um sistema de interacção Pessoa-Máquina em Linguagem Natural utilizando como base a WordNet.PT, que está a ser desenvolvida no CLG. Devido à dimensão de um sistema deste tipo, foi necessária a sua divisão em três módulos distintos – Análise Sintáctico-Semântica, Inferência e Geração –, sendo, nesta fase, desenvolvidos apenas os dois primeiros. Cada um dos módulos foi atribuído a um dos elementos de uma equipa constituída para o desenvolvimento deste projecto. A estagiária integrou esta equipa a 1 de Setembro de 2002, tendo lhe sido atribuído o desenvolvimento do módulo I – Análise Sintáctico-Semântica. Este módulo centra-se, concretamente, na selecção e modelização de estruturas sintácticas e envolve a implementação de um programa que receba como input uma pergunta em linguagem natural, faça uma análise sintáctica dessa mesma pergunta e construa uma representação semântica simplificada. Os objectivos gerais deste módulo são: 1. Escolha do tipo de perguntas a tratar numa primeira fase 2. Enriquecimento da base de dados 3. Estudo sobre as várias opções de modelização e implementação possíveis (formalismos sintáctico e semântico e parser) 4. Construção de uma gramática capaz de dar conta da análise sintáctica e semântica das construções interrogativas definidas no ponto 1 Para se proceder à concretização deste módulo foi necessária uma pesquisa prévia sobre os trabalhos já desenvolvidos nesta área assim como um estudo de formalismos computacionais de representação da sintaxe e da semântica. Foi também necessário estudar bibliografia sobre a WordNet.PT. 2.2 CONTEXTO DO TRABALHO O projecto INQUER surge no seguimento do projecto WordNet.PT também desenvolvido pelo CLG. Este projecto permitirá o desenvolvimento de uma ferramenta que potenciará as virtualidades da WordNet.PT enquanto recurso linguístico, e que permitirá uma pesquisa da informação aí contida de forma fácil e natural. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 19 INQUER – Interacção Pessoa – Máquina em Linguagem Natural No desenvolvimento deste projecto estão envolvidas diversas áreas científicas, como é o caso da Lógica, da Semântica, da Sintaxe, da Inteligência Artificial e da Engenharia da Linguagem, o que lhe confere o interesse e os riscos acrescidos da multidisciplinaridade. O plano que se segue apresenta as várias fases da implementação deste módulo, assim como uma breve descrição dos seus objectivos. 1. Definição do plano 1.1. Estudo da arquitectura geral do projecto WordNet.PT Selecção e estudo de bibliografia essencial sobre a arquitectura do projecto WordNet.PT, como base para a concepção e organização do projecto INQUER. 1.2. Concepção do projecto INQUER 1.2.1. Planificação do projecto 1.2.2. Divisão do projecto em três módulos autónomos 1.2.3. Atribuição de tarefas diferentes a cada elemento da equipa de investigação Esta fase do estágio passa pela integração dos estagiários no CLG – Grupo de Computação do Conhecimento Léxico-Gramatical, e pela planificação do projecto INQUER. 2. Definição do formato das perguntas 2.1. Levantamento dos vários tipos de perguntas possíveis Caracterização informal dos vários tipos de interrogativas do Português, relativamente ao tipo de resposta pretendida. 2.2. Primeira abordagem das várias estratégias de implementação Reflexão, com base nos pontos anteriores, sobre a forma como cada um dos tipos de perguntas estudados anteriormente pode ser tratado no âmbito da aplicação em desenvolvimento. 2.3. Selecção dos tipos de perguntas a tratar numa primeira fase do projecto Tendo em conta as considerações tecidas no ponto anterior, propõe-se, numa primeira fase, a implementação de apenas alguns dos tipos de interrogativas. A razão desta selecção prende-se com o facto de a informação necessária para responder a alguns dos tipo de questões não estar definida ou estruturada na base de dados. Neste contexto, a informação necessária para responder a todos os tipos de questões teria ainda de ser inserida manualmente na base de dados, o que está fora do âmbito deste trabalho. 20 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Objectivos do estágio e contexto do trabalho 3. Avaliação dos formalismos gramaticais 3.1. Pesquisa dos formalismos disponíveis. Nesta fase procede-se a um levantamento de vários tipos de formalismos existentes para a construção de gramáticas. 3.2. Estudo e análise aprofundada de cada formalismo. Neste ponto, avaliam-se as vantagens e as desvantagens dos diferentes formalismos, fazendo uma comparação entre eles. 3.3. Selecção do formalismo gramatical Na sequência do trabalho desenvolvido nas etapas anteriores, selecciona-se o formalismo gramatical mais apropriado para o tratamento do problema em questão. 4. Tratamento do léxico 4.1. Selecção do léxico a tratar Neste ponto são escolhidos os domínios semânticos do léxico a tratar. A razão desta escolha tem como principal motivação o facto de a WordNet.PT ainda não ter todos os seus domínios revistos. 4.2 Extracção e tratamento do léxico da base de dados Este ponto consiste no tratamento manual do léxico de modo a que este possa ser utilizado pela aplicação em desenvolvimento. Utiliza-se a WordNet.PT como principal fonte de entradas lexicais. 5. Representação sintáctica e semântica da frase 5.1. Construção da Gramática Com base no formalismo escolhido e na arquitectura do léxico, constroem-se as regras da gramática, definindo a estrutura sintáctica das perguntas a serem reconhecidas pelos sistema. 5.2. Integração da representação semântica na Gramática Nesta fase elabora-se um estudo sobre métodos de representação semântica e selecciona-se aquele que melhor se adapta ao problema em questão. Seguidamente procede-se à inclusão da representação semântica na gramática. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 21 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 6. Avaliação dos parsers 6.1. Pesquisa dos parsers disponíveis. Neste ponto pesquisa-se e recolhe-se informação sobre os vários tipos de parsers que existem e sobre os vários métodos de pesquisa que estes podem adoptar. 6.2. Estudo aprofundado de cada parser e comparações entre eles. Esta fase consiste no levantamento das vantagens e desvantagens de cada parser, assim como dos métodos de pesquisa mais eficientes para a análise de uma frase. 6.3. Selecção do parser Nesta fase é escolhido o parser a utilizar na análise das frases, tendo como base as informações recolhidas no ponto anterior. 6.4. Construção do parser Este ponto consiste na construção do parser escolhido, com base na gramática e no léxico. 7. Dos termos em linguagem natural aos predicados Prolog 7.1. Determinação dos termos Neste ponto, e com base nas observações do ponto 1, identificaram-se os termos em linguagem natural e estabeleceram-se correspondências termos – relações WordNet.PT – predicados Prolog 8. Construção de um algoritmo capaz de converter uma pergunta em Linguagem Natural uma forma lógica 8.1. Implementação de um algoritmo de conversão Nesta fase constrói-se um algoritmo que converta uma pergunta em linguagem natural, dada pelo utilizador, numa forma lógica que represente a semântica, utilizando os mecanismos anteriormente referidos. 9. Integração do Módulo I no projecto INQUER 9.1. Integração do Módulo I Este ponto consiste na junção deste módulo aos restantes módulos do projecto INQUER, de forma a obter-se uma aplicação coerente e funcional. 10. Elaboração do Relatório Final 10.1. Elaboração do Relatório Nesta fase procede-se à elaboração de um relatório final contendo uma descrição pormenorizada de todas as fases do trabalho desenvolvido, bem como dos resultados obtidos. 22 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Metodologia e calendarização do trabalho 3. Metodologia e calendarização do trabalho 3.1 METODOLOGIA Tratando-se de um estágio na área da investigação, a metodologia adoptada consistiu no estudo de trabalhos já realizados na área, levantamento dos problemas encontrados e pesquisa de soluções possíveis. No entanto, como este projecto envolve também uma fase de implementação de uma ferramenta computacional, foi necessário utilizar metodologias adequadas ao desenvolvimento de software. Essas metodologias passaram pela escolha da linguagem de programação mais adequada, pela especificação do programa, pela implementação e pela fase de testes. 3.2 CALENDARIZAÇÃO DO TRABALHO FASE DATA INÍCIO DATA FIM 1. Definição do plano 1 de Setembro 2002 20 de Setembro de 2002 2. Definição do formato das perguntas 21 de Setembro de 2002 31 de Outubro de 2002 3. Avaliação dos formalismos gramaticais 26 de Setembro de 2002 8 de Outubro de 2002 4. Tratamento do léxico 9 de Outubro de 2002 20 de Novembro de 2002 sintácticas 16 de Novembro de 2002 10 de Dezembro de 2002 6. Avaliação dos parsers 11 de Dezembro de 2002 5 de Janeiro de 2003 6 de Janeiro de 2003 10 de Fevereiro de 2003 11 de Fevereiro de 2003 15 de Fevereiro de 2003 16 de Fevereiro de 2003 28 de Fevereiro de 2003 5. Implementação de algumas estruturas 7. Implementação das restantes estruturas sintácticas e das estruturas semânticas 8. Construção de um algoritmo capaz de converter uma pergunta em Linguagem Natural para uma forma lógica 9. Elaboração do Relatório Final Quadro 1– Calendarização do plano Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 23 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 1. Definição do plano 1.1 Integração da estagiária no CLG 1.2 Estudo da arquitectura geral do projecto WordNet.PT 1.3 Concepção do projecto INQUER Esta fase do desenvolvimento do projecto decorreu entre o dia 1 e o dia 20 de Setembro de 2002. Teve como principal objectivo a integração da estagiária no CLG, onde lhe foi apresentada a equipa de trabalho assim como os recursos informáticos e linguísticos disponíveis. Desses recursos, destacam-se aqueles que foram utilizados pela estagiária no desenvolvimento do projecto: 1. Pentium MMX 350 MHz 64 RAM 1. Windows NT WorkStation version 4.0 2. SWI Prolog 5.0.9 (freeware version) 3. NoteTabLigth 4.91 (freeware version) 4. Polaris 1.5.0 5. Detonador de Perspectiva Export WordNet Ainda durante esta fase procedeu-se a um estudo da arquitectura geral do projecto WordNet.PT que serve de base a todo o sistema INQUER. Este estudo incluiu a leitura de vários documentos e publicações, assim como um primeiro contacto com a base de conhecimento lexical. Este estudo foi fundamental para a concepção e planificação do projecto INQUER feita nesta fase. Procedeu-se ainda à divisão do projecto em módulos e à distribuição de tarefas pelos elementos da equipa. Fez também parte desta fase o tratamento de toda a parte burocrática do estágio assim como uma primeira planificação do desenvolvimento do módulo atribuído à estagiária. 2. Definição do formato das perguntas 2.1 Elaboração de um questionário em formato HTML 2.2 Selecção do tipo de perguntas a implementar numa primeira fase do projecto Esta fase do projecto iniciou-se a 21 de Setembro prolongando-se até ao fim de Outubro. Procedeu-se à elaboração de um pequeno questionário, que permitisse a recolha de um pequeno corpus de interrogativas que eventuais utilizadores pudessem colocar ao sistema (Capítulo 9). A recolha desses dados prolongouse até à última semana de Outubro, altura em que se procedeu à análise desses mesmos dados. Em seguida fez-se a caracterização informal dos vários tipos de perguntas recebidas, relativamente à sua estrutura sintáctica e/ou ao tipo de resposta pretendida. Destas perguntas seleccionaram-se algumas que seriam objecto de implementação. 24 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Metodologia e calendarização do trabalho 3. Avaliação dos formalismos gramaticais 3.1 Pesquisa dos formalismos disponíveis. 3.2 Estudo e análise de cada formalismo. 3.3 Selecção do formalismo gramatical De 26 de Setembro a 8 de Outubro fez-se alguma investigação sobre trabalhos já realizados e em curso na área de sistemas de pergunta-resposta. Esta pesquisa teve como principal objectivo o estudo das várias estratégias de implementação utilizadas assim como dos resultados obtidos. Ainda neste período procedeu-se ao levantamento dos vários formalismos gramaticais disponíveis para o desenvolvimento do submódulo da sintaxe na gramática do sistema. Esse levantamento foi essencial para a escolha do formalismo a adoptar. 4. Tratamento do léxico 4.1 Selecção dos domínios do léxico a tratar 4.1 Extracção do léxico da base de dados 4.2 Escolha da informação lexical relevante e enriquecimento da base de dados lexical 4.3 Enriquecimento da base de dados lexical com palavras não extraídas da WordNet.PT Esta fase iniciou-se a 9 de Outubro e prolongou-se até 20 de Novembro de 2002. Inicialmente estava previsto durar apenas até 7 de Novembro, mas a quantidade de informação que teve de ser introduzida manualmente (ver Capítulo 10) obrigou à sua extensão. Por outro lado, os resultados obtidos através do questionário revelaram a necessidade de acrescentar algumas entradas lexicais que não constavam dos domínios inicialmente extraídos da WordNet.PT. 5. Implementação de algumas estruturas sintácticas 5.1 Estudo e selecção da linguagem de programação 5.2 Especificação do programa 5.3 Implementação de algumas construções sintácticas De 16 de Novembro a 10 de Dezembro foram implementadas as primeiras estruturas sintácticas. Para isso foi necessário proceder a um estudo prévio para a escolha adequada da linguagem de programação a utilizar. Foi também necessário fazer uma primeira especificação do programa para depois se proceder à sua implementação. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 25 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 6. Avaliação dos parsers 6.1 Pesquisa dos parsers disponíveis. 6.2 Estudo de cada um dos parsers 6.3 Implementação dos vários parsers 6.4 Avaliação e selecção dos parsers Esta fase do desenvolvimento do sistema decorreu de 11 de Dezembro de 2002 a 5 de Janeiro de 2003. O objectivo desta fase era o de escolher e implementar o parser mais adequado à gramática desenvolvida na fase anterior. Para isso foi necessário fazer uma pesquisa sobre os vários tipos de parsers disponíveis, implementá-los e avaliá-los na gramática. 7. Implementação das restantes estruturas sintácticas e das estruturas semânticas 7.1 Implementação de mais algumas estruturas sintácticas 7.2 Estudo de formalismos semânticos disponíveis 7.3 Implementação do formalismo semântico escolhido 7.4 Integração das regras semânticas e sintácticas 7.5 Avaliação do sistema Uma vez que as estruturas sintácticas introduzidas no sistema foram apenas para escolher o parser, procede-se agora à implementação das restantes. Foram também estudados alguns formalismos semânticos, assim como a sua implementação, para uma escolha informada sobre o formalismo mais adequado para este sistema. Ainda nesta fase foram implementadas as regras semânticas e incorporadas nas regras sintácticas já referidas. Por último, foi feita uma avaliação do sistema e procedeu-se à correcção de pequenos erros não detectados nas fases de desenvolvimento. Esta fase decorreu de 6 de Janeiro a 10 de Fevereiro de 2003. 8. Construção de um algoritmo capaz de converter uma pergunta em Linguagem Natural para uma forma lógica 8.1 Implementação de um algoritmo de conversão 8.2 Integração do módulo I com o módulo II do projecto INQUER De 10 a 15 de Fevereiro foi implementado um pequeno algoritmo capaz de receber uma pergunta em língua natural, pesquisar todas as ambiguidades lexicais, analisar a frase sintacticamente e construir uma representação semântica para cada uma das interpretações sintácticas. Este algoritmo foi posteriormente utilizado para a integração do módulo I com o módulo II que ocorreu ainda nesta fase. 26 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Metodologia e calendarização do trabalho 9. Elaboração do Relatório Final 9.1 Elaboração do Relatório Nesta última fase, que decorreu de 16 a 28 de Fevereiro, foi elaborado o relatório final de estágio. O plano de desenvolvimento inicial teve algumas alterações relativamente ao plano de trabalho efectuado. Uma das principais alterações passou pela eliminação de uma das fases descritas no plano inicial (fase 7) que se referia à análise de termos em língua natural e a sua correspondência com predicados Prolog. Esta alteração foi devida à necessidade de esta correspondência ser feita numa fase inicial do desenvolvimento do módulo II para se proceder à implementação do processo de inferência. Assim, esta fase passou a fazer parte do desenvolvimento do módulo II. Outra alteração ao plano inicial foi o tempo de execução da fase de tratamento do léxico que compõe a base de dados lexical. Esta alteração deveu-se ao facto de muita informação ter de ser inserida manualmente o que requereu mais tempo que o inicialmente previsto. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 27 Estudo sobre a WordNet.PT 4. Estudo sobre a WordNet.PT Como já se referiu, o projecto INQUER insere-se no âmbito de um projecto desenvolvido no CLG – a WordNet.PT (WordNet do Português - http://www.clul.ul.pt/WordNet/index.html). A WordNet.PT é uma das bases de dados de conhecimento linguístico que adopta o seu modelo geral de estrutura da EuroWordNet (http://www.illc.uva.nl/EuroWordNet/). A EuroWordNet é composta por várias WordNets de línguas europeias constituindo por isso uma base de dados multilingue. Cada uma das WordNets que compõe a EuroWordNet tem uma estrutura idêntica à da WordNet de Princeton (http://www.cogsci.princeton.edu/~wn/w3wn.html). Esta foi a primeira WordNet a ser desenvolvida e teve como língua base o Inglês-Americano. Nesta base de dados lexical o significado das categorias lexicais (nomes, adjectivos, verbos e advérbios) é representado através de um conjunto de relações conceptuais e lexicais – synset – “Set of Synonyms”. As unidades lexicais são organizadas em conjuntos de sinónimos (expressões atómicas ou não atómicas3) que denotam um mesmo conceito, sendo cada um desses conjuntos representados por um nó na rede. A sinonímia desempenha um papel crucial na estrutura interna da rede pois, neste caso, serve para relacionar conceitos lexicalizados. Há evidências de que esta organização simula a estrutura do léxico mental (Miller 1993). Cada nó da rede está ligado a outros através de várias relações semânticas, a saber, a generalização (hiperonímia), especialização (hiponímia) e as relações de todo/parte (holonímia/meronímia). Estas relações organizam o léxico de forma a estabelecer hierarquias lexicais. Por exemplo, a relação hiperonímia/hiponímia permite a hierarquização dos conceitos em termos de inclusão dos mais específicos nos mais gerais, sendo por isso uma relação muito importante na estrutura da rede. Vejamos o seguinte exemplo: alimento hiperonímia {carne, chicha} hiponímia carne picada ... carne branca Figura 1 – Relação hiperonímia/hiponímia Nesta figura está representada a relação de hiperonímia e hiponímia. Assim, alimento é hiperónimo de carne e, como esta relação é transitiva, alimento é também hiperónimo de carne picada e de carne 3 Uma entrada lexical pode ser ou não atómica (ex. lacticínio / produto lácteo) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 29 INQUER – Interacção Pessoa – Máquina em Linguagem Natural branca. Note-se que o nó do meio nesta estrutura é constituído por duas entradas lexicais que representam o mesmo conceito carne e chicha. A relação de hiponímia pode ser definida como inversa à da hiperonímia. Assim temos que carne e chicha são hipónimos de alimento e que carne picada e carne branca são hipónimos de carne, chicha e alimento. Os conceitos que se encontram ao mesmo nível na hierarquia designam-se por co-hipónimos. Assim carne picada e carne branca são co-hipónimos. Na estrutura da WordNet.PT existem ainda outras relações importantes como a merónima/holonímia ou o ILI (Inter-Lingual-Index) que não sendo directamente utilizadas na implementação do módulo I, serão muito importantes no módulo II. 30 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Métodos de Processamento das Perguntas 5. Método de Processamento das Perguntas O sistema propõe-se receber como input uma questão em Português introduzida pelo utilizador, sem restrições quanto ao seu formato. Para computar este tipo de perguntas, é necessário que o sistema tenha a capacidade de construir uma representação da informação pedida. Para isso, estudaram-se alguns trabalhos na área que se debateram com o mesmo problema e verificou-se que eram duas as opções mais viáveis: a predição do tipo de resposta através da extracção de palavras-chave e a utilização de gramáticas independentes do contexto. A predição do tipo de resposta através da extracção de palavras-chave é a opção mais utilizada em sistemas desta natureza. Este método consiste na caracterização do tipo de resposta à pergunta introduzida pelo utilizador, limitando o espaço de procura na fase da inferência. Uma caracterização simples pode ser feita através da análise do pronome interrogativo presente na pergunta. Perguntas do tipo “Quem é a pessoa mais rica do mundo?”, “Onde fica Lisboa?” ou “Quando foi a tomada da Bastilha?” podem ter respostas do tipo Pessoa, Localização e Data respectivamente. Estas etiquetas serão associadas à pergunta introduzida, indicando assim o tipo de informação requerido para a elaboração da resposta. Uma caracterização mais rigorosa pode ser feita recorrendo a mecanismos estatísticos que extraiam palavras-chave da pergunta. Estas palavras servirão para que o sistema, na fase de inferência, localize frases com elevada probabilidade de conterem a resposta. Contextos semânticos podem também ser utilizados de forma a ajudarem a seleccionar a resposta correcta. Este método é largamente utilizado em sistemas de pergunta–resposta cuja base de dados é constituída por documentos de texto (na Internet ou não), o que não acontece no caso deste sistema. Uma vez que a base de dados utilizada neste sistema é a WordNet.PT, este tipo de método não teria os mesmos resultados que nos casos em que a base de dados é constituída por documentos de texto. Embora se pudessem utilizar algumas vantagens deste método para extrair informação da glosa, este método traria muitas desvantagens quando essa informação não é suficiente e é necessário fazer outros tipos de pesquisa. As gramáticas independentes do contexto são um formalismo constituído por regras que permitem definir as estruturas sintácticas de uma dada língua. Uma propriedade muito importante destas gramáticas é o facto de poderem ser aplicadas em qualquer contexto. Por exemplo, a regra SN → D N diz-nos que um SN pode consistir num D seguido de um N independentemente do contexto em que ocorre. Nestas gramáticas as regras têm apenas um termo (constituinte) no lado esquerdo, podendo ter vários no lado direito (permitindo a recursividade). Para cada tipo de sintagma podem existir várias regras de rescrita. Por exemplo, um sintagma nominal (de agora em diante SN) pode ser constituído por um Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 31 INQUER – Interacção Pessoa – Máquina em Linguagem Natural determinante (D) e por um nome (N), mas também pode integrar um determinante, um nome e uma oração relativa, etc. Alguns estudos realizados sobre os vários métodos de processamento de perguntas [Cardei te Al., 2000] verificaram que a introdução de alguma informação linguística em sistemas que utilizam apenas métodos estatísticos, melhora bastante os resultados. Desta forma, parece que o melhor método para a análise de perguntas seria um misto de modelização linguística (sintáctica e semântica), e de métodos estatísticos com análise de grandes quantidades de corpora. Para a realização deste projecto, não existia qualquer base de corpora anotado de perguntas em Português que permitisse um tratamento estatístico adequado, e a anotação manual de corpora está fora do âmbito deste trabalho. As gramáticas, por sua vez, quando são cuidadosamente construídas, permitem uma boa aproximação linguística na análise de frases e conseguem cobrir uma grande parte das estruturas sintácticas de uma língua. Permitem também o processamento sintáctico e semântico da pergunta de forma independente e a construção de parsers eficientes. Pelas razões explicitadas acima, a escolha do método para a análise das perguntas recaiu naturalmente sobre as gramáticas independentes do contexto. 32 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Linguagem de Programação 6. Linguagem de Programação O módulo I do projecto INQUER tem como objectivos a análise sintáctica e a construção de uma representação semântica de uma pergunta introduzida pelo utilizador. Esta representação utiliza o formalismo da Lógica de Primeira Ordem (como veremos mais adiante), que é implementado seguindo os propósitos do Paradigma da Programação em Lógica. A linguagem de programação escolhida surge naturalmente: Prolog. Esta é uma linguagem de programação baseada na lógica formal, do mesmo modo que linguagens como C, Pascal e outras similares são baseadas na aritmética e na álgebra. A diferença entre o Prolog e linguagens como o C é a de que a programação em Prolog permite a especificação da descrição do problema (o que computar – programação declarativa) em vez da especificação dos passos de execução necessários à resolução do problema (como computar – programação procedimental). O Prolog tem esta capacidade porque utiliza um mecanismo de dedução e derivação de factos e regras armazenados numa base de dados. A estrutura de um programa escrito em Prolog é construída através de relações entre entidades, enquanto nas linguagens procedimentais a estrutura é dada em termos de funções. Esta característica, comum nas linguagens de programação lógicas, advém do facto de a Lógica de Primeira Ordem, que serve de base as estas linguagens, descrever relações entre entidades. Como consequência, é possível obter mais do que uma solução possível para cada computação. Assim, o Prolog é considerado uma linguagem nãodeterminística, ao passo que as linguagens procedimentais são determinísticas, pois devolvem apenas uma solução para cada computação. A gestão da memória no Prolog é feita dinamicamente, isto é, não é preciso atribuir espaço para todas as constantes e variáveis no início do programa: o espaço é atribuído à medida das necessidades. Isto permite a criação de objectos grandes, como por exemplo estruturas sintácticas que são essenciais ao processamento da língua natural. Por outro lado, não é possível saber qual a posição de memória onde se encontram guardadas as variáveis, nem associar objectos com endereços de memória fixos, ao contrário do que acontece nas linguagens de programação tradicionais (C, Pascal, etc.). Nestas, o acesso à memória é feito através de apontadores, que são posições de memória que guardam endereços de outras posições. O algoritmo de pesquisa build-in no Prolog utiliza uma estratégia descendente e em profundidade e permite encontrar todas as soluções possíveis para um dado problema através do retrocesso (backtracking). O retrocesso permitem uma fácil integração com todos os tipos de parsers. Por outro lado, o mecanismo de unificação possibilita a construção de estruturas de dados passo a passo. Os programas escritos em forma lógica permitem a utilização de métodos de programação muito abstractos. Como linguagem de alto nível, o Prolog é uma ferramenta bastante interessante para o desenvolvimento de aplicações na área da Inteligência Artificial (especialmente processamento de língua natural e áreas Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 33 INQUER – Interacção Pessoa – Máquina em Linguagem Natural similares), uma vez que a programação nesta área requer, por parte de uma linguagem, capacidades de processamento simbólico, processos de inferência, tipos de dados interactivos e uma flexibilidade geral. 34 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Escolha do Parser 7. Escolha do Parser Para analisar e representar a estrutura sintáctica e semântica de uma frase é necessário considerar: a gramática, que descreve formalmente as estruturas bem formadas numa língua. o algoritmo de parsing, que define a estratégia de análise de acordo com a gramática. Este capítulo descreve brevemente as estratégias de análise dos dados, justificando a escolha do parser para a implementação no sistema INQUER. 7.1 ESTRATÉGIAS DE ANÁLISE Existem três dimensões nas estratégias de análise dos dados. A primeira dessas dimensões diz respeito à forma como se processa o método de pesquisa relativamente às regras da gramática: se o algoritmo começa pelos nós folha a estratégia designa-se de ascendente, se começa no símbolo topo da gramática designa-se de descendente. A estratégia descendente é considerada um procedimento “ guiado pela expectativa” (“ expectation driven” ) uma vez que os símbolos deduzidos através das regras da gramática são apenas hipóteses de símbolos que podem estar presentes na frase de input. A estratégia ascendente é considerada um processo “ guiado pelos dados” uma vez que, ao contrário da estratégia descendente, apenas os símbolos que se encontram na frase de input são aplicados a regras da gramática. A segunda dimensão das estratégias de parsing diz respeito à forma como se faz a pesquisa no espaço de procura e divide-se em profundidade e largura. A primeira explora as possibilidades de resolução do símbolo encontrado mais à esquerda (ou à direita) no passo de resolução, até chegar a um símbolo terminal (na estratégia descendente) ou ao símbolo da categoria topo (na estratégia ascendente). A pesquisa em largura processa todos os símbolos à medida que os vai encontrando e deduzindo. Como consequência, o espaço de pesquisa é percorrido paralelamente, ou seja, em largura. A última dimensão de estratégias diz respeito à forma como se processa o input: da direita para a esquerda (da posição n para a 1) ou da esquerda para a direita (da posição 1 para a n). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 35 INQUER – Interacção Pessoa – Máquina em Liguagem Natural 7.2 PARSER ESCOLHIDO Analisar uma expressão linguística é determinar, através de um processo algorítmico, se esta é gerada por uma dada gramática. Em caso afirmativo proceder-se-á à representação associada a essa gramática. Este algoritmo é designado por parser. As estratégias de análise descritas acima podem ser combinadas para a procura no espaço de soluções nestes algoritmos. Algumas combinações de estratégias são mais eficientes do que outras dependendo de vários factores, dos quais se destaca, pela sua importância, a gramática. Neste sistema descreve-se uma gramática muito complexa, o que significa que o processamento sintáctico fará muitos retrocessos. Para uma escolha fundamentada do parser, realizaram-se vários testes utilizando diversos algoritmos. Como resultado da pesquisa efectuada sobre este tema, seleccionaram-se os parsers que se julgam mais eficientes tendo em conta a natureza da gramática utilizada no sistema INQUER: left-corner, shift-reduce e tabular ascendente4. O parser Earley, embora seja muito eficiente do ponto de vista da rapidez/complexidade (consegue prestações melhores que um parser tabular simples para um valor de n elevado), para um valor de n baixo (como é o caso da maioria das frases de uma língua natural), este parser apresenta piores resultados do que um parser tabular. Por esta razão, não foi testado e avaliado conjuntamente com os parsers referidos anteriormente. Os parsers left-corner, shift-reduce e tabular ascendente5 foram implementados e testados sobre uma gramática de teste (semelhante, do ponto de vista sintáctico, à gramática a utilizar no sistema – Anexo 1). As implementações dos parsers foram adaptadas de Meurers (2001, pp. 69-70) no caso do Left-Corner e do Shift-Reduce e de Gazdar & Mellish (1989) no caso do tabular ascendente. Os testes foram efectuados numa máquina com processador AMD K6 400 MHz, 158 Mb de memória RAM e utilizando o compilador SWI-Prolog (versão 5.0.9). 4 Para um estudo mais aprofundado sobre parsers consultar, por exemplo, Covington (1993) ou Gazdar & Mellish (1989). 5 A escolha de uma estratégia ascendente para o parser tabular prende-se com o facto de a estratégia descendente ter o problema da recursividade à esquerda, o que inviabiliza a sua utilização na gramática de teste. 36 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Escolha do Parser As frases-teste foram escolhidas de forma a incluírem ambiguidades lexicais e fenómenos linguísticos representativos dos vários níveis de complexidade: 1) O gato tem patas ?; 2) A aranha tem patas ?; 3) A pata é um animal ?; 4) O borrego é um mamífero ?; 5) Os animais que são carnívoros comem carne ?; 6) As plantas que têm tronco são árvores ?; 7) As patas do gato são membros ?; 8) Os membros do gato são patas ?; 9) O bolo que tem ovos da galinha é de fruta ?; 10) O bolo que tem ovos que são da galinha é de fruta ?; Estas frases foram testadas 6 vezes para cada parser, sendo a média dos resultados obtidos apresentados na tabela seguinte. Estes resultados levam em conta todas as interpretações sintácticas possíveis da frase segundo a gramática implementada. Frase-Teste Left-Corner (seg) Shift-Reduce (seg) Tabular ascendente (seg) 1) 0.025 0.02 0.085 2) 0.025 06 0.055 3) 0.275 0.48 0.055 4) 0.25 0.28 0.08 5) 0.525 0.19 0.11 6) 1.02 0.44 0.085 7) 3.76 3.18 0.11 8) 1.07 0.69 0.11 9) 32.48 13.05 0.14 10) 136.52 54.65 0.165 Quadro 2 – Tempo da análise das frases Observando o quadro 2 podemos verificar que ocorreram variações expressivas no tempo de análise das frases testadas, dependendo do parser utilizado. 6 O método statisctics/2 build-in do Prolog, que foi utilizado para as medições apresentadas, arredonda os valores muito próximos de 0. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 37 INQUER – Interacção Pessoa – Máquina em Liguagem Natural O parser Left-Corner apresenta resultados bastante satisfatórios para as primeiras quatro frases, sendo os resultados seguintes francamente maus e, no caso das últimas frases, proibitivos. O tempo de análise aumenta bastante em relação à complexidade da frase. O parser Shift-Reduce apresentou tempos razoáveis na análise das primeiras cinco frases mas, embora o tempo de análise das restantes frases tenha melhorado significativamente em relação ao Left-Corner, apresenta ainda tempos bastante insatisfatórios. No caso das últimas duas frases o tempo de análise é ainda inaceitável. Este parser, tal como o anterior, revela um aumento considerável no tempo de processamento de uma frase em relação à sua complexidade. O parser tabular ascendente, tal como prevíamos, foi o que apresentou melhores resultados. Isto deve-se ao facto de este parser utilizar uma estratégia de pesquisa em largura em vez de em profundidade, contrariamente aos outros dois. Uma vez que a gramática a implementar obriga a muitos retrocessos, este parser apresenta-se como a melhor solução. Note-se que, ao contrário dos dois parsers anteriores, este parser apresenta um aumento ligeiro do tempo de análise em relação à complexidade da frase. Assim sendo, apresenta valores um pouco mais elevados no processamento das primeiras duas frases, mas melhora significativamente o tempo de análise das frases mais complexas. Por estas razões, o parser escolhido para este sistema foi o parser tabular ascendente. 38 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Formalismos Sintáctico e Semântico 8. Formalismos Sintáctico e Semântico Para a construção de uma gramática capaz de descrever fenómenos linguísticos, é necessária a utilização de formalismos de modelização. Neste capítulo descrevem-se os formalismos sintáctico e semântico adoptados neste sistema, assim como a motivação para a opção tomada. 8.1 FORMALISMO SINTÁCTICO Existem vários formalismos gramaticais utilizados na definição de gramáticas em sistemas de processamento de língua natural. Para este sistema, consideraram-se dois (seleccionados pela sua ampla utilização em sistemas do género), que foram objecto de estudo mais aprofundado: a gramática de cláusulas definidas (DCG – Definitive Clause Grammar) e a gramática de estruturas sintagmáticas determinadas pelos núcleos7 (HPSG – Head-Driven Phrase Structure Grammar). 8.1.1 GRAMÁTICA DE CLÁUSULAS DEFINIDAS As gramáticas de cláusulas definidas são gramáticas que tradicionalmente se enquadram no grupo de gramáticas baseadas em regras (Rule-Based Grammars), contrastando com as gramáticas baseadas em princípios (Principle-Based Grammars)como a HPSG. Nas gramáticas baseadas em regras, como o nome indica, são as regras que descrevem os constituintes gramaticais. Para cada constituinte tem de existir pelo menos uma regra na gramática. As DCGs foram construídas para descrever as linguagens aceites pelas gramáticas independentes do contexto (Chomsky). No entanto, são um formalismo mais poderoso do que as gramáticas independentes do contexto na medida em que permitem a expressão de algumas características sensíveis ao contexto, como por exemplo os atributos. As DCGs permitem a descrição de um relativamente grande número de gramáticas complexas (como é o caso das línguas naturais) de forma simples. Para além disso, constituem um formalismo altamente restritivo e bem delimitado, que possibilita um alto nível de computabilidade. Este formalismo é directamente implementável na linguagem de programação escolhida (Prolog), beneficiando de todas as suas vantagens, como por exemplo a unificação de variáveis. 7 Tradução proposta para o português em BRANCO (2000) pp 12. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 39 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Contudo, como utilizam o algoritmo de parsing build-in do Prolog (Capitulo 5), entram muito facilmente em ciclos infinitos quando as cláusulas apresentam recursividade à esquerda. Este formalismo possui um baixo nível de abstracção na medida em que todo o seu funcionamento é explicitado detalhadamente através de regras, sendo as estruturas linguísticas resolvidas de maneira determinística. Torna-se cada vez mais complexo, à medida que se adicionam argumentos às regras. O nível de complexidade é directamente proporcional ao tamanho e ao nível de dependência contextual entre os constituintes da gramática. O formalismo das DCGs foi desenvolvido com vista a facilitar a implementação de aplicações na área da linguística computacional Não se trata, contudo, de um modelo de representação do conhecimento linguístico. 8.1.2 GRAMÁTICAS DE ESTRUTURAS SINTAGMÁTICAS DETERMINADAS PELOS NÚCLEOS As gramáticas de estruturas sintagmáticas determinadas pelos núcleos (HPSG), foram desenvolvidas a partir de meados dos anos 80 por Carl Pollard e Ivan Sag. Este formalismo foi influenciado pela Gramática de Estrutura Sintagmática Generalizada (GPSG – Generalized Phrase Grammar), pela Gramática Léxico-Funcional (LFG – Lexical Funcional Grammar) e pela Teoria da Regência e da Ligação (GB – Government and Binding). É, neste momento, um dos formalismos mais utilizados no âmbito da Linguística Computacional. A HPSG utiliza um formalismo matemático baseado em atributos lógicos de tipo recursivo e em restrições relacionais, que pretende descrever generalizações particulares e universais das línguas. Para além disso, pode ser formalizada do ponto de vista computacional o que lhe confere a possibilidade de ser utilizada em processamento de língua natural. Contém entradas lexicais muito ricas em informação sintáctica e semântica, e meta-regras sintagmáticas que, juntamente com alguns princípios, regem a formação das estruturas linguísticas. Estas meta-regras, baseadas nas regras ID e LP da GPSG, são altamente abstractas, o que confere à HPSG um elevado poder de abstracção. Por outro lado, essa abstracção faz com que as suas entradas lexicais sejam muito estruturadas. 40 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Formalismos Sintáctico e Semântico 8.1.3 FORMALISMO SINTÁCTICO ADOPTADO No sistema INQUER utiliza-se um formalismo sintáctico baseado na HPSG – utilizando as suas vantagens face a formalismos baseados em regras – mas muito simplificado. Procurou-se manter um equilíbrio entre a simplicidade e o alto nível de abstracção, para que a gramática não se tornasse demasiado complexa. Para isso utiliza-se a ideia de considerar listas de subcategorização da HPSG (ver Capítulo 11). As entradas lexicais são muito simples pelo que contêm apenas parte da informação necessária ao processamento sintáctico e semântico (ver Capítulo 10). A informação complementar é posteriormente acrescentada através de meta-regras que sobre elas operam. Desta forma é possível simplificar as entradas lexicais e automatizar o processo de complementação da informação. As regras sintagmáticas utilizadas são baseadas nas regras sintagmáticas da HPSG de modo a captarem generalizações importantes, mantendo um alto nível de abstracção. Por consequência, o formalismo escolhido permite o tratamento de vários fenómenos linguísticos numa mesma regra. Para além de regras sintagmáticas e meta-entradas lexicais, este formalismo contempla regras lexicais que auxiliam a generalização de certos fenómenos linguísticos. Estas regras lexicais permitem a redução de metaentradas lexicais melhorando a eficiência do sistema. 8.2 FORMALISMO SEMÂNTICO No módulo I do sistema INQUER são analisadas frases interrogativas em língua natural, dada pelo utilizador, e construída uma representação semântica com um formato que facilita o seu processamento posterior. Para isso é necessário implementar um formalismo semântico que, a partir da estrutura sintáctica, construa essa representação. Este capítulo descreve brevemente o formalismo semântico escolhido para a implementação neste sistema. 8.2.1 LÓGICA DE PRIMEIRA ORDEM Para a implementação de um formalismo semântico é necessário utilizar uma linguagem artificial para facilitar a computação e a desambiguação de interpretações eventualmente ambíguas. Esta linguagem terá então de ter, por um lado, uma sintaxe própria, bem definida e coerente, que não dê lugar a ambiguidades, Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 41 INQUER – Interacção Pessoa – Máquina em Liguagem Natural e por outro, ser suficientemente expressiva para poder representar todos os tipos de frases e fenómenos linguísticos. Para a representação do significado, neste projecto, foi escolhido um formalismo lógico. Uma Forma Lógica consiste numa fórmula escrita numa metalinguagem que expressa, de forma económica, o significado de uma frase. A Lógica de Primeira Ordem (LPO) utiliza alguns símbolos para construir uma Forma Lógica. Esses símbolos, juntamente com um conjunto ilimitado de variáveis (x, y, z,...), constituem o vocabulário reservado da LPO. Na tabela abaixo estão representados os símbolos lógicos utilizados neste sistema e a representação utilizada na sua implementação (operadores definidos para a representação em Prolog). Símbolos Operadores Lógicos Prolog ¬ ~ Negação ∧ & Conjunção → > Implicação ∃ exi Quantificador existencial ∀ univ Quantificador universal Descrição Quadro 3 – Correspondência entre símbolos LPO e operadores definidos para a representação em Prolog 8.2.2 IMPLEMENTAÇÃO DO FORMALISMO ESCOLHIDO Existem vários métodos para automatizar o processo de associação da representação semântica à expressão em linguagem natural, de entre os quais se escolheu o que utiliza as vantagens da associação do Cálculo Lambda à LPO. No desenvolvimento deste sistema adaptaram-se e utilizaram-se algumas das funcionalidades do Cálculo Lambda, tais como Abstracções-λ, Aplicações Funcionais e Reduções-β. Utilizam-se termos lambda para ligar variáveis abstraídas usando um operador lambda -λ. Este operador marca o sítio onde se devem substituir variáveis ao longo da construção semântica. A operação que realiza essas substituições denomina-se redução-β. 42 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Formalismos Sintáctico e Semântico A codificação da semântica na linguagem de programação escolhida (Prolog) passa pela: (i) codificação das formas lógicas em Prolog; (ii) associação de uma expressão lambda a cada constituinte e implementação do processo de redução-β. (i) codificar as formas lógicas em Prolog: Utilizando o formalismo sintáctico escolhido, as expressões em LPO corresponderão aos termos do Prolog. A representação semântica dos quantificadores tem um papel fulcral na representação semântica da frase: estabelecem relações entre constituintes. A representação dos quantificadores pode ser feita da seguinte maneira: Quantificador Existencial: Forma em LPO: ∃x (P∧Q) Representação em Prolog: d(Exi, X, P & Q) Tipicamente, P é entendido como a representação semântica do SN e Q como a do SV. X representa a variável quantificada e Exi um quantificador existencial: “ um” , “ algum” e “ exi” 8 neste sistema. Quantificador Universal: Forma em LPO: ∀x (R → A) Representação em Prolog: d(Uni, X, R → A) Neste caso, o quantificador estabelece uma relação de antecedente-consequente entre R (tipicamente o SN) e A (tipicamente o SV). Por esta razão dá-se o nome de Restrictor a R e Âmbito a A. O X representa a variável quantificada universalmente e Uni o quantificador universal: “ todo” e “ o” 9 neste sistema. 8 Como será explicítado no capítulo 6 – Meta-entrada para expressões nominais com complemento e sem especificador –, este quantificador existencial serve, no sistema INQUER, para tratar casos onde não é explícita a presença de um quantificador. Por exemplo: 1) Um pastor alemão é hipónimo de “ cão” ? Neste caso, nome “ hipónimo” não tem qualquer quantificador explícito o que impediria a utilização de um formalismo semântico deste género. 9 Note-se que no sistema INQUER o determinante “ o” só pode ter uma interpretação de espécie e não de espécime (interpretação deíctica). Por exemplo: Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 43 INQUER – Interacção Pessoa – Máquina em Liguagem Natural (ii) implementação do processo de redução-β Neste sistema, a implementação do processo de redução-β faz-se utilizando a unificação de variáveis do Prolog e é baseada em Pereira e Shieber (1987). Desta forma, beneficia-se do método de unificação da linguagem de programação tornando o processo eficiente e rápido. É usado também o operador/infixo ‘^’ (definido como um operador Prolog reservado) para simular a função do ‘λ.’ no cálculo lambda. Assim uma função do tipo λX.φ – onde X é a variável que marca o argumento da função e φ é a expressão que define o valor da função – é representada em Prolog por X^φ. O operador/infixo ‘^’ é associativo à direita, o que significa que X^Y^formula é equivalente a X^(Y^formula). Por exemplo, a representação semântica dos determinantes “ todos” e “ um” terá o formato seguinte, onde P e Q representam o SN e SV e R e A o restrictor e âmbito: Formula em Cálculo Lamba Representação semântica no sistema λr. λa.(∀x) r(x) →a(x) (X^R)^(X^A)^d(todos,Num,X,R>A) λr.λa.(∃x) r(x) ∧ a(x) (X^R)^(X^A)^d(um,Num,X,P&Q) Quadro 4 – Representação semântica de quantificadores Neste sistema o quantificador tem um papel de predicador nuclear, ou seja, recebe toda a representação semântica da frase ficando a representação semântica do SN em P e R respectivamente e a do SV em Q e A da representação semântica do quantificador. Considere-se um exemplo da construção da representação semântica da frase “ alguns felinos miam” utilizando esta implementação: alguns –(X^P)^(X^Q)^d(algum,plu,X,P & Q) felinos – Y^felino(Y) miam – Z^miar(Z) alguns felinos – (X^A)^d(algum,plu,X,felino(X) & A) 2) O gato é um felino? 3) O gato da vizinha é branco? No primeiro exemplo, está a ser questionada uma propriedade sobre a espécie “ gato” e não sobre um gato em particular. Neste caso a interpretação semântica da frase é idêntica à da frase “ Todos os gatos miam?” . No segundo caso, o determinante “ o” tem valor existencial estando a ser questionada uma propriedade de um espécime de “ gato” . No sistema INQUER, esta interpretação não é passível de ser respondida e, por essa razão, não é considerada. Para simplificar, optou-se, neste sistema, por considerar o determinante “ o” como quantificador universal. 44 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Formalismos Sintáctico e Semântico alguns felinos miam - d(algum,plu,X,felino(X) & miar(X)) Esta implementação do processo de redução-β tem alguns problemas no que toca à construção de representações semânticas de sintagmas coordenados. Nestes casos, a representação semântica do SN do determinante tem de instanciar com várias variáveis simultaneamente. Tomemos como exemplo a frase “ um gato e um cão são animais ” . um gato – (X^Q)^d(um,sing,X,gato(X) & Q) um cão – (Y^Q1)^d(um,sing,Y,cão(Y) & Q1) animais – (Z^Q2)^d(exi,plu,Z,animal(Z) & Q2) são – W^T^ser(T,W) um gato e um cão – (X^Q)^(Y^Q1)^d(um,sing,X,gato(X)&Q) & d(um,sing,Y,cão(Y)&Q1) são animais – T^d(exi,plu,Z,animal(Z) & ser(T,Z)) um gato e um cão são animais - (Y^Q1)^d(um,sing,X,gato(X)& d(exi,plu,Z,animal(Z) & ser(X,Z))) & d(um,sing,Y,cão(Y)&Q1) Esta representação semântica contém variáveis por instanciar (Y^Q1). Estas variáveis deviam instanciar com a representação semântica do SV “ são animais” . Contudo, utilizando apenas a instanciação de variáveis, não é possível resolver este problema. A solução passa pela implementação de um predicado auxiliar (substitute/4) de Sterling e Shapiro (1986) que recebe um termo, uma variável e uma fórmula devolvendo o resultado da substituição da variável pelo termo na fórmula. substitute(+Term,+Var,+Formula,-Result). Desta forma é resolvido o problema acima descrito. Todavia não soluciona casos em que se coordenam múltiplos sintagmas. Para resolver esse problema é adoptada a solução de Blackburn e Bos (1999) que implementa a redução-β através de predicados auxiliares (subs/3, coord_sn/3 e coord_sx/3 – ver Capítulo 11 - Regra Sintagmática 6). Este mecanismo de redução-β é utilizado apenas nas coordenações sendo, nos outros casos, utilizada a instanciação de variáveis Prolog. A razão desta escolha prende-se com o facto de a instanciação de variáveis Prolog ser mais rápida e eficiente. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 45 Tipo de Perguntas 9. Tipos de Perguntas 9.1 QUESTIONÁRIO Com o objectivo de fazer um levantamento das questões que um potencial utilizador colocaria ao sistema, foi construído um pequeno questionário em formato de página HTML (Anexo 2) e enviado por e-mail a diversas pessoas para que respondessem colocando questões. Nesse questionário era explicado brevemente o objectivo do sistema INQUER e do questionário, pedindo ao utilizador que imaginasse um sistema capaz de responder a todo o tipo de perguntas dentro de certos domínios. Esses domínios (comida, alimentação e seres vivos), sobre os quais deveriam incidir as perguntas, assim como alguns exemplos de perguntas típicas que se poderiam colocar ao sistema, foram introduzidos no conteúdo da página. De seguida era apresentada uma caixa de texto onde o utilizador deveria colocar as perguntas a efectuar ao sistema, carregando em seguida no botão submit que reencaminhava as respostas para o endereço da estagiária. As pessoas que responderam a este questionário têm idades compreendidas entre os 13 e os 55 anos, ou seja, são potenciais utilizadores deste sistema. 9.2 RESULTADOS OBTIDOS Foram recebidas 124 frases interrogativas – transcritas no Anexo 3 – que foram repartidas por seis grupos10: frases interrogativas que solicitam uma definição (21), totais (polares e de alternativa) (31), parciais sobre argumentos (54), parciais sobre especificadores (14), sobre adjuntos causais (3) e que envolvem comparação (1). São exemplos de frases destes tipos: - que solicitam uma definição – “ O que é uma batata?” - totais (polares e de alternativa) – “ O gato é um mamífero?” - parciais sobre argumentos – “ Quais são os animais que têm barbatanas?” - parciais sobre especificadores – “ Quantas patas tem um pato?” - sobre adjuntos causais – “ Por que é que os caranguejos andam de lado?” - que envolvem comparação – “ O que têm em comum o gato e o cão?” 10 Não se utilizam as classificações canónicas, dado que em alguns casos é necessário explicitar a natureza do conteúdo ou dos processos envolvidos na construção da resposta. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 47 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Estas frases apresentam os seguintes formatos: • no grupo que solicitam uma definição, surgem expressões que se iniciam por: “ O que é o...” (2/21); “ O que é um...” (16/21); “ O que é...” (3/21). • No grupo totais (polares e de alternativa), as estruturas que surgem são: Totais simples: “ SN é SN?” (15/31); “ Há / Existe N Adj ?” (3/31); “ SN V ?” (6/31); “ SN tem SN?” (3/31); “ SN V SN?” (1/31); “ É verdade que...” (1/31); Alternativa: “ SN é SN ou SN” (2/31); • No grupo parciais sobre argumentos, as expressões que surgem são: “ Que...?” (15/54); “ Como...?” (1/54); “ Qual é... / Quais são...?” (6/54); “ Qual o...?” (14/54); “ Qual das...?” (1/54); “ Em que...?” (4/54); “ De onde...?” (1/54); “ De que...?” (5/54); “ O que...?” (6/54); Outras (1/54); • No grupo parciais sobre especificadores, as expressões que surgem são: “ Quantos ... há/existem?” (7/14); “ Quantos SN tem SN?” (4/14); “ Quantos SN V SN?” (2/14); Outras (1/54); • No grupo sobre adjuntos causais, as expressões que surgem são: “ Porque...?” (1/3); “ Como...?” (2/3); • No grupo que envolvem comparação, a expressão que surge é: “ ...ter em comum SN e SN?” (1/1); A partir destas respostas obteve-se um pequeno corpus de perguntas (Anexo 3), objecto de referência no desenvolvimento de diversas fases do trabalho. 9.3 TRATAMENTO DOS RESULTADOS Tratando-se de um estágio de 6 meses e de uma primeira fase de um projecto de grande dimensão, não é possível tratar todos os tipos de perguntas colocados pelos potenciais utilizadores. Foi, por esta razão, necessária alguma selecção das perguntas recebidas assim como uma análise e escolha dos tipos de perguntas a implementar numa primeira fase do desenvolvimento do projecto. Das perguntas recebidas, 35 foram eliminadas do grupo de estruturas interrogativas que seriam implementadas por contemplarem adjectivos. Como a WordNet.PT (que está a ser utilizada como fonte para a nossa base de dados lexical) ainda não possui informação suficiente sobre adjectivos e a sua 48 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Tipo de Perguntas inserção estava fora do âmbito deste trabalho, todas as estruturas interrogativas deste tipo foram ignoradas. Um exemplo deste tipo de perguntas é: 1) Qual é a ave de rapina mais pesada do mundo? Das restantes questões, 33 não foram consideradas para a implementação por solicitarem informação sobre a qual a WordNet.PT ainda não tem conhecimento suficiente. Estas estruturas foram ignoradas nesta fase do desenvolvimento do sistema porque ainda que fossem analisadas correctamente no módulo I, no II (inferência) não poderiam obter qualquer tipo de resposta, tornando-se inúteis do ponto de vista global do sistema. Um exemplo deste tipo de perguntas é: 2) Em que época do ano devem ser plantadas as camélias? Das 56 frases restantes do corpus, uma não tem uma resposta objectiva (“ Quantos cães tem uma matilha?” ), tendo, por esta razão, sido ignorada. Das restantes perguntas três contêm inversões de sujeito. Embora este tipo de estruturas seja muito produtivo no Português, nos dados recolhidos foram estruturas muito pouco utilizadas. Por esta razão a sua implementação será feita numa fase posterior. Um exemplo deste tipo de estruturas é: “De que é composto o chucrute?”. Procede-se assim à implementação de um sistema capaz de analisar e representar semanticamente 52 das 124 perguntas recolhidas. Estas perguntas incluem estruturas muito variadas, tais como interrogativas totais e interrogativas parciais com pronomes interrogativos e constituintes deslocados na frase. Para além das estruturas encontradas nestas perguntas são implementadas mais algumas consideradas importantes. Entre estas destaca-se a implementação de estruturas de adjunção (orações relativas e sintagmas preposicionais). Note-se que a inclusão de regras sintagmáticas capazes de analisar estruturas de adjunção facilitará o trabalho de fases posteriores relativamente aos sintagmas adjectivais. Outro tipo de estruturas implementadas nesta fase são as coordenações. Embora não se tivessem registado ocorrências de perguntas deste tipo no corpus recolhido, considera-se que este tipo de estruturas é muito produtivo em sistemas deste género. As disjunções, que não serão alvo de implementação nesta fase do projecto, poderão ser facilmente implementadas utilizando a mesma estratégia das coordenações. Verificou-se também, ao analisar as respostas ao questionário, a necessidade de introduzir algumas palavras no léxico que não constam na WordNet.PT. É o caso de todas as palavras funcionais, de pronomes interrogativos e de alguns verbos e expressões nominais não incluídos nos domínios escolhidos como “ ser” ou “ ter” e “ raça” . Este assunto será abordado em pormenor no capítulo seguinte. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 49 Base de Dados Lexical 10. Base de Dados Lexical Para que o sistema analise frases em língua natural é necessária uma Base de Dados Lexical que permita o reconhecimento das palavras que compõem a frase. Essa base de dados é constituída por entradas lexicais retiradas da WordNet.PT (expressões nominais e algumas expressões verbais)11 e por entradas lexicais que não constam da WordNet.PT. São exemplos: verbos como “ ser” ou “ ter” , nomes que seleccionam complemento como “ hipónimo” , determinantes, conjunções, preposições e pronomes relativos e interrogativos. No anexo 4 apresenta-se um excerto da base de dados lexical. Cada entrada lexical corresponde a uma regra que integra a categoria a que a expressão pertence, a sua forma semântica e os traços semânticos e morfológicos que a caracterizam, quando pertinentes. Por exemplo: n(’fruta’,[num:sing,gen:fem,cont:s,abst:n,anim:n,ser_vivo:n,hum:n,mass:s])---> [fruta]. A obtenção das expressões da WordNet.PT iniciou-se com a extracção de toda informação desejada (limitada aos domínios “ seres vivos” , “ alimentos” e “ comida” ) para ficheiros de texto (.txt). A informação contida nesses ficheiros não facilitava a consulta directa pela linguagem de programação escolhida (Prolog). Embora fosse possível formatar a informação com o Prolog, a pesquisa não seria tão eficiente como se esta estivesse modelada em factos. O programa Detonador, desenvolvido por Rui Chaves, permite a transformação destes ficheiros em ficheiros de factos Prolog. Estes factos evidenciam todas as relações entre os conceitos dos diversos domínios considerados, podendo ser utilizados como uma Base de Dados Relacional. Os ficheiros obtidos pelo Detonador foram ainda alvo de tratamento com vista a agrupar e ordenar relações e retirar informação duplicada. Os ficheiros resultantes deste tratamento constituem a Base de Dados Relacional que representa a estrutura da WordNet.PT. Por exemplo, a informação de que “ gato” é “ hipónimo de felino” e que os “ felinos” têm “ patas” é representada na Base de Dados Relacional através dos seguintes factos Prolog: has_hyponym(felino,gato). has_mero_part(felino,pata). 11 Utiliza-se a designação expressão nominal/verbal em lugar de nome/verbo para referir elementos lexicais, uma vez que estes podem não ser lexicalizações atómicas. São exemplos de lexicalizações não atómicas “ queijo fresco” /“ ser feito de” e de lexicalizações atómicas “ queijo” /“ ser” . Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 51 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Posteriormente, através de comandos Prolog e das relações pos(n,Nome) e pos(v,Verbo) presentes na Base de Dados Relacional, foram extraídas as expressões (Nome e Verbo) que compõem grande parte da Base de Dados Lexical. As expressões retiradas desta forma foram posteriormente alvo de tratamento, nomeadamente na inserção manual das categorias nominais, da forma semântica, dos traços específicos de cada entrada e das formas plurais e femininas correspondentes. Por exemplo, para a expressão “ gato” retirada da WordNet.PT através dos processos já descritos, toda a informação a negrito foi introduzida manualmente: n(gato, [num:sing,gen:mas]) ---> [gato]. n(gato, [num:plu,gen:mas]) ---> [gatos]. n(gato, [num:sing,gen:fem]) ---> [gata]. n(gato, [num:plu,gen:fem]) ---> [gatas]. Embora existissem no CLUL alguns recursos linguísticos que permitiam a extracção automática de alguma desta informação (nomeadamente dos traços), outra havia que tinha de ser introduzida manualmente. Para uma uniformidade na estruturação da informação optou-se por introduzir tudo manualmente e criar um mecanismo de herança de traços que facilitasse esta inserção (ver secções seguintes). Optou-se também por uma listagem de todas as formas flexionadas dos nomes e de algumas dos verbos (nomeadamente a 3ª Pessoa do Presente do Indicativo), pois o desenvolvimento de um módulo morfológico estava fora do âmbito deste projecto. No anexo 4 encontram-se alguns exemplos de entradas lexicais extraídas da base de dados lexical. 10.1 EXPRESSÕES NOMINAIS SIMPLES Estas expressões são identificadas no léxico por n — categoria nominal. As expressões lexicais deste tipo foram, na sua maioria, extraídas da WordNet.PT. Seguindo a estrutura interna da WordNet.PT, optimiza-se o funcionamento do sistema utilizando um mecanismo de herança de traços, de forma a reduzir a lista de traços por entrada. Cada entrada possui o traço relativo ao seu número, uma vez que a cada expressão correspondem duas entradas lexicais: plural e singular. Os restantes traços são herdados através de um mecanismo de herança em que cada entrada lexical herda os traços dos seus hiperónimos. São herdados apenas os traços não contraditórios da lista de traços da entrada tratando-se por isso de um mecanismo de herança por defeito. 52 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Base de Dados Lexical Este mecanismo é implementado através do predicado heranca_de_tracos/3 que devolve a lista de traços completa de uma dada entrada lexical (Anexo 5). Este predicado utiliza a Base de Dados Relacional para encontrar os hiperónimos ou variantes principais de um dado conceito. Em seguida extrai a lista de traços associada ao hiperónimo do conceito em questão e “ herda” todos os traços sobre os quais não tem qualquer informação. Este predicado é recursivo. Desta forma todos os traços são herdados e se o conceito não tiver hiperónimos é devolvida a própria lista de traços. Por exemplo: Seja “ alimento” o hiperónimo directo de “ fruta” e L1 e L2 as respectivas listas de traços: alimento – L1 : [num:plu, gen:mas, cont:n, abst:n, anim:n, ser_vivo:n, hum:n] fruta – L2: [num:sing, gen:fem, cont:s] Após aplicado o mecanismo de herança, a lista de traços de “ fruta” seria: [num:sing, gen:fem, cont:s, abst:n, anim:n, ser_vivo:n, hum:n] Os pares atributo:valor considerados para as expressões nominais simples são: Atributo num gen cont abst anim ser_vivo hum mass Valor Descrição sing (singular) número: traço morfológico que indica o número plu (plural) gramatical fem (feminino) género: traço morfológico que indica o género mas (masculino) gramatical s (sim) contável: traço booleano semântico que indica se o n (não) conceito refere algo que se pode enumerar s (sim) abstracto: traço booleano semântico que indica se n (não) o conceito refere algo material s (sim) animado: traço booleano semântico que indica se o n (não) conceito refere algo dotado de vida ou movimento s (sim) ser vivo: traço booleano semântico que indica se o n (não) conceito refere um organismo s (sim) humano: traço booleano semântico que indica se o n (não) conceito refere algo com características humanas s (sim) massivo: traço booleano semântico que indica se o n (não) conceito refere algo que não é enumerável12 Quadro 5 – Traços das expressões nominais simples 12 Este traço é redundante relativamente ao traço cont mas é necessário para dar conta de conceitos que são massivos e contáveis como se refere mais à frente no texto Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 53 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Os traços apresentados foram escolhidos pela sua capacidade de restringir tipos de conceitos com propriedades semânticas e sintácticas distintas. Os traços num e gen servem para detectar estruturas sintácticas com erros de concordância. Os restantes traços serve para restringir a ocorrência de certas expressões com alguns verbos, como por exemplo a possibilidade de expressões nominais massivas poderem ocorrer sem determinante a seguir a um verbo. Dos traços apresentados na tabela vale a pena referir que embora um dado conceito não possa ser simultaneamente contável e massivo, algumas das entradas lexicais contém informação afirmativa para ambos os atributos. Isto deve-se ao facto de algumas expressões serem lexicalmente ambíguas entre conceitos massivos e contáveis. Por exemplo, “ queijo” é ambíguo entre o alimento queijo que se pode contar (1) e a substância (2): 1) Quantos queijos estão em cima da mesa? 2) Esta sandes é de queijo? Este problema seria resolvido se o sistema utilizasse todo o conhecimento disponível na WordNet.PT, uma vez que as expressões ambíguas que denotam conceitos diferentes se encontram identificadas por um índice. Numa fase posterior do projecto este problema poderá ser facilmente corrigido. 10.3 EXPRESSÕES NOMINAIS QUE SELECCIONAM COMPLEMENTO As entradas lexicais de expressões nominais que seleccionam complemento, inseridas manualmente, apresentam a mesma etiqueta que as expressões nominais simples e possuem praticamente os mesmos traços. As expressões nominais que seleccionam complemento não têm, no entanto, o atributo massivo, mas necessitam de um novo traço que informa acerca do complemento que seleccionam: Atributo Valor [comp:[marc:M]] scat (complemento) M=elemento marcador Descrição subcategorização: traço sintáctico que indica que o complemento seleccionado é marcado13 Quadro 6 – Traços das expressões nominais que seleccionam complementos 13 Considera-se como um marcador as preposições que não têm semântica. 54 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Base de Dados Lexical 10.2 EXPRESSÕES VERBAIS Estas expressões são identificadas no léxico por v – categoria verbal. Nem todas as expressões verbais foram extraídas da WordNet.PT dado que, ao analisar o resultado do questionário (Capitulo 9), verificouse serem necessárias outras expressões verbais não pertencentes aos domínios considerados. É o caso de “ ser” e “ ter” . No que respeita ao tempo, as frases a analisar pelo sistema só incluem o tempo gramatical presente, 3ª Pessoa. Assim, as entradas lexicais desta categoria possuem os traços: Atributo Valor sing (singular) num scat plu (plural) [comp:n/p] (complemento) pred (verbo predicativo) tipo_v igual (identidade) imp (verbo impessoal) Descrição número: traço morfológico que indica o número gramatical subcategorização: traço sintáctico que indica, numa lista, a categoria dos complementos seleccionados pelo verbo tipo: traço sintáctico que identifica o verbo “ ser” quando este toma o valor predicativo ou identidade, o verbo “ haver” ou o verbo “ existir” existe(verbo existir) Quadro 7 – Traços das expressões verbais 10.4 OUTRAS EXPRESSÕES Para além das expressões nominais e verbais, houve necessidade de introduzir no léxico outras expressões que não estão presentes na WordNet.PT por pertencerem a classes fechadas. As categorias destas expressões assim como os traços que as caracterizam são apresentados no quadro seguinte: Categoria Traços Exemplos p(preposição) não tem “ de” conj (conjunção) não tem “ e” Observações Os pronomes interrogativos precisam de pi (pronome interrogativo) num:sing/plu gen:mas/fem quant:s “ qual” /” quais” “ quanto” /” quanta” ser classificados quanto ao número e alguns também quanto ao género. O traço quant identifica aqueles que podem ocorrer como quantificadores de SNs Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 55 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Categoria Traços Exemplos pr (pronome relativo) não tem14 “ que” tipo_d:univ/exist “ todo” /“ um” Os determinantes classificam-se, neste det (determinante) neg (part. de negação) marc (marcador) Observações gen:mas/fem “ o” /“ a” sistema, em género, número e num: sing/plu “ o” /“ os” universais ou existenciais. não tem “ não” marcador: M M=elem. marcador “ de” , “ com” Os marcadores são elementos de marcação de SNs As contracções são constituídas por contrac (contracção) não tem “ do” , “ nos” elementos de categoria prep e det aglutinados Quadro 8 – Traços de outras expressões presentes na base de dados lexical 14 Nesta fase de implementação do sistema considera-se apenas o pronome relativo “ que” . 56 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática 11. A gramática As várias fases do módulo de análise das perguntas introduzidas pelo utilizador estão representados no seguinte esquema: Figura 2 – Esquema geral do módulo I Escolhido o formalismo adequado à construção da gramática, feito o tratamento e a extracção do léxico, e analisadas as estruturas linguísticas a contemplar, procedeu-se à construção da gramática propriamente dita. Esta gramática contém meta-entradas lexicais, regras lexicais e regras sintagmáticas que permitem a análise sintáctica e a construção de uma representação semântica de uma pergunta em LN. No anexo 6 encontra-se todo o código de implementação desta gramática. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 57 INQUER – Interacção Pessoa – Máquina em Liguagem Natural 11.1 META-ENTRADAS LEXICAIS Como referimos anteriormente, optou-se pela inclusão de meta-entradas lexicais capazes de tratar as entradas lexicais para que seja adicionada alguma informação necessária à aplicação das regras sintácticas e semânticas. A informação relativa à subcategorização e à semântica é inserida nestas regras. O formato de uma meta-entrada lexical é: spr : LSpr elex(Cat,[traços], comp : LComps ,Representação Semântica) gap : [ ] Figura 3 – Meta-entrada lexical O primeiro elemento (Cat) indica a categoria da expressão linguística a que esta meta-entrada corresponde e o segundo a sua lista de traços. O terceiro argumento desta meta-entrada é a lista de subcategorização da expressão. Esta lista subdivide-se em três listas: • spr indica a natureza do especificador: pode ser do tipo “ determinante” no caso dos nomes ou “ nominal” no caso dos verbos. Note-se que o que é subcategorizado é um sintagma e não uma entrada lexical. • comp indica a natureza dos complementos subcategorizados. Os complementos podem ser de tipo “ nominal” ou do tipo “ preposicional” . • gap indica o elemento que não foi encontrado na sua posição natural mas que pode ser encontrado deslocado na frase. Esta lista está sempre vazia nas meta-entradas lexicais, podendo conter elementos nas regras lexicais que veremos mais adiante. O último argumento da meta-entrada corresponde à sua representação semântica. É apresentado em seguida um exemplo da instanciação da meta-entrada lexical que subsume a entrada lexical de “ gato” que ocorre no sintagma nominal “ o gato” : elex(n,[hum:n,ser_vivo:s,anim:s,abst:n,gen:mas,cont:s,mass:s,num:sing] [spr:[r(det,Ltracos,[],Scat,Sem)], comp:[], gap:[]], X^gato(X)) As meta-entradas são objecto de descrição pormenorizada em seguida. 58 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática 11.1.1 META-ENTRADAS GRAMATICAIS Estas meta-entradas tratam todas as entradas de palavras gramaticais necessárias à construção de frases em Português. Todas estas entradas, que não pertencem ainda à WordNet.PT, foram inseridas manualmente. A selecção das palavras que dão origem às entradas lexicais presentes na base de dados lexical foi feita através da avaliação dos resultados do questionário efectuado (Capítulo 9). Meta-entrada para preposições elex(p,[],[spr : [], comp: [r(n,_,[],[spr:[]|_],_)], gap : []],X^Y^P) ==> p(Palavra,[]) ^[P =..[Palavra,X,Y]]. Esta primeira meta-entrada aplica-se a preposições. Procura as entradas lexicais a que se aplica, através da forma que estas apresentam no léxico [p(Palavra, Traços)]. Neste caso a lista de traços aparece vazia porque as preposições não impõem qualquer tipo de restrições aos seus complementos quanto à concordância. A forma semântica da palavra é também retirada da entrada lexical, através da variável Palavra. Esta variável serve como argumento ao predicado built-in do Prolog “ =..” , de modo a formar um novo predicado. Esse predicado recebe a forma semântica da entrada lexical e duas variáveis formando o predicado palavra(X,Y)15. Desta forma é construída a representação semântica da preposição, que se encontra no último argumento da meta-entrada: X^Y^palavra(X,Y). Esta representação indica que X será instanciada com a variável abstraída mais externa do SN que antecede a preposição e Y com a variável abstraída mais externa do complemento (neste caso um SN). A representação semântica da preposição “ de” seria X^Y^de(X,Y). Por exemplo: 1) O alimento do gato é o peixe? Nesta frase, a variável abstraída mais externa do SN “ o alimento” seria instanciada com a variável Y da representação semântica da preposição, enquanto a variável abstraída mais externa do SN “ o gato” seria instanciada com a variável X. 15 Daqui em diante, palavra (em letra minúscula) constituirá o símbolo do predicado Palavra (com letra maiúscula) correspondente à forma semântica de uma entrada lexical. Exemplo: a forma lógica X^Y^Palavra(X,Y) representa-se em Prolog por X^Y^palavra(X,Y). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 59 INQUER – Interacção Pessoa – Máquina em Liguagem Natural As restrições sobre as entradas lexicais que podem entrar nas meta-entradas estão especificadas dentro da lista ^[] do lado direito da regra. Esta lista, presente em todas as meta-entradas lexicais, contém predicados Prolog que são executados quando a meta-entrada é chamada. Desta forma é possível restringir a classe de palavras que entram em cada meta-entrada, tornando o sistema mais eficiente. Neste caso, a lista encontra-se vazia pois todas as preposições podem ser tratadas por esta regra. No entanto, outras meta-entradas lexicais necessitam dessa lista para restringir o tratamento de algumas expressões (como no caso das expressões nominais que seleccionam complemento e as que não o seleccionam). Meta-entrada para marcadores elex(marc,[],[spr : [], comp: [], gap : []],_) ==> marc(_,_) ^[]. A meta-entrada lexical acima trata os marcadores. Estes elementos servem apenas para marcar SNs para que estes sirvam de complemento a alguns nomes ou verbos que seleccionam complemento. Por esta razão, não exigem complemento nem especificador. Exemplos deste tipo de elementos podem ser encontrados em construções do tipo: 2) O gato é hipónimo de mamífero? 3) Um bolo é feito com ovos? Por simplificação, considerou-se que os marcadores não têm qualquer representação semântica nem exigem qualquer tipo de concordância com os elementos que o antecedem ou precedem. Por esta razão as variáveis relativas aos traços e à forma semântica da entrada são representados por “ _” . A lista de traços da meta entrada lexical é vazia, de forma a unificar com qualquer lista de traços à qual se junte. Meta-entrada para conjunções elex(conj,Ltracos,[spr : [],comp: [], gap : []],_) ==> conj(_,Ltracos) ^[]. Os únicos operadores de conjunção considerados por esta gramática são o “ e” e a “,”, e são ambos tratadas por esta meta entrada. Como se viu anteriormente (Capítulo 10), a lista de traços das preposições contém informação relativa ao tipo de preposição a que correspondem. Esta informação é necessária, numa fase mais avançada do processamento sintáctico, para restringir o tipo de construções coordenadas. Assume-se que às conjunções não se atribui qualquer tipo de representação semântica e que não exigem especificador nem complementos, associando apenas SXs da mesma categoria. Esta assumpção não é 60 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática naturalmente pacífica. Contudo, o que está em causa não é a adequação da descrição linguística, mas sim a eficiência do sistema. Meta-entrada para a negação elex(neg,[],[spr : [],comp: [],gap : []],X^P) ==> neg(_,_) ^[P =..[~,X]]. Nesta meta-entrada é representada a negação (que nesta base de dados lexical é apenas a palavra “ não” ). Uma vez que a negação é um símbolo funcional em lógica de primeira ordem, a representação semântica da entrada lexical “ não” corresponde ao símbolo “ ~” , seguido de uma variável correspondente ao constituinte a negar. Assim, a representação semântica de “ não” será da forma X ^~(X), em que X corresponde à semântica do evento negado. Esta meta-entrada não exige qualquer tipo de especificador ou complemento, nem envolve restrições de concordância com o SV a que se associa. Meta-entrada para determinantes indefinidos elex(det,Ltracos,[spr : [],comp: [],gap : []], (X^P)^(X^Q)^d(Palavra,Num,X,P & Q)) ==> det(Palavra,Ltracos) ^[retira_elemento(Ltracos,tipo:exist,_), extrai(Ltracos,num,Num)]. Na lista de restrições desta regra encontra-se o predicado retira_elemento/3 que recebe uma lista de traços, um par atributo:valor e devolve uma nova lista sem esse par: retira_elemento(+Ltracos, + Atributo:Valor, -LtracosRes ) Neste caso, o predicado retira da lista de traços encontrada no léxico, o atributo tipo que contém informação sobre a subcategoria do determinante em questão (exist indica que é existencial). A lista resultado vai ser utilizada para o processamento sintáctico posterior. Desta forma, todos os determinantes que não possuem o par traço tipo:exist, não são tratados por esta regra restringindo assim a formação de meta-entradas. Para além do predicado retira_elemento/3, a lista ^[] contém o predicado extrai/3, que recebe uma lista de traços e um atributo devolvendo o seu valor nessa lista: extrai(+Lista, +Atributo, -Valor) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 61 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Nesta regra, este predicado serve para retirar o valor do atributo num de forma a preencher o segundo campo da representação semântica do determinante. Esta informação, não sendo necessária ao processamento sintáctico ou semântico posterior (porque a informação quanto ao número é mantida na lista de traços da meta entrada lexical), é necessária para outros módulos do sistema. A representação semântica do determinante, como já foi referido anteriormente (Capítulo 8), recebe as representações semânticas do SV e do N’ que, por composição, resulta na formação da representação semântica da frase. A etiqueta d indica que esta representação está associada a um determinante. O seu subtipo é indicado através da expressão Palavra (que corresponde à forma semântica da entrada lexical). A variável P indica a representação semântica que corresponde, tipicamente, à representação semântica do SV da interrogativa, enquanto a variável Q é instanciada, tipicamente, com a representação semântica do N’ . A variável X é instanciada com a variável abstraída mais externa do SV e do N’ evidenciando que se trata da mesma. O determinante indefinido “ um” terá uma representação semântica do tipo: (X^P)^(X^Q)^ d(um,sing,X,P & Q). Meta-entrada para quantificadores universais elex(det,Ltracos1,[spr : [], comp: [], gap : []], (X^Res)^(X^Amb)^d(Palavra,Num,X,Res>Amb)) ==> det(Palavra,Ltracos) ^[extrai(Ltracos,tipo,univ), extrai(Ltracos,num,Num)]. Os quantificadores universais como “ todos” são tratados nesta meta-entrada. Esta restrição é aplicada através do predicado extrai/3, que limita a aplicação desta regra aos determinantes que contêm na sua lista de traços o par tipo:univ. A representação semântica destes quantificadores é muito semelhante à dos determinantes existenciais. No entanto o operador “ &” é substituído pelo operador “ >” que indica tratar-se de uma implicação. Note-se que, como foi referido no capítulo 8, o determinante “ o” é considerado como um quantificador universal neste sistema. Meta-entrada para pronomes interrogativos elex(n,Ltracos,[spr : [],comp: [],gap : []], (X^Q)^(P *> Q)) ==> pi(Palavra,Ltracos) ^[P =..[Palavra,X]]. 62 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Os pronomes interrogativos apresentam a mesma função sintáctica dos SN. Por esta razão, a sua metaentrada é etiquetada com a categoria n. Desta forma, todo o processamento sintáctico das expressões nominais é também aplicado a estes elementos. Como os exemplos seguintes demonstram, os pronomes interrogativos aparecem como pronomes sem referência nas frases interrogativas: 4) Qual é o hipónimo de “ gato” ? 5) Quantos são os hipónimos de “ gato” ? 6) O que é um gato? Estes pronomes encontram correspondência na resposta da frase interrogativa, sendo este facto reflectido na sua representação semântica. Para facilitar o processamento posterior (nomeadamente na fase de inferência e geração), a representação semântica do pronome interrogativo terá o seguinte formato: palavra(X) *> Semântica_do_SV Nesta representação semântica, a variável X unificará com a resposta à interrogativa introduzida pelo utilizador. Na meta-entrada podemos verificar que essa variável X está co-indexada com a variável abstraída mais externa da representação semântica do SV (Q). Meta-entrada para pronomes interrogativos que podem ocorrer como especificadores elex(det,Ltracos,[spr : [],comp: [],gap : []], (X^Q)^(X^W)^(P *> (Q & W))) ==> pi(Palavra,Ltracos) ^[extrai(Ltracos,quant,s)), P =..[Palavra,X]]. A palavra “ quantos” pode ocorrer em dois tipos de estruturas distintas, como pode ser observado pelos exemplos seguintes: 7) Quantos hipónimos de “ gato” existem? 8) Quantos são os hipónimos de “ gato” ? Estas estruturas parecem indicar que “ quantos” pode ocorrer como quantificador de um N’ ou como pronome. Esta meta-entrada lexical trata do primeiro caso. Embora este elemento ocorra em dois tipos de estruturas sintácticas muito diferentes, a esta base de dados lexical tem apenas uma entrada correspondente ao pronome interrogativo, pois os traços e a forma semântica são idênticos para as duas formas. A restrição da aplicação da meta-entrada a todos os tipos de pronomes interrogativos é feita através do predicado extrai/3 que procura o atributo quant na lista de traços da entrada lexical. Este atributo, Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 63 INQUER – Interacção Pessoa – Máquina em Liguagem Natural como vimos no capítulo 10, indica quais os pronomes interrogativos que podem ser especificadores. Nesta fase do projecto apenas os interrogativos “ quantos” , “ quantas” e “ que” são tratados por esta regra. A meta-entrada gerada apresenta a categoria det (como todos os quantificadores vistos anteriormente), uma vez que pode ocorrer exactamente nos mesmos contextos que os determinantes indefinidos. Como este elemento tem propriedades quantificadoras e pronominais, a sua representação semântica apresenta semelhanças com a representação semântica de um determinante indefinido e com a dos pronomes interrogativos. Meta-entrada para o pronome relativo elex(pr,[],[spr : [],comp: [], gap : []],_) ==> pr(_,[]) ^[]. Nesta meta entrada lexical são tratados os pronomes relativos. Considera-se que estes não possuem qualquer tipo de representação semântica servindo apenas para preencher um gap (lacuna) numa interrogativa. Esse gap pode ter características de especificador (sujeito) ou de complemento, como se ilustra nos exemplos seguintes: 9) Quais são os animaisi que i têm patas? 10) Quais os alimentosi que os gatos comem i? No primeiro exemplo, o pronome relativo satisfaz o especificador do SV “ têm patas” e tem como antecedente o N’ “ animais” . No segundo caso, o pronome satisfaz o complemento do verbo “ comer” e tem como antecedente o N’ “ alimentos” . 11.1.2 META-ENTRADAS LEXICAIS NOMINAIS As meta-entradas lexicais que em seguida se descrevem aplicam-se a todas as entradas lexicais de categoria N. Estas expressões podem seleccionar complemento, como por exemplo “ hipónimo” e “ tipo” , por um lado, e “ gato” e “ queijo fresco” , por outro. 64 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Meta-entrada para expressões nominais com especificador e complemento elex(n, [nom:pred| Ltracos], [spr : [r(det,_,[],[spr:[]|_],_)], comp:[r(n,[marcado:s|_],[],[spr:[],comp:[],gap:[]],_)], gap : []], Y^X^P) ==> n(Palavra, Ltracos) ^[retira_elemento(Ltracos,scat:[comp:[marc:_]],_), P=..[Palavra,Y,X]]. Esta meta-entrada lexical representa os nomes que seleccionam um complemento nominal e um especificador do tipo “ determinante” . Permitindo a construção de estruturas como “ o hipónimo de gato “ . Neste caso, a lista de restrições contém o predicado retira_elemento/3, já referido anteriormente, que restringe a aplicação da regra a entradas lexicais que contenham o traço scat: [comp:[marc:_]]. A razão desta restrição prende-se com o facto de o complemento seleccionado por estas expressões nominais ser marcado, ou seja, conter um elemento do tipo marcador. Esse elemento, como vimos anteriormente, não tem semântica, serve apenas para marcar um SN como complemento de uma expressão nominal. Um exemplo de um complemento de “ hipónimo” é “ de gato” em que o elemento “ de” serve de marcador ao SN “ gato” . Note-se que na lista de traços do complemento pedido pela entrada lexical, é incluído o traço marcado que indica que o complemento tem de ser marcado e que na lista de traços da meta-entrada lexical continua a haver informação sobre qual o elemento que é pedido para o marcar. Como veremos, esta informação impede a construção de estruturas mal formadas. Note-se que à lista de traços da entrada lexical é acrescentado o par nom:compl que indica que se trata de uma expressão nominal que selecciona complementos. A representação semântica deste tipo de expressões é X^Y^palavra(X,Y). Esta representação indica que X será instanciada com a variável abstraída mais externa do especificador (neste caso o sintagma determinante) e Y com a variável abstraída mais externa do complemento (neste caso um sintagma nominal). A representação semântica da palavra “ hipónimo” será X^Y^hipónimo(X,Y). Meta-entrada para expressões nominais com complemento e sem especificador elex(n,[nom:pred|Ltracos], [spr : [], comp: [r(n,[marcado:s|_],[],[spr:[]|_],_)], gap : []], (X^Q)^Y^(d(exi,Num,X,P & Q))) ==> n(Palavra, Ltracos) ^[retira_elemento(Ltracos,scat:[comp:[marc:_]],_), extrai(Ltracos,num,Num), P =..[Palavra,X,Y]]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 65 INQUER – Interacção Pessoa – Máquina em Liguagem Natural A meta-entrada lexical apresentada acima é muito semelhante à descrita anteriormente. No entanto, esta meta-entrada lexical serve para representar expressões nominais que seleccionam complemento e ocorrem sem especificador (por esta razão a lista de spr encontra-se vazia). Um exemplo de expressões representadas por esta regra é “ hipónimo” na pergunta “ “ Mamífero” ” é hipónimo de “gato” ?” . Como consequência de estas entradas lexicais não incluírem um especificador, a sua representação semântica é também diferente da meta entrada anterior. A semântica de uma expressão nominal (N’ ), de acordo com o formalismo semântico escolhido, unifica com o restritor da representação semântica do determinante que selecciona formando a representação semântica do SN. Como estas expressões não exigem especificador a representação semântica não pode ser construída desta forma. Para resolver este problema assumiu-se que existe um determinante existencial omitido neste tipo de estruturas. Esta omissão pode ser justificada em frases do tipo: 11) “ Gato” é hipónimo de “ felino” ? 12) “ Gato” é um hipónimo de “ felino” ? Estas frases parecem demonstrar que, dependendo do pronome interrogativo, a expressão nominal pode exigir ou não a presença de um determinante existencial, não sendo a representação semântica da frase alterada. Por estas razões, foi necessário incluir na representação semântica deste tipo de entradas, a representação semântica de um determinante existencial cujo restritor corresponde à representação semântica da expressão nominal com as respectivas variáveis. Esta representação possui duas variáveis por instanciar: uma para instanciar com a variável abstraída mais externa da representação semântica do SV e com a própria representação do SV (X^Q), e outra para instanciar com a variável abstraída mais externa da representação semântica do SN e com a própria representação semântica do SN (complemento subcategorizado). A entrada lexical de “ hipónimo” , segundo esta regra, terá a seguinte representação semântica: (X^Q)^Y^d(exi,sing,X,hipónimo(X,Y) & Q). Note-se que a representação semântica deste “ quantificador” possui a etiqueta exi, que serve para identificar um determinante omisso. Esta designação vai ser particularmente útil na fase da geração. A entrada lexical de “ hipónimo” tem duas representações semânticas dadas por cada uma das metaentradas referidas anteriormente. Ao ser feito o parsing da frase onde esta palavra se encontra, será escolhida uma das duas representações, dependendo da ocorrência ou não de um determinante que a quantifique. 66 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Meta-entrada para nomes sem complementos elex(n,Ltracos1,[spr : [r(det,_,[],[spr:[]|_],_)], comp: [],gap : []], X^P) ==> n(Palavra,Ltracos) ^[heranca_de_tracos(Palavra,Ltracos,Ltracos1), \+(extrai(Ltracos,scat,[comp:[_]])), (extrai(Ltracos1,mass,s), extrai(Ltracos1,cont,s)); (\+(extrai(Ltracos1,mass,s))), P =..[Palavra,X]]. Esta meta entrada lexical aplica-se a expressões nominais que não integram complemento mas integram determinante. Um exemplo de uma expressão nominal tratada por esta regra é “ gato” na frase “ O gato é um mamífero?” . Como já foi referido anteriormente (Capítulo 10), todas as expressões nominais simples foram retiradas directamente da WordNet.PT e, por esta razão, é necessário aplicar o mecanismo de herança de traços. Esse mecanismo é aplicado através do predicado heranca_de_tracos/3: heranca_de_tracos(+FSem,+Ltracos,-LRes). Este predicado recebe uma representação semântica da expressão, a lista de traços da entrada lexical e devolve uma lista com todos os seus traços herdados da sua cadeia de hiperónimos. O predicado extrai/3 restringe a aplicação desta regra a expressões nominais que seleccionam complemento, exigindo que a entrada lexical não contenha o traço respeitante à sua subcategorização. Para além desta restrição, o predicado extrai/3 obriga a que as expressões nominais sejam massivas e contáveis ou que não sejam massivas. Esta restrição serve para restringir certas interpretações semânticas. Por exemplo: 13) Uma vaca é um animal? O lexema “ vaca” , na base de dados lexical, é ambíguo entre “ animal” e “ carne de vaca” . No entanto, no exemplo 13), “ vaca” só pode ter a interpretação de animal pois a presença de um quantificador obriga a que a expressão nominal não seja massiva. Assim, esta meta-entrada lexical trata estes casos impedindo a construção de representações semânticas incorrectas. A semântica desta entrada lexical é dada pela representação semântica da palavra e a sua associação a uma variável. A semântica destas expressões nominais é X^vaca(X). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 67 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Meta-entrada para nomes sem complementos e sem especificador elex(n,Ltracos1,[spr : [],comp: [],gap : []], (X^Amb)^(d(exi,Num,X,P & Q))) ==> n(Palavra, Ltracos) ^[extrai(Ltracos,num,Num), \+(extrai(Ltracos,scat,[comp:_])), heranca_de_tracos(Palavra,Num,Ltracos1), P =..[Palavra,X]]. Esta meta-entrada lexical trata de expressões nominais simples que não possuem qualquer tipo de especificador como por exemplo: 14) Os hipónimos de gato são animais ? O predicado extrai/3 obriga a que não conste da lista de traços da entrada lexical o atributo scat relativo a complementos, impedindo as expressões nominais que seleccionam complemento de entrarem nesta regra. Como esta regra trata expressões nominais extraídas da WordNet.PT é necessário utilizar o predicado heranca_de_tracos/3 que, como vimos, implementa o mecanismo de herança de traços. Tal como acontece com as expressões nominais com complemento e sem especificador, é necessário acrescentar à representação semântica destas expressões variáveis que sejam instanciadas pela representação semântica do SV, ao longo do processamento semântico. Note-se no entanto, que o restritor do determinante é simplesmente a própria expressão nominal sendo a variável do SV a única por instanciar. Meta-entrada para nomes que representam conceitos da WordNet.PT elex(n,[num:sing],[spr : [],comp: [], gap : []], (X^Q)^d(exi,sing,X,P & Q)) ==> r(ListaASCII) ^[name(Palavra2,ListaASCII), (n(Palavra1,_) ---> [Palavra2]; v(Palavra1,[tempo:inf]) ---> [Palavra2]), P =..[Palavra1,X]]. Para além de todas as expressões nominais e verbais já tratadas pelas meta-entradas lexicais, existem algumas expressões verbais e nominais que parecem corresponder a conceitos da WordNet.PT e não a conceitos per si. Vejamos os seguintes exemplos: 68 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática 15) Qual é o hipónimo de “gato” ? 16) “ cear” é “ comer” ? Neste exemplo “ gato” não se refere ao animal de quatro patas mas sim ao conceito de gato que está representado na WordNet.PT e que se subdivide em vários subtipos (“ gato persa” , “ gato siamês” ). Do mesmo modo, “ cear” e “ comer” referem-se aos conceitos da WordNet.PT e não ao acto em si, sendo por isso utilizados como expressões nominais. Estas expressões nominais não pedem complementos nem especificadores e, por esta razão, necessitam de uma representação semântica semelhante à da meta entrada anterior. Note-se que para as expressões nominais as aspas não são obrigatórias podendo ser tratadas pela metaentrada anterior. Desta forma, utilizadores mais especializados podem utilizar esta notação não obrigando, no entanto, outros tipos de utilizadores a utilizá-la. 11.1.3 META-ENTRADAS LEXICAIS VERBAIS Meta-entrada para o verbo "ser" predicativo elex(v,Ltracos,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [r(C,_,[],_,_)], gap : []], X^X) ==> v(ser,Ltracos) ^[ extrai(Ltracos,tipo_v,pred), extrai(Ltracos,scat,[comp:C])]. O verbo “ ser” , como se pode verificar a partir dos exemplos abaixo, pode ocorrer com diferentes tipos de complementos: 17) O peixe é do gato. 18) O gato é um animal. 19) O gato é mamífero. Na frase 17), o verbo “ ser” ocorre com um sintagma preposicional enquanto nas frases 28) e 19) ocorre com um sintagma nominal. O verbo “ ser” não tem a mesma semântica nas três frases. Em 17), “ ser” não tem qualquer representação semântica, assumindo-se que a preposição é o elemento que exprime a relação entre os dois SNs. Nas frases 18) e 19) é o verbo “ ser” que desempenha essa função. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 69 INQUER – Interacção Pessoa – Máquina em Liguagem Natural A meta-entrada aqui apresentada trata do primeiro caso, em que ao verbo “ ser” não se associa qualquer tipo de representação semântica. Note-se, no entanto, que no último argumento da meta-entrada surge a representação semântica X^X que se anula e resulta em X. Os verbos que não têm qualquer representação semântica possuem o par tipo_v:pred na sua lista de traços. Assim, é esse traço que restringe a entrada nesta meta-entrada lexical. O tipo de complemento desses verbos é também retirado da sua lista de traços permitindo a reutilização desta regra para outros verbos. Meta-entrada para verbos intransitivos elex(v,Ltracos,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [],gap : []], Y^P) ==> v(Palavra, Ltracos) ^[\+retira_elemento(Ltracos,scat:[comp:_],_), P =..[Palavra,Y]]. Esta meta-entrada lexical aplica-se a verbos intransitivos como por exemplo “ existir” em frases como “ Quantos hipónimos de “gato” existem?” . Nestas estruturas, verbo tem como especificador um SN e não tem qualquer tipo de complemento. A lista de restrições desta meta-entrada lexical obriga a que na lista de traços destes verbos não conste qualquer informação sobre complementos, o que indica tratar-se de um verbo intransitivo. A representação semântica deste tipo de verbos é semelhante à representação semântica das expressões nominais simples, uma vez que contém apenas uma variável abstraída que será instanciada com a variável do seu especificador. Meta-entrada para verbos com um argumento interno elex(v,Ltracos1,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [r(C1,_,[],[spr:[],comp:[],_],_)], gap : []],X^Y^P) ==> v(Palavra, Ltracos) ^[\+(extrai(Ltracos,tipo_v,pred)), \+(extrai(Ltracos,tipo_v,imp)), retira_elemento(Ltracos,scat:[comp:C1],Ltracos1), P =.. [Palavra,X,Y]]. Os verbos transitivos com apenas um argumento interno são tratados pela meta-entrada lexical descrita acima. Esta meta-entrada indica que o verbo necessita de um SN como especificador e de um complemento cuja informação categorial está presente na lista de traços associada à sua entrada lexical. O 70 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática predicado retira_elemento/3, através do traço scat:[compl:Categoria_complemento]], retira essa informação da lista de traços e simultaneamente impõe restrições na aplicação desta meta-entrada (só os verbos que contêm apenas um elemento na sua lista de complemento são tratados por esta regra). O predicado extrai/3 restringe a entrada nesta regra a verbos predicativos (sem representação semântica) e a verbos impessoais. Este predicado exige que os traços tipo:pred e tipo_v: imp não estejam na lista de traços da entrada lexical. A representação semântica deste tipo de verbos é muito semelhante à representação semântica das preposições e dos nomes que seleccionam complemento. Esta semelhança é justificada pelo facto de todas estas expressões representarem relações entre constituintes. A representação semântica destas expressões é, portanto, da forma X^Y^palavra(X,Y), sendo X a variável abstraída mais externa do SN complemento e Y a variável abstraída mais externa do SN especificador. Meta-entrada para verbos impessoais (há) elex(v,Ltracos,[spr : [], comp: [r(C,_,[],[spr:[],comp:[],_],_)], gap : []],Y^P) ==> v(Palavra, Ltracos) ^[extrai(Ltracos,tipo_v,imp), extrai(Ltracos,scat,[comp:C]), P =.. [Palavra,Y]]. Esta meta-entrada serve para tratar os verbos impessoais, ou seja, que seleccionam apenas um argumento, que se realiza como objecto directo16. Por esta razão, estes verbos não flexionam em número existindo apenas uma entrada lexical para cada um deles. Neste sistema o único verbo impessoal que é tratado é o verbo “ haver” no sentido de “ existir” . Esta regra tem como restrições à sua aplicação a existência do par atributo-valor tipo:imp, presente apenas na lista de traços dos verbos impessoais. Esta regra extrai também da lista de traços a categoria do complemento do verbo. A representação semântica deste tipo de verbos é semelhante à dos verbos intransitivos com a diferença de que a única variável abstraída corresponde à representação do complemento e não à do sujeito. 16 Como o sujeito é expletivo, a sua realização é marcada. Ex: Ele há cada uma! Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 71 INQUER – Interacção Pessoa – Máquina em Liguagem Natural 11.2 REGRAS LEXICAIS Para além das meta-entradas lexicais descritas anteriormente, a gramática contém regras lexicais que recebem meta-entradas lexicais verbais e devolvem outras meta-entradas lexicais verbais. Estas regras evitam o desdobramento de meta-entradas lexicais (nomeadamente as das expressões verbais), permitindo a captação de generalizações importantes e tornando o sistema mais eficiente. Regra Lexical para o tratamento do gap de complemento elex(v,Ltracos1,[spr : SPR, comp: [], gap : [r(_,_,[],_,Y)]],X^P) ==> elex(v,Ltracos1,[spr : SPR, comp: [r(_,_,[],_,Y)], gap: []],X^Y^P). A meta-entrada lexical do lado direito da regra corresponde a uma meta-entrada de um verbo transitivo com um complemento. Esta regra constrói uma nova meta-entrada lexical em que o especificador, a lista de traços e a categoria são iguais às da meta-entrada referida. O elemento da lista de complementos da meta-entrada passa para a lista gap ficando a lista comp vazia. A representação semântica desta meta-entrada lexical é também alterada, ficando com apenas uma variável por indexar (a do especificador). Esta regra constrói uma nova meta-entrada lexical capaz de dar conta de frases relativas de complemento. O verbo “ comer” da frase seguinte necessita desta nova meta-entrada lexical para que a frase seja licenciada: 20) O alimento que o gato come é o peixe. Regra Lexical para o tratamento de verbos impessoais com sujeito nulo elex(v,Ltracos1,[spr : [],comp: [], gap:[r(n,_,[],spr:[],comp:[],gap:[]],_)]], Sem) ==> elex(v,Ltracos1,[spr:[], comp: [r(n,_,[],_,_)], gap: []],Sem). Esta regra lexical serve para tratar os casos em que os verbos impessoais não têm o complemento na posição canónica, ou seja, à sua direita. Por exemplo: 21) Quantos hipónimos de gato há? 72 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Neste exemplo, o complemento do verbo “ haver” encontra-se à esquerda do núcleo. Esta regra recebe uma meta-entrada lexical de um verbo impessoal e coloca o complemento dessa entrada lexical na lista gap, retirando-o da lista de complementos. Assim, a nova meta-entrada lexical pode ser aplicada à regra sintagmática correspondente e aceitar estruturas como as de 21). Note-se que, embora esta regra lexical seja muito semelhante à anterior do ponto de vista sintáctico, do ponto de vista semântico é bastante diferente. A regra anterior aplica-se a verbos com dois argumentos e, assim sendo, contém duas variáveis abstraídas sendo a segunda a correspondente à variável abstraída mais externa da representação do complemento e a primeira à do sujeito. Neste caso, só temos uma variável abstraída: a do complemento. A regra acima não conseguiria dar conta destes casos sendo necessário desdobrá-la. 11.3 REGRAS SINTAGMÁTICAS Às meta-entradas lexicais são posteriormente aplicadas regras sintagmáticas. Estas regras definem um formalismo que contém regras sintácticas, regras semânticas e listas de restrições sintáctico-semânticas que tornam possível o processamento sintáctico. Estas regras sintagmáticas baseiam-se na teoria X-Barra, sendo que as meta-entradas lexicais correspondem a X, as regras com a lista spr não-vazia a X’ e as regras cujas listas estão vazias a X’’. spr : LSpr r(Cat,[traços],[objectivos_atrasados],comp : LComps,Representação gap : LGap Semântica) Figura 4 – Regra sintagmática Cat corresponde à categoria X do sintagma e a lista de traços aos seus traços morfológicos e semânticos. A lista de objectivos atrasados procura resolver o problema de falta de instanciação das regras, retardando a execução de alguns predicados. Este problema foi referido anteriormente (Capitulo 7). A lista de subcategorização indica, tal como nas meta-entradas lexicais, quais os elementos que faltam encontrar para que uma dada estrutura seja licenciada. Esta lista contém as três sublistas utilizadas nas meta-entradas lexicais: spr, comp e gap. Note-se que, ao contrário do que acontecia nas meta-entradas lexicais, a lista gap pode não estar vazia. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 73 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Regra Sintagmática 1 – Promoção de X para X' r(N,T,[],[spr : SPR, comp: [],gap : Gap],Sem) => [elex(N,T,[spr : SPR, comp: [], gap : Gap],Sem)]. A primeira regra promove uma meta-entrada lexical de categoria X em X’ . Todos os atributos da meta entrada lexical são passados para o X’. Esta regra sintagmática é aplicada apenas a meta-entradas lexicais cuja lista de complementos esteja vazia. Isto implica que os verbos e as expressões nominais que seleccionam complemento não entrem nesta regra, sendo primeiro associados aos seus complementos na regra sintagmática núcleocomplemento que se apresenta mais adiante. A lista de objectivos atrasados do X’ está vazia pois não existem quaisquer operações a adiar. Exemplo da aplicação desta regra sobre uma meta-entrada de uma expressão nominal sem complemento e com especificador “ gato” : • Meta-entrada lexical elex(n,[num:plu,gen:mas,cont:n,abst:n,anim:n,ser_vivo:n,hum:n,mass:n], [spr : [r(det,_,[],_,_)],comp: [], gap : • []], X^gato(X)). Resultado da aplicação da regra sintagmática r(n,[ num:plu,gen:mas,cont:n,abst:n,anim:n,ser_vivo:n,hum:n,mass:n], [],[spr : [r(det,_,[],_,_)], comp: [], gap : []], X^gato(X)). Regra Sintagmática 2 – Orações relativas restritivas r(vr,T,[compoe_sem(SPR,GAP,T1,SEM,SEMCOMP,T)], [spr : [], comp: [], gap : []], SEMCOMP) => [r(pr,_,[],_,_), r(v,T1,[],[spr:SPR,comp:[],gap:GAP],SEM)]. Consideraram-se, neste projecto, dois tipos de orações relativas restritivas: 74 • de sujeito (em ex. “ o animali que • de complemento directo (em ex. “ o peixei que o gato come i come peixe é o gato” ) i é o carapau” ) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Nas oração relativa restritiva de complemento e sujeito marca-se uma posição (com o símbolo ), sintacticamente vazia, co-indexada com o N antecedente da relativa. Por exemplo, a frase “ o gato come o peixe” sofre então uma alteração para “ o peixei que o gato come i” . Chamamos a essa posição vazia “ gap” (lacuna). A regra sintagmática apresentada acima trata este tipo de estruturas, associando um V’ a um pronome relativo. O V’ em questão pode ter um elemento por satisfazer na sua lista spr (orações relativas de sujeito) ou na sua lista gap (orações relativas de complemento). O predicado compoe_sem/6 recebe a lista spr, a lista gap, a lista de traços e a representação semântica do V’ , devolvendo a representação semântica e a lista de traços da oração relativa (VR). Relembra-se que se optou por não atribuir informação semântica ao pronome relativo “ que” , uma vez que não influencia em nada a representação semântica da oração relativa e, posteriormente, a do SN. Este predicado trata dois casos distintos: i) Lista gap com um elemento e spr vazia; ii) Lista spr com um elemento e gap vazia. i) Lista gap com um elemento e spr vazia Quando a lista gap tem um elemento e a spr está vazia, então estamos perante uma oração relativa de complemento. Considerando o exemplo “ que o gato come ” tem-se: (i) representação do SN “ o gato” [(X^A)^d(o,sing,X,gato(X) & A)] (ii) representação do verbo “ comer” [Z^W^comer(Z,W)] (iii) após aplicação da regra lexical que coloca o complemento na lista gap, representação do verbo “ comer” [Z^comer(Z,W)] (iv) pela composição de (i) com (iii), representação da frase “ o gato come ∅“ [d(o,sing,Z,gato(Z) & comer(Z,W))] Em (iv) verifica-se que a representação semântica da frase não tem qualquer tipo de abstracção. Contudo, a variável W ocorre livre. Neste caso, o predicado introduz uma nova variável abstraída co-indexada com W, que instanciará com a representação semântica do SN antecedente. Em (v) apresenta-se a nova representação semântica da oração relativa. (v) representação da oração relativa “ que o gato come ” , após aplicação do predicado em questão: [W^d(o, sing, Z, gato(Z)&comer(Z,W))] Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 75 INQUER – Interacção Pessoa – Máquina em Liguagem Natural A lista de traços que passa para VR encontra-se vazia porque o antecedente da oração relativa não tem qualquer tipo de relação de concordância com o seu verbo. ii) Lista spr com um elemento e gap vazia O segundo caso que o predicado compoe_sem/6 trata é o das relativas de sujeito (sem especificador). A representação semântica do V’ sem especificador é igual à representação semântica do VR. Neste caso o V’ já contém uma variável que corresponde ao SN especificador, passando apenas para VR de modo a encontrar o antecedente da oração relativa na regra seguinte. Tomemos como exemplo “ que come peixe” . Temos, então, a forma do verbo [Z^W^comer(Z,W)] e a do SN [(M^A)^d(exi,sing,M,peixe(M) & A)]. Compondo as duas formas, pela maneira acima descrita, obtemos a representação semântica do SV (“ come peixe” ) [Z^d(exi,sing,W,peixe(W) & comer(Z,W))]. A lista de traços do VR, neste caso, é igual à lista de traços do V’ porque o verbo tem de concordar com o antecedente da relativa em número e pessoa. Regra Sintagmática 3 – Adjunção de um modificador (SP/VR) a um N’ e de um quantificador a um N’’ r(n,T1,[adjunto(C1,C), trata_spr(SPR,Sem,T1,T,Sem1,Sem2)], [spr:SPR, comp:[], gap:[]], Sem2) => [r(C1,T1,[],[spr:SPR,comp:[],gap:[]],Sem1), r(C,T,[],[spr:[],comp:[],gap:[]],Sem)]. As adjunções de orações relativas e de sintagmas preposicionais a N’ e as adjunções de quantificadores a N’ ’ são tratadas por esta regra. O segundo argumento do lado direito da regra só pode ser um sintagma uma vez que todas as listas de subcategorização se encontram vazias. A lista de objectivos atrasados da regra chama o predicado adjunto/2 que obriga a que a categoria deste sintagma seja p (preposição) ou vr (oração relativa) se C1 for de categoria n ou que a categoria C desse sintagma seja n e a de C1 det (quantificador). Esta regra aplica-se a dois casos distintos: i) Adjunções de SPs e orações relativas a N’ ; ii) Adjunções de quantificadores a N’ ’ 76 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática i) Adjunções de SPs e orações relativas a N’ Neste caso, o primeiro argumento da regra corresponde a um N’ uma vez que a lista spr pode não estar vazia. Note-se que a não obrigatoriedade da existência de um elemento na lista spr permite a construção dos tipos de frases: 22) Animais que são mamíferos bebem leite 23) Pulgas de gatos são animais 24) Os animais que são mamíferos bebem leite 25) As pulgas dos gatos são animais A representação sintáctica adoptada para as este tipo de construções foi a da adjunção de orações relativa e de sintagmas preposicionais a N' . Embora este tipo de representação não seja totalmente aceite para este tipo de estruturas, foi a escolhida por ser a mais adequada do ponto de vista linguistico e da eficiência do sistema. Na figura 5 apresenta a representação sintáctica dos exemplos 24) e 25) apresentados acima. Figura 5 – Representação em árvore da estrutura sintáctica adoptada para as adjunções a N’ A representação semântica do novo N'é dada através do predicado trata_spr/6, que recebe a lista spr do N’ , a representação semântica do sintagma adjunto e a sua lista de traços, a lista de traços do N’ e a sua representação semântica, devolvendo a representação semântica. Esta representação depende da existência de um elemento na lista spr: se a lista estiver vazia, dá-se o caso representado pelos exemplos 22) e 23) em que o antecedente da oração relativa/sintagma preposicional não tem um sintagma determinante que o quantifique. Como vimos anteriormente, a representação semântica de uma expressão nominal sem determinante é (A^B)^d(exi, plu, A, animal(A)&B). A representação semântica da oração relativa nos exemplos 22) e 24) (“ que são mamíferos” ) é a seguinte: D^d(exi, plu, C, mamífero(C)&ser(D, C)) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 77 INQUER – Interacção Pessoa – Máquina em Liguagem Natural A representação semântica do novo N’ necessita de ser acrescentada ao último argumento da representação semântica do determinante de tipo exi do N’ “ animais” /” pulgas” , sendo a variável abstraída mais externa da representação semântica da oração relativa/sintagma preposicional instanciada com a variável abstraída mais externa da representação semântica do N’ (A) . Utiliza-se o símbolo “ &” , de conjunção, para compor a semântica de um N'com uma oração encaixada (relativa ou preposicional). Se isto não acontecesse e a representação semântica da oração relativa fosse instanciada com a segunda variável do operador “ &” do determinante (P & Q), deixar-se-ia de ter variáveis que pudessem receber a representação semântica do SV a que este N’ se viria a associar. A representação semântica do exemplo 22) acima seria: (A^B)^d(exi, plu, A, animal(A) & d(exi, plu, C, mamífero(C)&ser(A, C))&B) Nos exemplos 24) e 25) a lista spr não se encontra vazia. Contudo a informação de que falta associar um determinante a todo o novo N’ está presente. Neste caso, a representação semântica do segundo N’ faz-se através da composição das representações semânticas do primeiro N’ e do VR. Essa composição é feita, como vimos anteriormente, através do operador &. A variável abstraída mais externa da representação semântica do N’ é co-indexada com a variável abstraída mais externa da representação semântica do VR, sendo essa variável a variável abstraída mais externa da representação semântica do novo N’ . Na figura 6 é ilustrado o processo para o exemplo 24) . Figura 6 – Exemplo da aplicação da Regra Sintagmática 3 Esta representação semântica está agora pronta para se juntar a uma representação semântica de um determinante de modo a formar um SN (regra sintagmática 7). Esta regra sintagmática devolve duas representações semânticas, sendo uma delas eliminada posteriormente. 78 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática A representação semântica de N'adjunto a um sintagma preposicional é, como vimos, idêntica à das orações relativas. Observemos o processo de construção semântica para o exemplo 25) acima (“ as pulgas do gato” ): “ de o gato” (i) representação da preposição “ de” [Z^W^de(Z,W)] (ii) representação do SN “ o gato” [(X^A)^d(o,sing,X,gato(X) & A)] (iii) pela regra sintagmática 8 (núcleo-complemento) (apresentada adiante), representação do SP “ de o gato” [Z^d(o,sing,W,gato(W) & de(Z,W)] “ pulga de o gato” (iv) representação do nome “ pulga” [P^pulga(P)] (v) representação do SP “ de o gato” [Z^d(o,sing,W,gato(W) & de(Z,W))] (vi) pela regra sintagmática acima descrita e composição de (iv) com (v), representação do N' “ pulga de o gato” [P^(pulga(P) & d(o,sing,W,gato(W) & de(P,W)))] “ a pulga de o gato” (vii) representação do determinante “ a” [(X^R)^(X^A)^d(o,sing,X,R & A)] (viii) representação do N’ “ pulga de o gato” [P^(pulga(P) & d(o,sing,W,gato(W)& de(P,W)))] (ix) pela regra sintagmática 7 (especificador-núcleo) (apresentada adiante) e composição de (vii) com (viii), representação do SN final [(P^A)^d(o,sing,P,pulga(P) & d(o,sing,W,gato(W) & de(P,W))) & A)] O predicado trata_spr/6 verifica também se as listas de traços do sintagma adjunto e do modificador não apresentam informação contraditória. Para isso utiliza o predicado unifica/3 de Marrafa (1993), que recebe duas listas de traços e devolve uma nova lista com todos os traços sem repetições, se não existirem inconsistências. Isto é, se numa lista aparece o atributo Z com valor W e na segunda lista aparece o mesmo atributo Z mas com valor R, é captada uma inconsistência e o predicado falha. ii) Adjunções de quantificadores a N’’ Nesta regra sintagmática é também tratado o caso da adjunção de quantificadores a N’ ’ . O quantificador “ todos” só pode co-ocorrer com um determinante definido, como é ilustrado pelos seguintes exemplos: 26) Todos os gatos são animais? 27) *Todos uns gatos são animais? 28) *Todos alguns gatos são animais? Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 79 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Por esta razão assume-se que o quantifiador “ todos” pode ser adjunto a um N’ ’ , ou seja, a um SN cujo especificador já foi satisfeito com um determinante definido. A representação sintáctica destas construções é ilustrada na figura 717. Figura 7 – Representação da estrutura sintáctica adoptada para a adjunção do quantificador “ todos” a N’ ’ O predicado trata_spr/6 constrói a representação semântica mais adequada a estes casos, ou seja, modifica a representação semântica do N’ ’ adjunto para que todo este seja quantificado pelo quantificador “ todos” . Por exemplo, na frase seguinte: 29) Todos os gatos e cães são animais ? O quantificador “ todos” pode ou não ter âmbito sobre “ os gatos” e sobre “ cães” . No entanto, a representação semântica do SN “ os gatos e cães são animais” é a seguinte: d(o, plu, A, gato(A)>d(exi, plu, B, animal(B)&ser_v(A, B)))& d(exi, plu, C, cão(C)&d(exi, plu, B, animal(B)&ser_v(C, B))) Como se pode verificar, é necessário modificar a semântica da quantificação deste N’ para que seja construída a interpretação em que o determinante “ todos” tenha âmbito sobre toda a coordenação. O predicado trata_spr/6 constrói essa interpretação ficando: d(todo, plu, A, gato(A)>d(exi, plu, B, animal(B)&ser_v(A, B)))& d(todo, plu, C, cão(C)>d(exi, plu, B, animal(B)&ser_v(C, B))) Este predicado restringe também a construção de estruturas de adjunção deste tipo com o quantificador “ qualquer” . Este não pode ocorrer seguido de um determinante definido como se pode verificar nos exemplos seguintes: 30) *Qualquer o gato é animal? 30’ ) Qualquer gato é animal? 17 Embora esta não seja a estrutura sintáctica mais aceite actualmente para este tipo de construções, é a estrutura linguisticamente mais adequada e eficiente à implementação no formalismo escolhido. Para um tratamento adequado da estrutura sintáctica ver, por exemplo, Zamparelli (1995). 80 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática O predicado trata_spr/6 devolve também uma nova lista de traços correspondente ao SN resultante da adjunção. Regra Sintagmática 4 – Adjunção da negação a SV r(v,T1,[],[spr:[SPR], comp:[], gap:GAP], X^Sem1) => [elex(neg,_,_,Sem^Sem1), r(v,T1,[],[spr:[SPR],comp:[], gap:GAP], X^Sem)]. Um fenómeno linguístico importante, e que tem de ser considerado, é a negação. Como vimos nas metaentradas lexicais, consideramos apenas o operador de negação “ não” . A sua representação semântica é igual à de um verbo intransitivo (de um lugar) porque a ideia essencial é colocar todo o SV negado como argumento da partícula de negação. Nesta regra, a meta-entrada lexical da partícula de negação é associada a um V’ devolvendo um novo V’ com uma nova representação semântica. A restrição que se impõe à aplicação desta regra a um V’ é a da lista spr ter de conter um elemento e de a lista comp estar obrigatoriamente vazia. A lista gap pode ou não estar vazia, permitindo a negação dentro das orações relativas (de complemento ou de especificador) assim como de qualquer V’ numa frase: 31) Os animais que não são mamíferos … 32) Os alimentos que o gato não come … 33) Uma planta não come carne? A representação sintáctica adoptada para os V’ é uma estrutura de adjunção: Figura 8 – Representação em árvore da estrutura sintáctica adoptada para a adjunção do operador de negação a SV A representação semântica destas estruturas é dada pela representação semântica do V’ com negação sendo a variável abstraída mais externa deste V’ unificada com a variável abstraída mais externa da representação semântica do novo V’ . Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 81 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Estas estruturas podem ser ambíguas dependendo do escopo da negação, que pode ou não incluir o complemento de V. Neste sistema a estratégia seguida foi a de considerar apenas as interpretações mais próximas da estrutura sintáctica da frase. As representações semânticas dos exemplos descritos acima são: 31) Os animais que não são mamíferos … (A^B)^d(o,plu,A,animal(A)&~(d(exi,plu,C,mamífero(C)&ser(A,C)))& B) 32) Os alimentos que o gato não come … (A^B)^d(o,plu,A,alimento(A)&d(o,sing,C,gato(C)&~(comer(A,C)))& B) 33) Uma planta não come carne? d(o,plu,A,planta(A)&~(d(exi,sing,B,carne(B)&comer(A,B)))) No exemplo 32), é negado apenas o verbo porque se trata da negação de uma oração relativa de complemento. A adjunção da negação nestes casos dá-se antes da junção da representação semântica do V’ à do seu complemento. Este problema só seria correctamente resolvido se existisse um mecanismo que gerasse todas as interpretações semânticas possíveis e as respectivas representações. Contudo, esse mecanismo geraria muitas interpretações equivalentes e interpretações não usuais, o que dificultaria o trabalho de inferência numa fase posterior. Vejamos agora o processo de construção da representação semântica da frase “ o gato não comeu o peixe” : “ comeu o peixe” (i) representação do SN “ o peixe” [(Z^B)^d(o,sing,Z,peixe(Z) & B)] (ii) representação do verbo “ comer” [Y^W^comer(Y,W)] (iii) pela regra sintagmática 8 (núcleo-complemento) (ver adiante) e composição de (i) com (ii), representação do SV [Y^d(o,sing,Z,peixe(Z) & comer(Y,Z))] “ não comeu o peixe” (iv) representação da partícula de negação “ não” [X^~(X)] (v) representação do SV “ comeu o peixe” [Y^d(o,sing,Z,peixe(Z) & comer(Y,Z))] (vi) pela regra sintagmática acima descrita e composição de (iv) com (v), representação do SV [Y^~(d(o,sing,Z,peixe(Z) & comer(Y,Z))] “ o gato não comeu o peixe” (vii) representação do SN “ o gato” [(X^A)^d(o,sing,X,gato(X) & A)] (viii) representação do SV “ não comeu o peixe” [Y^~(d(o,sing,Z,peixe(Z) & comer(Y,Z))] 82 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática (ix) pela regra sintagmática 7 (especificador-núcleo) (ver adiante) e composição de (vii) com (viii), representação da frase final “ o gato não comeu o peixe” [d(o,sing,X,gato(X) & ~(d(o,sing,Z,peixe(Z) & comer(Y,Z))] Regra Sintagmática 5 – SNs marcados r(n,[marcado:s|T1],[\+(extrai(T1,marcado,s)), verifica_relacional(Sem,T1,Sem1)], [spr:[], comp:[], gap:[]],Sem1) =>[r(marc,_,[],[spr:[],comp:[],gap:[]],_), r(n,T1,[],[spr:[],comp:[],gap:[]],Sem)]. Esta regra sintagmática possibilita a construção de SNs marcados que possam ser complementos de nomes. Esta regra associa um SN a um elemento do tipo “ marcador” e constrói um novo SN marcado cuja semântica é idêntica à do SN inicial. O predicado verifica_relacional/3 permite a análise correcta das seguintes estruturas: 37) O hipónimo do hipónimo de “ gato” é “ animal” ? 38) O hipónimo de “ gato” é “ felino” ? 39) * O hipónimo do “ gato” é “ felino” ? Este predicado recebe a representação semântica do SN à direita do elemento “ marcador” , a sua lista de traços e devolve a nova semântica (igual à que recebe). Desta forma é exigido que ou o SN não tem determinante (38) (impondo que o segundo argumento de d seja do tipo exi que, como vimos, indica a ausência de determinante) ou o SN é composto por um nome que selecciona complementos (37). O SN resultante da aplicação desta regra apresenta uma lista de traços semelhante à do SN do lado direito da regra, acrescentando no entanto o par marcado:s. A inclusão deste traço na lista do novo SN, assim como a chamada ao predicado extrai/3 na lista de objectivos atrasados restringe a entrada do novo SN nesta regra. Desta forma, frases como a seguinte são rejeitadas: 40) *O hipónimo de de “ gato” é “ mamífero” ? Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 83 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Regra Sintagmática 6 – Coordenações r(V,Ltracos5,[ \+(extrai(Ltracos,coord,_)), testa_conjuncao(C, Ltracos2, Ltracos3), coordena(V,Sem1,Sem3,Ltracos3,Ltracos4,Sem4), insere_cabeca(Ltracos4,marcado:s,Ltracos5), verifica_sv(V,Ltracos,Ltracos2)], [spr : SPR, comp: [],gap : Gap], Sem4) => [r(V,Ltracos,[],[spr:SPR,comp:[],gap:Gap],Sem1), r(conj,conj:C],[],[spr:[],comp:[],gap: []],_), r(V,Ltracos2,[],[spr: SPR, comp:[],gap: Gap],Sem3)]. Esta regra sintagmática18 trata as coordenações de SNs (marcados ou não), SVs, SPs e orações relativas (VRs). O lado direito da regra contém dois SX do mesmo tipo, coordenados por uma conjunção. Os operadores de conjunção tratados neste trabalho são “ e” e “ ,” . Estes operadores apresentam na sua lista de traços o atributo conj que tem o valor f (final) — no caso do “ e” — ou nf (não final) — no caso da “ ,” . Este atributo é fundamental para restringir a aceitação de estruturas como: 41) *O gato e o cão, a aranha são animais? 42) *O gato, o cão, a aranha são animais? Sabemos que imediatamente depois de uma vírgula terá de figurar uma coordenação de SNs (SNc); sabemos também que imediatamente depois de um “ e” terá de surgir um SN simples (SNs). Assim, um SN coordenado terá a estrutura representada na figura 9. Figura 9 – Representação em árvore da estrutura sintáctica adoptada para as conjunções O predicado testa_conjuncao/3 conjuntamente com o predicado extrai/3, tratam esta restrição. O primeiro predicado recebe o valor do atributo tipo da conjunção em questão, e a lista de traços do sintagma à direita desta, devolvendo a lista de traços do novo sintagma. Esta nova lista contém todos os 18 Esta regra sintagmática foi baseada na regra da disjunção de Kamp & Reyle (1993). 84 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática traços da lista recebida mais o que indica que o sintagma já está coordenado coord:s. Este predicado impõe as seguintes restrições: • Se a conjunção for do tipo f (um “ e” ), a lista de traços do sintagma à direita dessa conjunção não pode ter o traço coord:s, ou seja, não pode haver coordenação • Se a conjunção for do tipo nf (uma “ ,” ) a lista de traços do sintagma à direita da coordenação tem de ter o traço coord:s, obrigando assim a que seja um sintagma coordenado. O sintagma mais à esquerda da conjunção é, nos dois casos acima, não coordenado (simples). Por essa razão, é chamado o predicado extrai/3 sobre a lista de traços desse sintagma, verificando a ausência do atributo coord. A representação semântica de coordenações é dada através do operador “ &” que junta a representação semântica do primeiro sintagma ao segundo deixando as respectivas variáveis abstraídas de fora. A representação semântica teria a seguinte forma: X^Y^(S1 & S3), onde X^S1 corresponde a Sem1 e Y^S3 a Sem3, na regra acima descrita. Esta representação semântica não pode ser feita directamente na regra sintagmática porque podemos ter coordenações de mais de dois sintagmas. Veja-se o exemplo do SN “ o gato, o cão e a aranha” : “ o cão e a aranha” (i) representação do SN1 “ o cão” [(X^A1)^d(o,sing,X,cão(X) & A1)] (ii) representação do SN2 “ a aranha” [(Y^A2)^d(o,sing,Y,aranha(Y) & A2)] (iii) pela regra semântica e composição de (i) com (ii), representação do SN “ o cão e a aranha” [(X^A1)^(Y^A2)^(d(o,sing,X,cão(X)&A1) & d(o,sing,Y,aranha(Y) & A2))] “ o gato, o cão e a aranha” (iv) representação do SN3 “ o gato” [(Z^A3)^d(o,sing,Z,gato(Z) & A3)] (v) representação do SN4 “ o cão e a aranha” [(X^A1)^(Y^A2)^(d(o,sing,X,cão(X) & A1) & d(o,sing,Y,aranha(Y) & A2))] (vi) pela regra semântica a estudar e composição de (iv) com (v), representação do SN “ o gato, o cão e a aranha” [(Z^A3)^(X^A1)^(d(o,sing,Z,gato(Z))&(Y^A2)^d(o,sing, X,cão(X) & A1) & d(o,sing,Y,aranha(Y) & A2))] Como se pode observar, esta representação semântica tem alguns problemas quando se trata de coordenar mais de dois sintagmas. Desta forma, a representação semântica das coordenações é dada pelo predicado coordena/6 que recebe a categoria dos sintagmas a coordenar, a sua representação semântica e a lista de traços devolvida pelo predicado testa_conjunção/3 (a lista de traços do sintagma mais à direita com o traço coord:comp). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 85 INQUER – Interacção Pessoa – Máquina em Liguagem Natural O predicado coordena/6 chama os predicados coord_sn/3 e coord_sx/3 que realizam todas as operações necessárias à coordenação de múltiplos SXs: O coord_sn/3 [coord_sn(+A^SN1,+SN2,-A^SN)]: - recebe dois SNs, - guarda numa lista todas as abstracções de SN2 (pode ser um SN coordenado) e em SN2s a fórmula sem abstracções, - aplica as abstracções da lista a (SN1 & SN2s), que devolve em SN (note-se que SN1 não tem abstracções), - finalmente, aplica a abstracção do SN1 (A) a SN. Obtém-se, assim, em SN, a representação semântica do SN coordenado final. Neste caso, o predicado coordena/6 retira da lista de traços que recebe o traço relativo ao número e introduz-lhe o par num:plu. Isto serve para que a concordância com o verbo seja feita de forma correcta. O coord_sx/3 [coord_sx(+Sx1,+Sx2,-Sx).]: - recebe dois SXs com abstracções (Sx1 e Sx2), - retira essas abstracções e força a igualdade dessas variáveis, - aplica a variável resultante a (Sx1s & Sx2s) — (Sx1s e Sx2s correspondem às respectivas fórmulas sem abstracções) Exemplo do SV coordenado “ tem patas e é mamífero ” : (i) representação do SV “ tem patas” (SV1) [A^d(exi, plu, B, pata(B) & ter(A, B)] (ii) representação do SV “ é ‘mamífero’ ” (SV2) [C^d(exi,sing,D,mamífero(D)&ser(C,D))] (iii) pela regra de SV coordenado e composição de (i) com (ii), representação do SV final “ tem patas e é ‘mamífero’ ” [E^(d(exi, plu, B, ovo_2(B) & ter(E, B)) & d(exi, sing, D, mamífero(D) & ser(E, D)))] O último predicado da lista de objectivos atrasados coloca à cabeça da lista de traços que será associada ao novo SX o par marcado:s (se este existir na lista). Esta operação serve para facilitar o processamento posterior, no caso de se tratarem coordenações de SNs marcados, como por exemplo: 43) O hipónimo de “gato” e de “cão” é “ mamífero” ? 86 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática Regra Sintagmática 7 – Especificador - núcleo r(N,Ltracos3,[sem_spr(N,Ltracos,T1,Y^Sem,Sem1,Ltracos3,Sem2)], [spr:[],comp:[],gap:GAP], Sem2) => [ r(C,Ltracos,[],SCAT,Sem1), r(N,T1,[],[spr:[r(C,Ltracos,[],SCAT,Sem1)], comp:[],gap:GAP],Y^Sem)]. Esta regra recebe um X’ e um Y’ ’ pedido pela lista de especificadores de X’ , e devolve como resultado um X’ ’ . O esquema seguinte ilustra o tipo de estruturas tratado por esta regra: Figura 10 – Representação em árvore da estrutura sintáctica adoptada para o especificador-núcleo Esta regra pode ser aplicada a V’ , que tem como especificador SN, e a N’ que têm como especificador um D. A lista spr de X’ é satisfeita com o Y’ ’ e, por essa razão, a lista do X’ ’ resultante encontra-se também vazia. A lista gap sobe simplesmente na estrutura podendo estar ou não vazia. Se essa lista não estiver vazia, a regra permite a associação de SNs a V’ em relativas, de modo a aceitar estruturas do tipo: 44) o alimentoi que o gato come ∅i Esta regra permite associar o SN “ o gato” ao verbo “ comer” que contém um complemento na lista gap “ o alimento” . A lista de objectivos por realizar contém uma chamada ao predicado sem_spr/7, que recebe a categoria do X’ , a lista de traços de Y’ ’ e de X’ e a representação semântica de X’ e de Y’ ’ . Este predicado devolve a lista de traços e a representação semântica do novo sintagma tratando dois casos distintos: i) X’ de categoria v e Y’ ’ um SN; ii) Restantes categorias i) X’ de categoria v e Y’’ um SN Quando X’ é de categoria v e Y’’ é um SN, as duas listas de traços são unificadas (através do predicado unifica/3) sendo a lista resultante a lista de traços do SV. A representação semântica do SV é dada através do predicado subs/3, que recebe duas representações semânticas, co-indexa as variáveis Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 87 INQUER – Interacção Pessoa – Máquina em Liguagem Natural abstraídas mais externas da primeira representação com a variável abstraída da segunda, devolvendo uma nova representação semântica. Neste caso, co-indexa a(as) variável(eis) abstraída(s) mais externa(s) do SN (especificador) com a variável abstraída mais externa do V’ . Este predicado tem uma utilidade particular no caso de o SN ser coordenado. Vejamos o seguinte exemplo: 45) O gato e o cão são animais? A representação semântica do SN “ o gato e o cão” é a seguinte: (A^Amb1)^(C^Amb2)^(d(o,sing,A,gato(A)>Amb1)&d(o,sing,C,cão(C)>Amb2)) A representação semântica do V’ “ são animais” é: X^d(exi, plu, B, animal(B)&ser(X, B)) Como podemos observar pelos exemplos acima, existem dois âmbitos para instanciar com uma mesma variável. Esta instanciação não pode ser feita apenas com o mecanismo de instanciação do Prolog e, por esta razão, define-se o predicado subs/3 que realiza, recursivamente, a substituição de todas as variáveis de uma fórmula. Este predicado é definido da seguinte forma: subs(X^F,X,F):- var(X). subs((X^A)^F,V^SV,R) :- substitute(X,V,SV,A), !, subs(F,V^SV,R). subs(F,_^_,F). A primeira cláusula serve para tratar os casos do verbo “ ser” sem semântica, que selecciona um SP, enquanto a última serve para aceitar casos em que o SN final é constituído apenas por N. O predicado subs/3 chama um outro predicado, substitute/4 (Sterling & Shapiro), que efectua a coindexação necessária entre todas as variáveis por abstrair do SN (Amb1 e Amb2) com a variável por abstrair do V’ (X). substitute(+Term,+Var,+Formula,-Result). Este predicado recebe um termo Term, uma variável Var e uma fórmula Formula e devolve em Result o resultado da substituição de Var por Term em Formula. Exemplo: ?- substitute(A,B,sorrir(B),Z). Z = sorrir(A) 88 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática A semântica da frase “ o cão e o gato são animais“ , depois de aplicados estes predicados seria: d(o, sing, A, gato(A) > d(exi, plu, B, animal(B) & ser(A, B))) & d(o, sing, C, cão(C) > d(exi, plu, B, animal(B) & ser(C, B))) ii) Restantes categorias Nos restantes casos, como por exemplo as expressões nominais que têm sintagmas determinantes como especificador, o predicado sem_spr/7, chama apenas o predicado unifica/3, que unifica as duas listas de traços de modo a detectar eventuais inconsistências. Regra Sintagmática 8 – Verbo existir com inversão de sujeito r(v,Ltracos1,[extrai(T1,tipo,existe), unifica(T1,Ltracos,Ltracos1), subs(Sem1,Sem2,Sem3)], [spr:[],comp:[],gap:[]],Sem3) => [r(v,T1,[],[spr:[r(n,Ltracos,[],[spr:[],comp:[],gap:[]],Sem1)] comp:[], gap:[]],Sem2), r(n,Ltracos,[],[spr:[], comp:[], gap:[]],Sem1)]. Nesta regra sintagmática é tratado o caso específico do verbo existir, com o sujeito à direita, em frases como: 46) Existem quantos hipónimos de “ gato” ? Este verbo apresenta algumas características especiais. Embora possa ser considerado um verbo intransitivo em construções do tipo 47) e, consequentemente, tratado pela regra sintagmática 7, pode também ocorrer em construções como a de 46), contrariamente aos verbos intransitivos 48). 47) Quantos hipónimos de “ gato” existem? 48) *Miam quantos hipónimos de “ gato” ? Por esta razão, e por 46) se tratar de uma construção frequentemente utilizada em sistemas deste tipo, foi necessária a inclusão de uma regra sintagmática específica. Na lista de objectivos atrasados encontra-se o predicado extrai/3 que restringe a aplicação desta regra ao verbo existir, exigindo a presença do par tipo:existe na lista de traços do V’ . Para além deste predicado é chamado o predicado unifica/3 (que obriga a concordância entre o verbo e o seu sujeito) e o predicado subs/3 (que constrói a representação semântica adequada permitindo um SN coordenado como sujeito). Desta forma, as construções 49) e 50) são correctamente analisadas: Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 89 INQUER – Interacção Pessoa – Máquina em Liguagem Natural 49) *Existe quantos hipónimos de “ gato” ? 50) Existem hipónimos de “ gato” e de “ cão” ? Regra Sintagmática 9 – Gap à direita de um núcleo verbal r(v,Ltracos,[subs(Sem1,Sem2,Sem3)], [spr :[], comp:[], gap :[]], Sem3) => [r(C,Ltracos,[],SCAT,Sem1), r(v,_,[],[spr :[], comp:[], gap:[r(C,Ltracos,[],SCAT,_)]],Sem2)]. A regra sintagmática apresentada acima trata o caso das construções do tipo: 51) Quantos hipónimos de “ gato” há? Nestas construções, como já foi referido anteriormente, o complemento do verbo “ haver” não se encontra na sua posição canónica, tendo sido deslocado para a esquerda do núcleo verbal. Embora esta regra seja semelhante à regra sintagmática 7 (especificador – núcleo), apresenta uma diferença fundamental: o SN que se encontra à esquerda do verbo não é o seu argumento externo, mas sim o argumento interno. Por esta razão, o verbo não tem traços de concordância com o SN que o antecede. Assim, o único predicado chamado na lista de objectivos atrasados é o predicado subs/3, que faz a construção semântica correcta quando se trata de um SN coordenado, permitindo construções como: 52) Quantos hipónimos de “ gato” e de “ cão” há? Regra Sintagmática 10 – Predicados com um complemento in situ r(N,T1,[faz_sem(Sem2,Sem1,T1,Sem3),verifica_comp(N,T1,L)], [spr : SPR,comp: [],gap : Gap], Sem3) => [elex(N,T1,[spr : SPR, comp:[r(C2,L,[],SCAT2,Sem2)], gap : Gap],Sem1), r(C2,L,[],SCAT2,Sem2)]. Nesta regra são tratadas as meta-entradas lexicais de expressões com um complemento in situ como as expressões verbais transitivas com um argumento, as expressões nominais que seleccionam complemento e as preposições. O elemento da lista comp da meta-entrada lexical tem de ser igual aquele que é encontrado à sua direita, sendo o resultado da aplicação da regra um X’ , em que X é da mesma categoria da meta entrada. 90 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG A Gramática A representação semântica deste X’ é dada através do predicado faz_sem/4 que recebe as representações semânticas do complemento e do X’ e a lista de traços do predicado (núcleo). Este predicado trata o caso em que X’ é o verbo “ haver” (impessoal) que apresenta a lista de spr vazia e, consequentemente, a sua representação semântica contém apenas uma variável por abstrair que deve instanciar com a representação semântica do complemento. Neste caso, o predicado faz_sem/4 certifica-se de que se trata do verbo “ haver” através do predicado extrai/3, chamando em seguida o predicado subst/3, já visto anteriormente, sobre as representações semânticas recebidas. Nos restantes casos, este predicado chama o predicado subst/3 sobre a representação semântica do complemento e sobre a representação semântica de X’ sem a variável mais externa abstraída. (a correspondente ao sujeito). Esta regra sintagmática chama também o predicado verifica_comp/3. que recebe a categoria e a lista de traços de X’ (núcleo) e a lista de traços do complemento. Este predicado booleano impede que nomes que seleccionam complementos sejam complemento de verbos diferentes do verbo “ ser” identidade. Assim, este predicado impede a construção de estruturas como a seguinte: 53) *O gato tem hipónimo de “ cão” ? Para efeitos de ilustração da aplicação da gramática, no anexo 7 são apresentados alguns exemplos do processamento sintáctico e semântico de interrogativas simples do português. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 91 Algoritmo de Conversão 12. Algoritmo de Conversão Uma vez implementados a gramática e o parser, é necessário implementar um algoritmo capaz de ler uma frase interrogativa em linguagem natural no ecrã, tratá-la de forma a poder ser aplicada à gramática e devolver uma representação semântica legível pelo utilizador. Neste capítulo é descrito esse algoritmo, cujo código se encontra em (anexo 8). Pode aceder-se ao algoritmo através da execução do predicado go/0 no compilador Prolog. Este algoritmo começa por ler o input do ecrã, através do predicado read_line/1 que lê, um a um, os caracteres introduzidos pelo utilizador. Em seguida, é verificado se o input corresponde a uma frase interrogativa (pela presença do símbolo “ ?” ) e tratada a posição da vírgula de forma a que esta esteja sempre entre dois espaços em branco (mesmo que não tenha sido introduzida desta forma pelo utilizador). Ainda durante a execução deste predicado, todas as sequências que se encontram entre espaços em branco na string introduzida são colocadas numa lista. Esta lista é, em seguida, objecto de tratamento relativamente às contracções. Todas as contracções presentes na lista são substituídas pela sequência preposição-artigo19 correspondente através, do predicado subst_contract/2. A lista resultante deste processo é posteriormente tratada pelo predicado analisador/1 que chama os predicados verifica_lexico/2 e reconhecedor/1. O primeiro verifica a presença de cada elemento da lista na base de dados lexical, devolvendo uma lista com a interpretação ou as interpretações (resultantes da ambiguidade lexical) ligadas à frase, utilizando o predicado build-in do Prolog findall/3. Por exemplo: 1) As fatias douradas são comida? Neste caso, a execução do predicado findall(L,verifica_léxico(Frase,L),L1) devolveria uma lista com duas sublistas correspondentes às duas leituras possíveis de “ fatia dourada” ou “ fatia” e “ dourada” 20: [[as,‘fatias douradas’,são,comida],[as,fatias,douradas,são,comida]] Esta lista de listas é, seguidamente, tratada pelo predicado reconhecedor/1 que aplica as regras da gramática a cada uma das sublistas através do predicado semf/2. O predicado semf/2 recebe uma das sublistas e devolve uma lista com todas as interpretações semânticas possíveis para a análise da frase na 19 As preposições consideradas nesta fase do projecto são apenas as compostas por preposição e artigo. 20 Como é do conhecimento do leitor, “ dourada” pode ser um adjectivo. No entanto, a interpretação em que este termo assume essa categoria não é levado em conta, uma vez que a WordNet.PT não contempla ainda lexicalizações deste tipo. Assim, as únicas interpretações possíveis são as de “ fatia dourada” , “ fatia” e “ dourada” como nomes. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 93 INQUER – Interacção Pessoa – Máquina em Liguagem Natural gramática. Note-se que, para o exemplo 1) acima, o predicado semf/2 devolveria apenas uma representação semântica pois não possui, na sua gramática, regras que permitam a ocorrência de dois nomes seguidos. Assim, a interpretação em que “ fatia” e “ dourada” são expressões nominais atómicas é rejeitada. O predicado semf/2 chama o predicado parse/2 que corresponde ao parser propriamente dito. Este predicado trata ainda da omissão do verbo ser em estruturas do tipo: 2) Qual o hipónimo de “ cão” ? Este tratamento passa pela inserção do verbo ser, na lista de palavras, na posição de onde foi elidido. Esta inserção é necessária para a aplicação das regras da gramática e licenciamento da estrutura. O predicado parse/2 utiliza ainda o predicado statistics/2 build-in do Prolog para cronometrar o tempo que o sistema demora a fazer o reconhecimento, a análise e a(as) representação(ões) semântica(s) para uma dada frase. O predicado semf/2 imprime ainda, no ecrã, as representações semânticas que encontra, de forma legível pelo utilizador, através do predicado pprint/2. No anexo 9, onde estão apresentados alguns exemplos de frases analisadas pelo sistema, foi utilizado este algoritmo. 94 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Conclusões Finais e Trabalho Futuro 13. Conclusões e Trabalho Futuro Neste relatório são apresentadas as principais fases de desenvolvimento do Módulo I – Análise Sintáctico-Semântica – do Projecto INQUER – Interacção Pessoa-Máquina em linguagem natural. Este projecto tem como principal objectivo o desenvolvimento de um recurso tecnológico capaz de potencializar as possibilidades de exploração da WordNet.PT, facilitando a sua utilização por utilizadores não especializados. Por outro lado, este sistema é também uma ferramenta linguística uma vez que analisa e gera linguagem natural. O desenvolvimento deste sistema passa pelo desenvolvimento de três módulos distintos, a saber: Análise Sintáctico-Semântica, Inferência e Geração em Linguagem Natural. O primeiro destes módulos, da responsabilidade da estagiária, e objecto deste relatório, consiste na análise sintáctica das frases interrogativas introduzidas pelo utilizador, gerando uma ou mais representações semânticas de acordo com a(s) interpretação(ões) da frase. Estas representações são posteriormente processadas no módulo Inferência que procura e extrai a informação necessária para a resposta à pergunta. No módulo Geração em Linguagem Natural é gerada a resposta à pergunta através da análise da representação semântica e da informação extraída. Este último módulo não está ainda a ser desenvolvido. Embora este projecto envolva uma forte componente de investigação não deixa de ser um projecto de desenvolvimento de uma ferramenta de software. Por esta razão foi necessário combinar metodologias adequadas ao desenvolvimento de cada uma das tarefas, o que se revelou uma experiência muito enriquecedora do ponto de vista profissional. Por outro lado, uma vez que o seu desenvolvimento é feito de forma modular, é necessária uma interacção constante entre os responsáveis de cada módulo para que todo o sistema fosse eficiente. O trabalho de equipa foi fundamental no desenvolvimento de todo o sistema. 13.1 TRABALHO FUTURO O desenvolvimento do projecto INQUER não termina com este estágio, estando já planeadas outras fases de desenvolvimento como é o caso do Módulo III – Geração em Linguagem Natural. No que respeita ao módulo I, o desenvolvimento inicial foi assegurado no decorrer deste estágio. No entanto, como este projecto está directamente relacionado com o projecto WordNet.PT, serão necessárias extensões à base de dados lexical e relacional do sistema INQUER à medida que novos domínios semânticos são revistos e desenvolvidos no projecto WordNet.PT. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 95 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Por outro lado, nesta primeira fase de desenvolvimento do módulo I foram implementadas apenas algumas das estruturas sintácticas presentes nas interrogativas do Português, motivadas pelas respostas obtidas através de um questionário elaborado para o efeito. A estagiária propõe o desenvolvimento de regras capazes de lidar com mais algumas estruturas sintácticas presentes nas respostas do questionário nomeadamente: • estruturas de disjunção • inversões de sujeito • adjunções de sintagmas adjectivais a N’ • estruturas com complementos causais Para além destas estruturas, para um tratamento mais alargado da quantificação, é sugerida a adaptação do formalismo usado à estrutura de quantificadores generalizados. Numa fase posterior do projecto, é também sugerido que o site na internet tenha a capacidade de registar as perguntas e respostas resultantes da interacção utilizador-sistema. Os resultados permitirão definir as áreas de desenvolvimento do sistema INQUER de forma a ir de encontro às expectativas dos utilizadores. 96 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Referências Referências Aldana, Emilio (2000), “ An application for translation of Spanish sentences into First Order Logic implemented in Prolog” , Proceedings of First International Congress on Tools for Teaching Logic, University of Salamanca, Spain. http://aracne.usal.es/congress/PDF/EmilioRodriguez.pdf Allen, James (1995), Natural Language Understanding, University of Rochester, The Benjamin/Cummings Publishing Company, Inc. Blackburn, Patrick & Johan Bos & Kristina Striegnitz (2001), Learn Prolog Now!. http://www.coli.uni-sb.de/~kris/prolog-course/ Blackburn, Patrick & Johan Bos (1999), Representation and Inference for Natural Language, a First Course in Computational Semantics, Volume I, working with first-order logic, Computerlinguistik, Universitat des Saarlandes. http://www.iccs.informatics.ed.ac.uk/~jbos/comsem/book1.html Branco, António (2000), Reference Processing and its Universal Constraints, Lisboa, Edições Colibri.. Cardie, Claire et al (2000), “ Examining the role of Statistical and Linguistic Knowledge Sources in a General- Knowledge Question-Answering System” , Proceedings of the Sixth Applied Natural Language Processing Conference, New York. http://acl.ldc.upenn.edu/A/A00/A00-1025.pdf Carnie, Andrew (2000), “ Head Driven Phrase Structure Grammar I (HPSG)” , HandOuts. http://www.linguistlist.org/~carnie/classes/LING505/HPSG.pdf Chaves, Rui (2002), Fundamentos para uma Gramática Computacional do Português – Uma Abordagem Lexicalista, Tese de mestrado apresentada à Faculdade de Letras da Universidade de Lisboa, Lisboa. Covington, Michael (1993), Natural Language Processing for Prolog Programmers, Artificial Intelligence Programs, The University of Georgia, Athens, Prentice Hall. Covington, Michael (2001), “ Some Coding Guidelines for Prolog” , Artificial Intelligence Center, The University of Georgia, Athens. Fellbaum, Christiane (1998), “ A Semantic Network of English Verbs” , in Christiane Fellbaum (ed), WordNet – An Electronic Lexical Database, Cambridge, Massachusetts, London, England, The Mitt Press Gazdar, Gerald & Chris Mellish (1989), Natural Language Processing in Prolog, Workingham, Addison Wesley. http://www.cogs.susx.ac.uk/lab/nlp/gazdar/nlp-in-prolog/index.html Gawron, Jean et al (1982), “ Processing English with a Generalized phrase structure grammar” , Proceedings of the 20th annual meeting association for computational linguistics, Computer Research Center, Palo Alto. http://acl.ldc.upenn.edu/P/P82/P82-1014.pdf Ginzburg, Jonathan & Ivan Sag (2000), “ Interrogative Investigations: The form, meaning and use of English interrogative constructions” , CSLI Publications. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 97 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Hellwig, Peter (2002), “ Natural Language Parsers – A “ Course in Cooking” ” , Heidelberg. Hermjakob, Ulf & Eduard Hovy & Chin-Yew Lin (2002), “ Knowledge-Based Question Answering” , Proceedings of the 6th World Multiconference on Systems, Cybernetics and Informatics (SCI2002), Orlando, U.S.A. http://www.isi.edu/natural-language/projects/ webclopedia/pubs/02sci.pdf Jurafsky, Daniel &James Martin (2000), Speech and Language Processing, Prentice Hall. Kamp, Hans & Uwe Reyle (1993), From Discourse to Logic: An Introduction to Model-Theoretic Semantics of Natural Language, Formal Logic and Discourse Representation Theory, Dordrecht, Holland, Kluwer Academic Publishers. Kordoni, Valia (2001), “ Grammatiktheorie Head Driven Phrase Structure Grammar” . www.coli.uni-sb.de/~kordoni/courses/ ws01-02/lecture2.pdf Marrafa, Palmira (2001), WordNet do Português – uma base de dados de conhecimento linguístico, Lisboa, Instituto Camões. Marrafa, Palmira (1993), Predicação Secundária e Predicados complexos em Português – Análise e Modelização, Tese de Doutoramento, Lisboa. Mccawley, James (1993), Everything that Linguists have always wanted to know about Logic but were ashamed to ask, Chicago and London, The University of Chicago Press. Meurers, Detmar (2001), “ Lectures Notes for the Introduction to Symbolic Computacional Linguistics” , Department of Linguistics, The Ohio State University. http://www.ling.ohio-state.edu/~dm/2001/winter/684.01/ Miller, George (1998), “ Nouns in WordNet” , in Christiane Fellbaum (ed), WordNet – An Electronic Lexical Database, Cambridge, Massachusetts, London, England, The Mitt Press. Moldovan, Don & Sandra Harabagin (2001), Open-Domain Textual Question Answering, Pittsburgh, Cornegie Mellon Moldovan, Don & Vasile Rus (2001), “ Logic Form Transformation of WordNet and its Applicability to Question Answering” , Proceedings of the ACL 2001 Conference, Toulouse, France. http://acl.ldc.upenn.edu/P/P01/P01-1052.pdf Pardo, Thiago & Lucia Rino (1999), “ O Formalismo GPSG e sua Comparação com DCG e LFG” . www.nilc.icmc.usp.br/~thiago/RTDC00299-PardoRino.pdf Pereira, Fernando & Stuart Shieber (2002 1978), Prolog and Natural-Language Analysis, Microtome Publishing, digital edition. http://www.mtome.com/prolog-digital.pdf Park, Jong (1992), “ A unification-based semantic interpretation for coordinate constructs” , Proceedings of the 30th annual meeting association for computational linguistics. http://acl.ldc.upenn.edu/P/P92/P92-1027.pdf Poesio, Massimo (1998), “ Lectures – Computational Linguistics 2” , Division of Informatics, University of Edinburgh. http://www.cogsci.ed.ac.uk/~poesio/CL2 98 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Referências Prager, John & Jennifer Chu-Carroll & Krysztof Czuba (2001), “ Use of WordNet for Answering What-is Questions” , The Tenth Text REtrieval Conference, Gaithersburg MD. http://trec.nist.gov/pubs/trec10/index_track.html#qa Ristad, Eric (1986), “ Defining Natural Language Grammars in GPSG” , Proceedings of the 24th Annual Meeting of the ACL, New York. http://acl.ldc.upenn.edu/P/P86/P86-1007.pdf Ristad, Eric (1986), “ Computational Complexity of current GPSG theory” , Proceedings of the 24th Annual Meeting of the ACL, New York. http://acl.ldc.upenn.edu/P/P86/P86-1006.pdf Russel, Stuart & Peter Norvig (1995), Artificial Intelligence – A Modern Approach, Prentice Hall Sag, Ivan & Thomas Wasow (1999), Syntactic Theory: A Formal Introduction. Shiber, Stuart et al (1989), “ A Semantic Head-Driven Generation Algorithm for Unification-Based Formalisms” , Proceedings of the 27th ACL, Menlo Park, USA and Utrecht, Netherlands. http://acl.ldc.upenn.edu/P/P89/P89-1002.pdf Srihari, Rohini & Wei Li (1999), “ Information Extraction Supported Question Answering” , Eighth Text REtrieval Conference (TREC-8), Gaithersburg, MD. http://trec.nist.gov/pubs/trec8/papers/cymfony.pdf Sterling, Leon & Ehud Shapiro (1997), “ The Art of Prolog” , second edition, Cambridge, Massachusetts, The MIT Press. Thompson, Cynthia & Raymond Mooney & Lappoon Tang (1997), “ Learning to parse natural language database queries into logical form” , Proceedings of ML-97 Workshop on Automata Induction, Grammatical Inference and language acquisition. http://www.cs.utah.edu/~cindi/papers/chill/nlw-97.pdf Vellino, André (1990), “ Programming in Logic” , Perspectives in Computing, Bell-Northern Research http://www.iit.nrc.ca/~andre/publications/PIC-Prolog.PDF Vicedo, Jose & António Ferrández (2002), “ A semantic approach to Question Answering systems” , Dpto. Lenguajes y Sistemas Informáticos, Universidad de Alicante, Alicante, Espanha http://trec.nist.gov/pubs/trec9/papers/alicante_trec9_paper.pdf Volk, Martin (1988), “ Parsing german with GPSG: the problem of separable-prefix verbs” , A Thesis Submitted to the Graduate Faculty of The University of Georgia in Partial Fulfilment of the Requirements for the Degree MASTER OF SCIENCE, Atenas, Georgia http://www.ifi.unizh.ch/CL/volk/SyntaxVorl/GPSG.thesis.html Vossen, Piek (1999), EuroWordNet – General Document, (version 3), University of Amesterdam. http://www.illc.uva.nl/EuroWordNet/docs/GeneralDocPS.zip Zamparelli, Roberto (1995), Layers in the Determiner Phrase, Ph. D. Thesis, University of Rochester. Rochester, N.Y. http://www.cogsci.ed.ac.uk/~roberto/layres/dp-hyp.html Wielmaker, Jan (2002), SWI – Prolog 5.0 – Reference Manual, University of Amsterdam. http://www.swi.psy.uva.nl/cgi-bin/nph-download/SWI-Prolog/refman/refman.pdf Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 99 Anexos ANEXOS Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 101 Anexos ANEXO 1 – AVALIAÇÃO DOS PARSERS :-consult(’lexicofinal.txt’). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Operadores % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :-op(950,xfx,’=>’). :-op(960,xfx,’:’). :-op(950,xfx,’==>’). :-op(940,xfx,’--->’). :-op(900,yfx,’>’). :-op(800,yfx,’&’). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Frases de Teste % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(1,[o,gato,tem,patas]). f(2,[a,aranha,tem,patas]). f(3,[a,pata,é,um,animal]). f(4,[o,borrego,é,um,mamífero]). f(5,[as,patas,de,o,gato,são,membros]). f(6,[os,membros,de,o,gato,são,patas]). f(7,[os,animais,que,são,carnívoros,comem,carne]). f(8,[as,plantas,que,têm,tronco,são,árvores]). f(9,[o,bolo,que,tem,ovos,de,a,galinha,é,de,fruta]). f(10,[o,bolo,que,tem,ovos,que,são,de,a,galinha,é,de,fruta]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Procedimento Principal % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% teste(11). teste(N):- f(N,F), printList(F),!, findall(Y,parse_shift_lcorner(Y,F),R),nl, descarrega(R), N2 is N+1, teste(N2). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 103 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % META REGRAS LEXICAIS % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %____________________________________________________________________ % %Meta-entrada Lexical para preposições %____________________________________________________________________ elex(p,Ltracos,[spr : [], comp: [r(n,_,[],_)], gap : []]) ==> p(_, Ltracos)^[]. %____________________________________________________________________ % %Meta-entrada Lexical para marcadores %____________________________________________________________________ elex(marc,[],[spr : [], comp: [], gap : []]) ==> marc(_,_)^[]. %____________________________________________________________________ % %Meta-entrada Lexical para determinantes indefinidos %____________________________________________________________________ elex(det,Ltracos,[spr : [],comp: [],gap : []]) ==> det(_, Ltracos) ^[\+(retira_elemento(Ltracos,tipo:uni,_))]. %____________________________________________________________________ % %Meta-entrada Lexical para determinantes universais %____________________________________________________________________ elex(det,Ltracos,[spr : [],comp: [],gap : []]) ==> det(_, Ltracos) ^[retira_elemento(Ltracos,tipo:uni,_)]. %____________________________________________________________________ % %Meta-entrada Lexical para pronomes relativos %____________________________________________________________________ elex(pr,[],[spr : [], comp: [], gap : []]) ==> pr(_,[]) ^[]. 104 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %____________________________________________________________________ % %Meta-entrada Lexical para nomes com especificador e complemento %singular %____________________________________________________________________ elex(n,Ltracos1,[spr : [r(det,_,[],_)], comp: [r(n,Ltracos2,[],[spr:[],comp:[]|_])], gap : []]) ==> n(_, Ltracos) ^[retira_elemento(Ltracos,marcador:s,Ltracos1), member(num:sing,Ltracos2)]. %_____________________________________________________________________ % %Meta-entrada Lexical para nomes com especificador e complemento %plural %_____________________________________________________________________ elex(n,Ltracos1,[spr : [r(det,_,_)], comp: [r(n,Ltracos2,[],[_,comp:[]|_])], gap : []]) ==> n(_, Ltracos) ^[retira_elemento(Ltracos,marcador:s,Ltracos1), member(num:plu,Ltracos2)]. %____________________________________________________________________ % %Meta-entrada Lexical para nomes sem complementos %____________________________________________________________________ elex(n,Ltracos,[spr : [r(det,_,[],_)],comp: [],gap : []]) ==> n(_, Ltracos) ^[]. %____________________________________________________________________ % %Meta-entrada Lexical para verbos com um argumento interno %____________________________________________________________________ elex(v,Ltracos1,[spr : [r(n,_,[],_)], comp: [r(C,_,[],_)], gap : []]) ==> v(_,Ltracos) ^[retira_elemento(Ltracos,scat:[comp:C],Ltracos1)]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 105 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % REGRAS SINTAGMÁTICAS % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %____________________________________________________________________ % % Promove X0 para X' % ___________________________________________________________________ r(N,T,[],[spr : SCAT, comp: [],gap : Gap]) => [elex(N,T,[spr : SCAT, comp: [], gap : Gap])]. %____________________________________________________________________ % % Orações relativas restrictivas %____________________________________________________________________ r(vr,T,[],[spr : [], comp: [], gap : []]) => [ r(pr,_,[],_), r(v,T,[],[spr : _,comp: [],gap : _])]^[]. % ___________________________________________________________________ % % Adjunção de um modificador (SP/VR) a um N’ % ___________________________________________________________________ r(n,T1,[adjunto(C)],[spr:SPR,comp:[], gap:[]]) => [ r(n,T1,[],[spr:SPR,comp:[],gap:[]]), r(C,_,[],[spr:[],comp:[],gap:[]])] ^[adjunto(C)]. % ___________________________________________________________________ % % SNs marcados % ___________________________________________________________________ r(n,[marcado:s|T1], [\+(extrai(T1,marcado,s))], [spr:[],comp:[],gap:[]]) => [r(marc,_,[],[spr:[],comp:[],gap:[]]), r(n,T1,[],[spr:[],comp:[],gap:[]])] ^[\+(extrai(T1,marcado,s))]. 106 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %____________________________________________________________________ % % Especificador - Núcleo % ___________________________________________________________________ r(N,T2,[], [spr : [],comp: [], gap : Gap]) => [ r(C,T1,[],SCAT), r(N,T2,[],[spr : [r(C,T1,[],SCAT)], comp: [],gap :Gap])] ^[subst(N),unifica(T1,T2,T3)]. %____________________________________________________________________ % % Predicados com um complemento in situ %____________________________________________________________________ r(N,T1,[],[spr : SPR, comp: [], gap : Gap]) => [elex(N,T1,[spr : SPR, comp: [r(C2,_,[],SCAT2)], gap : Gap]), r(C2,_,[],SCAT2)]^[]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PARSER LEFT-CORNER % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% parse(L) --> {statistics(runtime,_)}, recognise_t(L), {statistics(runtime,[_,T]), Time is T / 1000,nl,nl, write('Tempo de análise: '), write(Time),write(' segundos.'),nl}. recognise_t(L) --> recognise(L). recognise(Phrase) --> [Word], {(EL ---> [Word]), EL =.. [C|_], (elex(C,Ltracos,S) ==> EL^Prolog), executa(Prolog)}, lc(elex(C,Ltracos,S),Phrase). lc(r(v,_,[],[spr:[],comp:[],gap:[]]),[],[],[]). lc(Phrase,Phrase) --> []. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 107 INQUER – Interacção Pessoa – Máquina em Linguagem Natural lc(Subphrase1, Superphrase) --> {obj_atrasados(Subphrase1,Subphrase2)}, {Phrase => [Subphrase2|Right]}, recognise_rest(Right), lc(Phrase, Superphrase). recognise_rest([]) --> []. recognise_rest([Phrase|Rest]) --> recognise(Phrase), recognise_rest(Rest). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PARSER SHIFT-REDUCE % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% parse(p(L),L) --> {statistics(runtime,_)}, recognise(L), {statistics(runtime,[_,T]), Time is T / 1000,nl,nl, write('Tempo de análise: '), write(Time),write(' segundos.'),nl}. recognise([r(v,_,[],[spr:[],comp:[],gap:[]])],[],[]). recognise([Y,X|Rest]) --> [], {obj_atrasados(X,Z), (LHS => [Z,Y])}, recognise([LHS|Rest]). recognise([X|Rest]) --> [], {obj_atrasados(X,Y), LHS => [Y]}, recognise([LHS|Rest]). recognise(Stack) --> [Word], {(EL ---> [Word]), EL =.. [C|_], (elex(C,Ltracos,S) ==> EL^Prolog), executa(Prolog)}, recognise([elex(C,Ltracos,S)|Stack]). 108 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PARSER TABULAR ASCENDENTE % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :-dynamic edge/4. parse(R,Expr):retractall(edge(_,_,_,_)), statistics(runtime,_), start_chart(1,Vn,Expr), statistics(runtime,[_,T]), Time is T / 1000, write('Tempo de análise: '),write(Time), write(' segundos.'),nl, retractall(edge(_,_,_,[_|_])), edge(1,Vn, R ,[]),!. start_chart(V0,V0,[]). start_chart(V0,Vn,[Word|Words]):V1 is V0 + 1, foreach( (lexema(Word,Category)), add_edge(V0,V1,Category,[])), start_chart(V1,Vn,Words). lexema(Word,elex(C,Ltracos,S)):(EL ---> [Word]), (elex(C,Ltracos,S) ==> EL^Prolog), executa(Prolog). foreach(X,Y):call(X), do(Y), fail. foreach(_,_):- true. do(Y):- Y, !. add_edge(V0,V1,Category,Categories):edge(V0,V1,Category,Categories),!. add_edge(V1,V2,Category0,[]):obj_atrasados(Category0,Category1), asserta(edge(V1,V2,Category1,[])), foreach( Category2 => [Category1|Categories], add_edge(V1,V1,Category2,[Category1|Categories])), foreach(edge(V0,V1,Category2,[Category1|Categories]), (add_edge(V0,V2,Category2,Categories))). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 109 INQUER – Interacção Pessoa – Máquina em Linguagem Natural add_edge(V0,V1,Category1,[Category2|Categories]):asserta(edge(V0,V1,Category1,[Category2|Categories])), foreach(edge(V1,V2,Category1,[]), add_edge(V0,V2,Category1,Categories)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PREDICADOS AUXILIARES % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*========================================= executa(+ListaChamadasProlog) Executa todos os predicados de uma lista =========================================*/ executa([]). executa([P|L]):call(P), executa(L). /* ================================================================= retira_elemento(+Lista,?Elemento,?ListaSemElemento) Retira da primeira lista o elemento X devolvendo uma lista sem esse elemento ===================================================================*/ retira_elemento([X|L],X,L). retira_elemento([Y|L1],X,[Y|L]):- retira_elemento(L1,X,L). /* ================================================================= unifica(+ListaAtributos,+ListaAtributos,?NovosAtributos) Unifica duas listas de traços distintas sem inconsistência dando uma terceira como resultado ===================================================================*/ unifica([],X,X). unifica([X|R],[],[X|R]). unifica([Atr1:Val1|Resto],[Atr1:Val1|Resto2],[Atr1:Val1|Result]):unifica(Resto,Resto2,Result). 110 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos unifica([Atr1:Val1|_],[Atr1:Val2|_],_):\+(Val1=Val2), !, fail. unifica([Atr1:Val1|Resto],[Atr2:Val2|Resto2],Result):unifica([Atr1:Val1],Resto2,NResto), unifica(Resto,[Atr2:Val2|NResto],Result),!. /* ========================================================== objectivos_atrasados(+RegraSintagmática,-RegraSintagmática) Executa objectivos prolog atrasados ============================================================*/ obj_atrasados(r(C,T,LGOALS,Scat), r(C,T,[],Scat)):!,executa(LGOALS). obj_atrasados(C,C). /* ========================================== print_list(+Lista) Imprime o conteúdo de uma lista para o ecrã ===========================================*/ printList([X]):write(X). printList([X|L]):write(X), write(' '), printList(L). /* ========================================== descarrega(+Lista) Imprime o conteúdo de uma lista para o ecrã ============================================*/ descarrega([]):write('-------------------------------'),nl,nl. descarrega([S1|LS]):write(S1),nl, descarrega(LS). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 111 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /* ==================================== categorias que podem estar em adjunção ======================================*/ adjunto(p). adjunto(vr). /* =========================================== categorias que podem receber especificadores ============================================*/ subst(n). subst(v). 112 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 2 – QUESTIONÁRIO INQUER !"#$ $ %& '( ) *,+.-/&01325456798:<;>=>?A@(BC;ED?5F.GAHI?IJKBFMLNAOQPA;ER'6?E8?:C7SFTB<?UNA; 6IBF.V.FMWINAD";":XF.GIB<?:YNALF.:@Q;"7ZN57\[IR'6F.GN5G;5]<;":7\N3B<;^8?:YL'6GIB<NI_ :Y?IJ38;JKB<NU?79`3F.GL'6NAL"?7a-N3B6:YNVIbdc3;":dB6L'6eIJKfYg 1QJKB<N7\;J&Nh]<NAWI?:X679VM?3HANGIB<N7\?GIBC;EDNIJh8?:YL'6GIB<NIJiB<j#8"FM@QNIJ&R'6?567 6IBF.V.FMWINAD";":@Q;"Vk;@QNUN567lJ3FkJKB<?7\NUD?IJKB<N5GN3B6:Y?AWNg"cQN:YN5FkJQJ(; L;JKB<N:Yj.N75;J&R'6?U@Q;"VMNm;":YNIJQJ(?U@Q;"GG;J(@Q;"n?IJ(@A:Y?QHA?GD;^GNU@QNFToN\D? B<?3oB<;Eb?79mNFTo";f'NVML'6"7\NIJh8?:YL'6GIB<NIJ&R'6?p=q6VML'6?58?:dBF.G?GIBC?IJ3g r;"GJ3FMD?:Y?56"7lJ3FkJKB<?7\NU@Q;'7Z@QN8NA@AFMDNAD"?UD?5:Y?IJ38;"GD"?:NhB<;DNIJ&NIJ 8?:YL'6GIB<NIJhGNIJ&[:Y?ANIJ&D?UsYt3?:Y?IJvuXFwHA;J(s?UsYr;'7EFMDNAsCg"x?3]F.G"FMOQy?IJ&? :Y?VMNAOQy?IJ&?GIB:Y?5F.GD'FwHAjzD'6;J{J(PA;E?3o"?7S8VM;JiB<j8FM@Q;J&D?h]<;":7\N3B<;J&D"? 8?:YL'6GIB<NIJ3g EXEMPLOS: "Quais os animais que têm tromba?" "O que é um gato?" "Um gato é mamífero?" "Que tipo de planta é uma roseira?" "Quantos tipos de bolos há?" Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 113 INQUER – Interacção Pessoa – Máquina em Liguagem Natural !#" *&m:CFMLNAD;8?VMN\J36NU@Q;"VMNm;":YNAOQPA;%$ rN3B<N:CF.GN52F.m?F.:Y;^_52FM@QN:YD";Et3NGIBC;J &%')(*',+-&/.1032#465879.:'3;0=<?>=@BA 2#;DC)E-79EF(*09; GH.14 A);D79EI79.-79.:'3;A)J=59E &%'LKM+-KN4>9O=5879.-&/5?P8O9>I2 EIQ)R3587958&S5?09T=.ICI;PF.10I2 5U'V3WS;DC)5+IKN46E1P-E32#;DC)E1X YI.32.1P8J9465879.FZ9[9[?Z 114 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 3 – LISTA DE PERGUNTAS RECEBIDAS Nº Pergs. Tipos de Perguntas 124 que solicitam uma definição 21 O que é uma batata? O que é um rinoceronte? O que é uma toupeira? O que é o Kiwi? O que é um estoma? O que é um vivíparo? O que é um ornitorrinco? O que é um cogumelo? O que é o musgo? O que é uma ema? O que é um waffle? O que é rizzoto? O que é file mignon? O que é um marsupial? O que é um fungo? O que é um souffle? O que é uma morsa? O que é uma medusa? O que é uma anémona? O que é bacalhau à lagareiro? O que é um cão ? O que é o ... ? O que é um ... ? O que é ... ? Totais (Polares e de alternativa) A batata pode ser congelada? O cão é esperto? Todos os animais que têm tromba são mamíferos? As papoilas são venenosas? O rato é um animal doméstico? O hamster é um rato? O homem é um animal? Há peixes mamíferos? As galinhas voam? A lesma é comestível? A mosca nada? O coelho canta? A bolota é redonda? O caracol anda? A galinha tem patas? O gato fala? O pardal anda? Grupo de Computação do Conhecimento Léxico-Gramatical – CLG O sistema O sist. não analisa analisa 47 77 16 X X X X X X X 5 X X X X X X X X X X X X X X X 2 16 3 2 13 1 0 3 2 31 13 18 X X X X X X X X X X X X X X X X X 115 INQUER – Interacção Pessoa – Máquina em Liguagem Natural X Os sapos têm sangue frio? Todos os animais tem um coração? A coruja é um animal diurno ou nocturno? ALT O gafanhoto é comestível? O arroz é uma planta? O faisão é uma ave comestível? Existem sardinhas nos rios? Os ratos são carnívoros? Os leões comem antílopes? Há mais elefantes na Índia ou em África? ALT Existem animais de três patas? O gato é um mamífero? É verdade que os cães são os melhores amigos dos homens? O musgo é uma planta? SN é SN? Há/Existe SN Adj? SN V? Alternativa SN tem SN? SN V SN? É verdade que ...? Parciais sobre argumentos Que ingredientes tem uma omelete? Como se chama a fêmea da girafa? Que tipos de couve há? Quais são os vegetais verdes? O bife de vaca provem de que animal? Qual o nome da planta de onde deriva a canela? Qual das raças é mais perspicaz? Quais os animais que têm os membros superiores mais curtos que os inferiores? Quais os tipos de planta que há? Em que época do ano devem ser plantadas as camélias? Quais os mamíferos que vivem no mar? Que tipo de vegetal é a batata? Que tipo de vegetal é o arroz? Que tipo de animal é o polvo? Que tipo de animal é o camarão? Que tipo de animal é o caracol? Quais são os animais domésticos? Quais os animais omnívoros? De onde vem a cachupa? De que pais vêm a muamba e a mandioca? Em que pais há mais koalas? O que comem os pandas gigantes? De que maneiras se cozinham as batatas? Quais os mamíferos que são venenosos? Qual o animal mais venenoso do mundo? Em que partes do mundo se come cão? Qual a carne mais consumida do mundo? Qual o animal cuja barbatana faz uma bela sopa? 116 X X X X X X X X X X X X X 15 3 6 2 3 1 1 6 0 4 0 2 1 0 9 3 2 2 1 0 1 54 13 41 X X X X X X X X X X X X X X X X X X X X X X X X X X X X Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos X X X X X Qual é o animal que pode viver mais tempo? Qual o animal que vê melhor ao longe? Em que pais se come tradicionalmente peixe com batatas fritas? De que se alimentam as aranhas? Qual o mamífero mais pequeno do mundo? Quais são os animais que têm barbatanas? Que tipo de insecto é uma mosca? Qual o animal mais lento do mundo? O que é que as baleias comem? Para termos uma alimentação saudável, o que é que devemos incluir nas nossas refeições? Que frutas não devem estar numa salada de frutas? Qual o maior animal carnívoro terrestre? Que tipo de peixe é um bacalhau? O que come uma anaconda? Que mamíferos são venenosos? Que mamíferos vivem na água? O que come um rinoceronte? Que mamíferos põem ovos? Quais os animais que têm tromba? Qual é a ave de rapina mais pesada do mundo? Que tipo de animal é um gato? Qual é o maior lagarto do mundo? O que é que os pandas comem? De que é composto o chucrute? De que é feita a manteiga? Que comida come uma tartaruga? Que ... ? Como... ? Qual/Quais é/são ...? Qual das... ? Em que ... ? De onde ... ? De que ... ? O que ... ? (o que é que...? 3) Outras Parciais sobre especificadores Quantas patas tem um pato? Quantos tipos de laranja existem? Quantos cães tem uma matilha? Quantas variedades de pratos de bacalhau existem? Quantas raças tem o homem? Quantos tipos de mamíferos há? Quantos anos, em média, vive um elefante? Quantos mamíferos marinhos existem? Quantos tentáculos têm habitualmente os polvos? Quanto tempo pode uma tartaruga chegar a viver? Quantas raças de gatos há? Quantos tipos de feijão existem? Quantos tipos de aves existem? Um cavalo vive quanto tempo? Grupo de Computação do Conhecimento Léxico-Gramatical – CLG X X X X X X X X X X X X X X X X X X X X X 15 1 20 1 4 1 5 6 1 9 0 3 0 0 0 0 1 0 6 1 17 1 4 1 5 5 1 14 5 9 X X X X X X X X X X X X X X 117 INQUER – Interacção Pessoa – Máquina em Liguagem Natural Quantos ... há/existem? Quantos X tem Y? Quantos N V N? Outras Sobre adjuntos causais 7 4 2 1 5 0 0 0 2 4 2 1 3 0 3 X X X Porque é que os caranguejos andam de lado? Como se reproduzem os macacos? Como se faz um bacalhau com natas? Porque ...? Como ... ? Que envolvem comparação 1 2 0 0 1 2 1 0 1 X O que têm em comum o gato e o cão? Ter em comum 118 1 0 1 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 4 – EXCERTO DA BASE DE DADOS LEXICAL /*=================================== nomes que seleccionam complementos ====================================*/ n(tipo,[num:sing,gen:mas,cont:n,abst:s,anim:n,ser_vivo:n,hum:n, scat:[comp:[marc:de]]]) ---> [tipo]. n(tipo,[num:plu,gen:mas,cont:n,abst:s,anim:n,ser_vivo:n,hum:n, scat:[comp:[marc:de]]]) ---> [tipos]. /*===================================== Determinantes universal e existencial ======================================*/ det(o,[tipo_d:univ,num:sing,gen:mas]) ---> [o]. det(o,[tipo_d:univ,num:sing,gen:fem]) ---> [a]. det(o,[tipo_d:univ,num:plu,gen:mas]) ---> [os]. det(o,[tipo_d:univ,num:plu,gen:fem]) ---> [as]. det(um,[tipo_d:exist,num:sing,gen:mas]) ---> [um]. det(um,[tipo_d:exist,num:sing,gen:fem]) ---> [uma]. det(um,[tipo_d:exist,num:plur,gen:mas]) ---> [uns]. det(um,[tipo_d:exist,num:plur,gen:fem]) ---> [umas]. /*============ preposições =============*/ p(de,[]) ---> [de]. p(com,[]) ---> [com]. /*======================= pronomes interrogativos ========================*/ pi(oque,[num:sing]) ---> ['o que']. pi(qual,[num:sing]) ---> [qual]. pi(qual,[num:plu]) ---> [quais]. pi(quantos,[num:plu,gen:fem]) ---> [quantas]. pi(quantos,[num:plu,gen:mas]) ---> [quantos]. /*=========== conjunções ============*/ conj(e,[conj:f]) ---> [e]. conj(e,[conj:nf]) ---> [,]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 119 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*======= verbos ========*/ v(ser_v,[num:sing,tipo_v:pred,scat:[comp:p]]) ---> [é]. v(ser_v,[num:plu,tipo_v:pred,scat:[comp:p]]) ---> [são]. v(existir,[num:sing,tipo_v:existe]) ---> [existe]. v(existir,[num:plu,tipo_v:existe]) ---> [existem]. v(existir,[num:plu,tipo_v:imp,scat:[comp:n]]) ---> [há]. v(ter,[num:sing,scat:[comp:n]]) ---> [tem]. v(ter,[num:plu,scat:[comp:n]]) ---> [têm]. v(ladrar,[tempo:inf]) ---> [ladrar]. v(ladrar,[num:sing]) ---> [ladra]. v(ladrar,[num:plu]) ---> [ladram]. v(piar,[tempo:inf]) ---> [piar]. v(piar,[num:sing]) ---> [pia]. v(piar,[num:plu]) ---> [piam]. v(preparar_2,[tempo:inf]) ---> [preparar]. v(preparar_2,[num:sing,scat:[comp:n]]) ---> [prepara]. v(preparar_2,[num:plu,scat:[comp:n]]) ---> [preparam]. /*============================================================ expressões nominais retiradas da WordNet.PT (hierarquizadas) =============================================================*/ n('substância',[num:sing,gen:fem,cont:n,abst:n,anim:n,ser_vivo:n,hum:n ,mass:s]) ---> [substância]. n('substância',[num:plu,gen:fem,cont:n,abst:n,anim:n,ser_vivo:n,hum:n, mass:s]) ---> [substâncias]. n('alimento',[num:sing,gen:mas,cont:n,abst:n,anim:n,ser_vivo:n,hum:n]) ---> [alimento]. n('alimento',[num:plu,gen:mas,cont:n,abst:n,anim:n,ser_vivo:n,hum:n]) ---> [alimentos]. n('fruta', [num:sing,gen:fem,cont:s]) ---> [fruta]. n('fruta', [num:plu,gen:fem,cont:s]) ---> [frutas]. n('lacticínio',[num:sing,gen:mas]) ---> [lacticínio]. n('lacticínio',[num:plu,gen:mas]) ---> [lacticínios]. n('produto lácteo',[num:sing,gen:mas]) ---> ['produto lácteo']. n('produto lácteo',[num:plu,gen:mas]) ---> ['produtos lácteo']. n('queijo',[num:sing,cont:s]) ---> [queijo]. n('queijo',[num:plu,cont:s]) ---> [queijos]. n('queijo fundido',[num:sing]) ---> [queijo,fundido]. n('queijo fundidos',[num:plu]) ---> ['queijos fundidos']. n('queijo fresco',[num:sing]) ---> ['queijo fresco']. n('queijo fresco',[num:plu]) ---> ['queijos frescos']. n('queijo de ovelha',[num:sing]) ---> ['queijo de ovelha']. n('queijo de ovelha',[num:plu]) ---> ['queijos de ovelha']. 120 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos n(’animal’,[num:sing,cont:s]) ---> [animal]. n(’animal’,[num:plu,cont:s]) ---> [animais]. n('carnívoro',[num:sing]) ---> [carnívoro]. n('carnívoro',[num:plu]) ---> [carnívoros]. n('canídeo',[num:sing]) ---> [canídeo]. n('canídeo',[num:plu]) ---> [canídeos]. n('cão',[num:sing]) ---> [cão]. n('cão',[num:plu]) ---> [cães]. n('pastor-alemão',[num:sing]) ---> [pastor-alemão]. n('pastor-alemão',[num:plu]) ---> [pastores-alemães]. n('São Bernardo',[num:sing]) ---> ['são bernardo']. n('São Bernardo',[num:plu]) ---> ['são bernardos']. n('caniche',[num:sing]) ---> [caniche]. n('caniche',[num:plu]) ---> [caniches]. n('Serra da Estrela',[num:sing]) ---> ['serra da estrela']. n('Serra da Estrela',[num:plu]) ---> ['serras da estrela']. n('vegetal',[num:sing,gen:mas]) ---> [vegetal]. n('vegetal',[num:plu,gen:mas]) ---> [vegetais]. n('alface',[num:sing,gen:fem]) ---> [alface]. n('alface',[num:plu,gen:fem]) ---> [alfaces]. n('aipo',[num:sing]) ---> [aipo]. n('aipo',[num:plu]) ---> [aipos]. n('beldroega',[num:sing,gen:fem]) ---> [beldroega]. n('beldroega',[num:plu,gen:fem]) ---> [beldroegas]. n('couve',[num:sing,gen:fem,cont:s]) ---> [couve]. n('couve',[num:plu,gen:fem,cont:s]) ---> [couves]. n('brócolos',[num:plu,gen:mas]) ---> [brócolos]. n('brocos',[num:plu,gen:mas]) ---> [brócos]. n('couve-nabiça',[num:sing,gen:fem]) ---> ['couve-nabiça']. n('couve-nabiça',[num:plu,gen:fem]) ---> ['couves-nabiças']. n('couve-nabo',[num:sing,gen:fem]) ---> ['couve-nabo']. n('couve-nabo',[num:plu,gen:fem]) ---> ['couves-nabos']. n('colza',[num:sing,gen:fem]) ---> [colza]. n('colza',[num:plu,gen:fem]) ---> [colza]. n('couve-flor',[num:sing,gen:fem]) ---> ['couve-flor']. n('couve-flor',[num:plu,gen:fem]) ---> ['couves-flores']. n('couve-galega',[num:sing,gen:fem]) ---> ['couve-galega']. n('couve-galega',[num:plu,gen:fem]) ---> ['couves-galegas']. n('galega',[num:sing,gen:fem]) ---> [galega]. n('galega',[num:plu,gen:fem]) ---> [galegas]. n('couve chinesa',[num:sing,gen:fem]) ---> ['couve chinesa']. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 121 INQUER – Interacção Pessoa – Máquina em Linguagem Natural n(’couve chinesa’,[num:plu,gen:fem]) ---> [’couves chinesas’]. n(’couve de bruxelas’,[num:sing,gen:fem]) ---> [’couve de bruxelas’]. n(’couve de bruxelas’,[num:plu,gen:fem]) ---> [’couves de bruxelas’]. n(’repolho’,[num:sing,gen:mas]) ---> [repolho]. n(’repolho’,[num:plu,gen:mas]) ---> [repolhos]. n(’couve roxa’,[num:sing,gen:fem]) ---> [’couve roxa’]. n(’couve roxa’,[num:plu,gen:fem]) ---> [’couves roxas’]. n(’couve-lombarda’,[num:sing,gen:fem])---> [’couve-lombarda’]. n(’couve-lombarda’,[num:plu,gen:fem]) ---> [’couves-lombardas’]. n('sabóia',[num:sing,gen:fem]) ---> [sabóia]. n('sabóia',[num:plu,gen:fem]) ---> [sabóias]. n('couve branca',[num:sing,gen:fem]) ---> ['couve branca']. n('couve branca',[num:plu,gen:fem]) ---> ['couves brancas']. n('doce',[num:sing,gen:mas,cont:s]) ---> [doce]. n('doce',[num:plu,gen:mas,cont:s]) ---> [doces]. n('bolo',[num:sing]) ---> [bolo]. n('bolo',[num:plu]) ---> [bolos]. n('bolo-rei',[num:sing]) ---> ['bolo-rei']. n('bolo-rei',[num:plu]) ---> ['bolos-reis']. n('bolo inglês',[num:sing]) ---> ['bolo inglês']. n('bolo inglês',[num:plu]) ---> ['bolos ingleses']. n('bolo-marmore',[num:sing]) ---> ['bolo-mármore']. n('bolo-mármore',[num:plu]) ---> ['bolos-mármore']. n('bolo seco',[num:sing]) ---> ['bolo seco']. n('bolo seco',[num:plu]) ---> ['bolos secos']. n('biscoito',[num:sing]) ---> [biscoito]. n('biscoito',[num:plu]) ---> [biscoitos]. n('língua-de-gato',[num:sing,gen:fem]) ---> ['língua-de-gato']. n('língua-de-gato',[num:plu,gen:fem]) ---> ['línguas-de-gato']. 122 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 5 – MECANISMO DE HERANÇA DE TRAÇOS /* ========================================================== heranca_de_tracos(+Nome,+LtracosEspecíficos,-LTracos) Devolve, em Ltracos, os traços completos (herdados) do nome Nome (um conceito pode ter várias listas atributos se tiver várias cadeias de hiperónimos) ============================================================*/ heranca_de_tracos(Nome,Ltracos,Lista1):findall(TracosHyper,tracos(Nome,Ltracos,TracosHyper,_),Lista), junta_lista(Lista,Lista1). /* ================================================================ tracos(+Nome,+LtracosEspecíficos,-LtracosTotal,-Lhiperónimos) Devolve uma lista com os traços completos de um dado conceito (LtracosTotal) e uma lista de todos os hiperónimos desse conceito =================================================================*/ tracos(Nome,Ltracos1,Ltracos,[Hyper|Hs]):has_hyperonym(Nome,Hyper), (n(Hyper,LtHyper)---> [_]),!, herda(LtHyper,Ltracos1,Ltracos2), tracos(Hyper,Ltracos2,Ltracos,Hs). tracos(Var,Ltracos1,Ltracos,[Hyper|Hs]):variant(Nome,Var), (n(_,LtVar)--->[Nome]), has_hyperonym(Nome,Hyper), herda(LtVar,Ltracos1,Ltracos2), tracos(Hyper,Ltracos2,Ltracos,Hs). tracos(Nome,LtNome,LtNome,[]):\+ has_hyperonym(Nome,_), \+ variant(_,Nome). /* =========================================== herda(+Lista1,+Lista2,-ListaR) Insere na Lista2 os elementos da Lista1 que não contém. Resulta na ListaR. ===========================================*/ herda([],L,L). herda([X:Y],[],[X:Y]). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 123 INQUER – Interacção Pessoa – Máquina em Linguagem Natural herda([X:Y|Rest],Rest2,Result):\+ member(X:_,Rest2) -> insere_lista(X:Y,Rest2,Nova), herda(Rest,Nova,Result); herda(Rest,Rest2,Result). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PREDICADOS AUXILIARES % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* ===================================== insere_lista(+Traço,+ListaTraços,-LtraçosResultado insere um traço à cabeça de uma lista =======================================*/ insere_lista(X,[],[X]). insere_lista(X,[X|R],[X|R]). insere_lista(X,[Y|R],[X,Y|R]). /* ========================================================== extrai(+ListaTraços,+Atributo,+Valor) verifica se um dado atributo valor está presente numa lista ============================================================*/ extrai([],_,_):- fail. extrai([Atr:Val|_],Atr,Val):- true. extrai([_:_|L],Atr1,Val1):- extrai(L,Atr1,Val1). /* =========================================================== junta_lista(+ListaListasAtributos, -ListaAtributos) junta todas as listas de uma lista de lista se não tiverem inconsistências relativamente aos seus elementos (traços) =============================================================*/ junta_lista([X],X):-!. junta_lista([X,Y|L],L3):unifica(X,Y,L2), junta_lista([L2|L],L3). 124 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 6 – IMPLEMENTAÇÃO DA GRAMÁTICA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % META-ENTRADAS LEXICAIS % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %_____________________________________________________________________ % % Meta Entrada Lexical para preposições %_____________________________________________________________________ elex(p,[],[spr : [], comp: [r(n,_,[],[spr:[]|_],_)], gap : []],X^Y^P) ==> p(Palavra,[]) ^[P =..[Palavra,X,Y]]. %_____________________________________________________________________ % % Meta Entrada Lexical para marcadores %_____________________________________________________________________ elex(marc,[],[spr : [], comp: [], gap : []],_) ==> marc(_,_) ^[]. %_____________________________________________________________________ % %Meta Entrada Lexical das conjunções %_____________________________________________________________________ elex(conj,Ltracos,[spr : [], comp: [], gap : []],_) ==> conj(_,Ltracos) ^[]. %_____________________________________________________________________ % %Meta Entrada Lexical para a negação %_____________________________________________________________________ elex(neg,[],[spr : [], comp: [], gap : []],X^P) ==> neg(_,_) ^[P =..[~,X]]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 125 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %_____________________________________________________________________ % % Meta Entrada Lexical para determinantes indefinidos %_____________________________________________________________________ elex(det,Ltracos,[spr : [], comp: [], gap : []], (X^P)^(X^Q)^d(Palavra,Num,X,P & Q)) ==> det(Palavra,Ltracos) ^[retira_elemento(Ltracos,tipo_d:exist,_), extrai(Ltracos,num,Num)]. %_____________________________________________________________________ % % Meta Entrada Lexical para determinantes universais %_____________________________________________________________________ elex(det,Ltracos,[spr : [], comp: [], gap : []], (X^Res)^(X^Amb)^d(Palavra,Num,X,Res>Amb)) ==> det(Palavra,Ltracos) ^[extrai(Ltracos,tipo_d,univ), extrai(Ltracos,num,Num)]. %_____________________________________________________________________ % % Meta Entrada Lexical para pronomes interrogativos %_____________________________________________________________________ elex(n,Ltracos,[spr : [], comp: [], gap : []],(X^Q)^(P *> Q)) ==> pi(Palavra,Ltracos) ^[P =..[Palavra,X]]. %_____________________________________________________________________ % % Meta Entrada Lexical para pronomes interrogativos que podem ocorrer % como especificadores %_____________________________________________________________________ elex(det,Ltracos,[spr : [], comp: [], gap : []],(X^Q)^(X^W)^(P *> (Q & W)) ) ==> pi(Palavra,Ltracos) ^[(extrai(Ltracos,quant,s)), P=..[Palavra,X]]. 126 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %_____________________________________________________________________ % % Meta Entrada Lexical para o pronome relativo %_____________________________________________________________________ elex(pr,[],[spr : [], comp: [], gap : []],_) ==> pr(_,[])^[]. %_____________________________________________________________________ % % Meta Entrada Lexical para expressões nominais que seleccionam % especificador e complemento %_____________________________________________________________________ elex(n,[nom:comp|Ltracos], [spr : [r(det,_,[],[spr:[]|_],_)], comp:[r(n,[marcado:s|_],[],[spr:[],comp:[],gap:[]],_)], gap : []], Y^X^P) ==> n(Palavra, Ltracos) ^[retira_elemento(Ltracos,scat:[comp:[marc:_]],_), P=..[Palavra,Y,X]]. %_____________________________________________________________________ % % Meta Entrada Lexical para expressões nominais com complemento e sem % especificador %____________________________________________________________________ elex(n,[nom:comp|Ltracos], [spr : [], comp: [r(n,[marcado:s|_],[],[spr:[]|_],_)], gap : []],(X^Q)^Y^(d(exi,Num,X,P & Q))) ==> n(Palavra, Ltracos) ^[retira_elemento(Ltracos,scat:[comp:[marc:_]],_), extrai(Ltracos,num,Num), P =..[Palavra,X,Y]]. %_____________________________________________________________________ % %Meta Entrada Lexical para nomes sem complementos %_____________________________________________________________________ elex(n,Ltracos1,[spr : [r(det,_,[],[spr:[]|_],_)], comp: [], gap : []], X^P) ==> n(Palavra,Ltracos) ^[heranca_de_tracos(Palavra,Ltracos,Ltracos1), \+(extrai(Ltracos,scat,[comp:[_]])), (extrai(Ltracos1,mass,s), extrai(Ltracos1,cont,s)); (\+(extrai(Ltracos1,mass,s))), P =..[Palavra,X]]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 127 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %_____________________________________________________________________ % % Meta Entrada Lexical para nomes sem complementos e sem especificador %_____________________________________________________________________ elex(n,Ltracos1,[spr : [], comp: [], gap : []],(X^W)^(d(exi,Num,X,P & W))) ==> n(Palavra, Ltracos) [extrai(Ltracos,num,Num), \+(extrai(Ltracos,scat,[comp:_])), heranca_de_tracos(Palavra,Ltracos,Ltracos1), P =..[Palavra,X]]. %_____________________________________________________________________ % % Meta Entrada Lexical para nomes que representam conceitos da % WordNet.PT %_____________________________________________________________________ elex(n,[num:sing],[spr : [], comp: [], gap : []],(X^Q)^d(exi,sing,X,P & W)) ==> r(ListaASCII) ^[name(Palavra2,ListaASCII), (n(Palavra1,_) ---> [Palavra2]; v(Palavra1,[tempo:inf]) ---> [Palavra2]), P =..[Palavra1,X]]. %_____________________________________________________________________ % % Meta Entrada Lexical para o verbo "ser" predicativo %_____________________________________________________________________ elex(v,Ltracos,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [r(C,_,[],_,_)], gap : []], X^X) ==> v(ser_v,Ltracos) ^[ extrai(Ltracos,tipo_v,pred), extrai(Ltracos,scat,[comp:C])]. %_____________________________________________________________________ % %Meta Entrada Lexical para verbos intransitivos %_____________________________________________________________________ elex(v,Ltracos,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [], gap : []], Y^P) ==> v(Palavra, Ltracos) ^[\+ retira_elemento(Ltracos,scat:_,_), P =..[Palavra,Y]]. 128 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %_____________________________________________________________________ % % Meta Entrada Lexical para verbos com um argumento interno %_____________________________________________________________________ elex(v,Ltracos1,[spr : [r(n,_,[],[spr:[]|_],_)], comp: [r(C1,_,[],[spr:[],comp:[],_],_)], gap : []],X^Y^P) ==> v(Palavra, Ltracos) ^[\+(extrai(Ltracos,tipo_v,pred)), \+(extrai(Ltracos,tipo_v,imp)), retira_elemento(Ltracos,scat:[comp:C1],Ltracos1), P =.. [Palavra,X,Y]]. %_____________________________________________________________________ % % Meta Entrada Lexical para verbos impessoais (há) %_____________________________________________________________________ elex(v,Ltracos,[spr : [], comp: [r(C,_,[],[spr:[],comp:[],_],_)], gap : []],Y^P) ==> v(Palavra, Ltracos) ^[extrai(Ltracos,tipo_v,imp), extrai(Ltracos,scat,[comp:C]), P =.. [Palavra,Y]]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % REGRAS LEXICAIS % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %_____________________________________________________________________ % % Regra Lexical para o tratamento do gap de complemento % (relativas de complemento) %_____________________________________________________________________ elex(v,Ltracos1,[spr : SPR, comp: [], gap : [r(_,_,[],_,Y)]],X^P) ==> elex(v,Ltracos1,[spr : SPR, comp: [r(_,_,[],_,Y)], gap : []],X^Y^P). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 129 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %_____________________________________________________________________ % % Regra Lexical para o tratamento de verbos impessoais com sujeito % nulo %_____________________________________________________________________ elex(v,Ltracos1,[spr : [], comp: [], gap : [r(n,_,[],[spr:[],comp:[],gap:[]],_)]],Sem) ==> elex(v,Ltracos1,[ spr : [], comp: [r(n,_,[],_,_)], gap : []],Sem). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % REGRAS SINTAGMÁTICAS % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % ____________________________________________________________________ Regra sintagmática 1 Promove X0 para X' ____________________________________________________________________ r(N,T,[],[spr : SPR, comp: [], gap : Gap],Sem) => [elex(N,T,[spr : SPR, comp: [], gap : Gap],Sem)]. %_____________________________________________________________________ % % Regra sintagmática 2 % % Orações relativas restrictivas %_____________________________________________________________________ r(vr,T,[compoe_sem(SPR,GAP,T1,SEM,SEMCOMP,T)], [spr : [], comp: [], gap : []], SEMCOMP) => [ r(pr,_,[],_,_), r(v,T1,[],[spr : SPR, comp: [], gap : GAP], SEM)]. 130 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos % % % % % % % ____________________________________________________________________ Regra sintagmática 3 Adjunção de um modificador (SP/VR) a um N’ e um quantificador a um N’’ ____________________________________________________________________ r(n,T1,[adjunto(C1,C), trata_spr(SPR,Sem,T1,T,Sem1,Sem2)], [spr:SPR, comp:[], gap:[]], Sem2) => [ r(C1,T1,[],[spr:SPR, comp:[], gap:[]],Sem1), r(C,T,[],[spr:[], comp:[], gap:[]],Sem)]. % % % % % % ___________________________________________________________________ Regra sintagmática 4 Adjunção com negação a SV ___________________________________________________________________ r(v,T1,[],[ spr:[SPR], comp:[], gap:GAP], X^Sem1) => [ elex(neg,_,_,Sem^Sem1), r(v,T1,[],[spr:[SPR], comp:[], gap:GAP],X^Sem)]. % % % % % % ___________________________________________________________________ Regra sintagmática 5 SNs marcados ___________________________________________________________________ r(n,[marcado:s|T1],[\+(extrai(T1,marcado,s)), verifica_relacional(Sem,T1,Sem1)], [spr:[], comp:[], gap:[]], Sem1) => [r(marc,_,[],[spr:[], comp:[], gap:[]],_), r(n,T1,[],[spr:[], comp:[], gap:[]],Sem)]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 131 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %_____________________________________________________________________ % % Regra sintagmática 6 % % Coordenações %_____________________________________________________________________ r(V,Ltracos5,[\+(extrai(Ltracos,coord,_)), testa_conjuncao(C, Ltracos2, Ltracos3), coordena(V,Sem1,Sem3,Ltracos3,Ltracos4,Sem4), insere_cabeca(Ltracos4,marcado:s,Ltracos5), verifica_sv(V,Ltracos,Ltracos2)], [spr : SPR, comp: [], gap : Gap], Sem4) => [ r(V,Ltracos,[],[spr: SPR, comp:[], gap: Gap],Sem1), r(conj,[conj:C],[],[spr : [], comp: [], gap : []],_), r(V,Ltracos2,[],[spr: SPR, comp:[], gap: Gap],Sem3)]. % % % % % % ___________________________________________________________________ Regra sintagmática 7 Especificador - núcleo ___________________________________________________________________ r(N,Ltracos3,[sem_spr(N,Ltracos,T1,Y^Sem,Sem1,Ltracos3,Sem2)], [spr:[], comp:[], gap:GAP], Sem2) => [ r(C,Ltracos,[],SCAT,Sem1), r(N,T1,[],[spr:[r(C,Ltracos,[],SCAT,Sem1)], comp:[], gap:GAP],Y^Sem)]. 132 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos % % % % % % __________________________________________________________________ Regra sintagmática 8 Verbo existir com inversão de sujeito ___________________________________________________________________ r(v,Ltracos1,[extrai(T1,tipo_v,existe), unifica(T1,Ltracos,Ltracos1),subs(Sem1,Sem2,Sem3)], [spr:[], comp:[], gap:[]], Sem3) => [r(v,T1,[],[spr:[r(n,Ltracos,[],[spr:[], comp:[], gap:[]],Sem1)], comp:[], gap:[]],Sem2), r(n,Ltracos,[],[ spr:[], comp:[], gap:[]],Sem1)]. % % % % % % ___________________________________________________________________ Regra sintagmática 9 Gap à direita de um núcleo verbal ___________________________________________________________________ r(v,Ltracos,[subs(Sem1,Sem2,Sem3)], [spr :[], comp:[], gap :[]], Sem3) => [ r(C,Ltracos,[],SCAT,Sem1), r(v,_,[],[spr :[], comp:[], gap:[r(C,Ltracos,[],SCAT,_)]],Sem2)]. %________________________________________________________________ % % Regra sintagmática 10 % Predicados com um complemento in situ %________________________________________________________________ r(N,T1,[faz_sem(Sem2,Sem1,T1,Sem3), verifica_comp(N,T1,L)],[spr : SPR, comp: [], gap : Gap], Sem3) => [elex(N,T1,[spr : SPR, comp:[r(C2,L,[],SCAT2,Sem2)], gap : Gap],Sem1), r(C2,L,[],SCAT2,Sem2)]. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 133 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PARSER TABULAR ASCENDENTE % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :-dynamic edge/4. parse(R,Expr1):retractall(edge(_,_,_,_)), subst_contrac(Expr1,Expr2), testa_qual(Expr2,Expr), statistics(runtime,_), start_chart(1,Vn,Expr), statistics(runtime,[_,T]), Time is T / 1000, write('Tempo de análise: '),write(Time), write(' segundos.'),nl, retractall(edge(_,_,_,[_|_])), edge(1,Vn, R ,[]). start_chart(V0,Vn,[Word|Words]):V1 is V0 + 1, foreach( (lexema(Word,Category)), add_edge(V0,V1,Category,[])), start_chart(V1,Vn,Words). foreach(X,Y):call(X), do(Y), fail. foreach(_,_):- true. do(Y):- Y, !. add_edge(V0,V1,Category,Categories):edge(V0,V1,Category,Categories),!. add_edge(V1,V2,Category0,[]):obj_atrasados(Category0,Category1), asserta(edge(V1,V2,Category1,[])), foreach( Category2 => [Category1|Categories], add_edge(V1,V1,Category2,[Category1|Categories])), foreach(edge(V0,V1,Category2,[Category1|Categories]), (add_edge(V0,V2,Category2,Categories))). add_edge(V0,V1,Category1,[Category2|Categories]):asserta(edge(V0,V1,Category1,[Category2|Categories])), foreach(edge(V1,V2,Category1,[]), add_edge(V0,V2,Category1,Categories)). 134 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % PREDICADOS AUXILIARES % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %--------------------------------------------------------------------% % % % Parser % %--------------------------------------------------------------------% /* ================================================================== testa_qual(+LPalavrasintoduzidas,-LPalavrasaAnalisar) Predicado que trata a elisão do verbo “ser” em interrogatives pronominais com “qual” ====================================================================*/ testa_qual([Word,Word1|L],[Word,é,Word1|L]):Word = qual, \+(Word1 = é). testa_qual([Word,Word1|L],[Word,são,Word1|L]):Word = quais, \+(Word1 = são). testa_qual(L,L). /* ================================================================== lexema(+Palavra, -Meta-entradaLexical) Predicado que aplica as meta entradas lexicais e as regras lexicais aos lexemas presentes na interrogativa ===================================================================*/ lexema(Word,elex(C,Ltracos,S,Sem)):(EL ---> [Word]), (elex(C,Ltracos,S,Sem) ==> EL^Prolog), executa(Prolog). lexema(Word,elex(C,Ltracos1,S1,Sem1)):(EL ---> [Word]), (elex(C,Ltracos,S,Sem) ==> EL^Prolog), executa(Prolog), (elex(C,Ltracos1,S1,Sem1) ==> elex(C,Ltracos,S,Sem)). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 135 INQUER – Interacção Pessoa – Máquina em Linguagem Natural %--------------------------------------------------------------------% % % % Semântica % %--------------------------------------------------------------------% /* ================================================================== compoe_sem(+ListaSPR,+ListaGap,+LtracosInicial,+RepSemInicial, -RepSemFinal,-LtracosFinal) Predicado que faz a semântica das relativas com gap de complemento ou de sujeito ===================================================================*/ compoe_sem([],[r(n,_,_,_,X)],T,X^S,X^S,[]):(extrai(T,tipo_v,existir); extrai(T,tipo_v,imp)),!. compoe_sem([],[r(_,_,_,_,X)],_,S,X^S,[]). compoe_sem([r(_,_,_,_,X)],[],T,X^S,X^S,T). /* =================================================================== trata_spr(+ListaSPR,+RepSem1,+Ltracos1,+Ltracos2,+RepSem2, -RepSemFinal) Predicado que que faz a semântica das adjunções de modificadores a N’ e de quantificadores a N’’ ===================================================================*/ trata_spr([],X^Sem,T1,T,(X^Y)^d(exi,N,X,P & Q), (X^Y)^d(exi,N,X,(P & Sem & Q))):unifica(T1,T,_). trata_spr([],Formula,T1,T,(X^Res)^(X^Amb)^d(todo,N1,X,Res>Amb),Sem2):unifica(T1,T,_), abs_l(Formula,d(o,N,M,R > A)& Det1,L), trata_quant(Det1,(X^Res)^(X^Amb)^d(todo,N1,X,Res>Amb),Detfinal), abs_l(Sem2,d(todo,N,M,R > A)&Detfinal,L). trata_spr([],(X^Amb)^d(o,_,X,Res>Amb),T1,T, (X^Res)^(X^Amb)^d(todo,N1,X,Res > Amb) , (X^Amb)^d(todo,N1,X,Res > Amb)):unifica(T1,T,_). trata_spr([_],X^Sem,T1,T,X^Sem1,X^(Sem1 & Sem)):unifica(T1,T,_) 136 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /* ================================================================== trata_quant(+RepSem,+RepSemQuantificador,-NovaRepSEm) Predicado que distribui o quantificador “todo” por toda a estrutura Quantificada (escopo do quantificador “todo”) ====================================================================*/ trata_quant(d(exi,N,M,R & A)&Det1,(X^Res)^(X^Amb)^d(Z,_,_,Res > Amb), d(Z,N,M,R > A)&Detfinal):trata_quant(Det1,(X^Res)^(X^Amb)^d(Z,_,_,Res > Amb),Detfinal). trata_quant(d(exi,N,M,R & A),(X^Res)^(X^Amb)^d(Z,_,_,Res > Amb), d(Z,N,M,R > A)). /*=================================================================== sem_spr(+CatNúcleo,+LtracosEspecificador,LtracosNúcleo,+RepSEmNúcleo, +RepSemEspecificador,-LtracosFinal,-RepSemFinal) Predicado que compõe a semântica do núcleo com a do seu especificador ===================================================================*/ sem_spr(v,Ltracos,T1,Y^Sem,Sem1,Ltracos3,Sem2):unifica(T1,Ltracos,Ltracos3), subs(Sem1,Y^Sem,Sem2). sem_spr(_,Ltracos,T1,Sem,Sem^Sem1,Ltracos3,Sem1):unifica(T1,Ltracos,Ltracos3). /*============================================================== verifica_relacional(+RepSem1,Ltracos1,-RepSemFinal) Predicado que permite a semântica de hipónimo do hipónimo e excluí a de hipónimo do gato ===============================================================*/ verifica_relacional((X^Y)^d(exi,N,X,S&Z),T,(X^Y)^d(exi,N,X,S&Z)):\+extrai(T,nom,comp). verifica_relacional(Sem,T,Sem):extrai(T,nom,comp). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 137 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*=============================================================== faz_sem(+RepSem1,+RepSem2,+Ltraços2,-RepSemFinal) Predicado que faz a semântica do nucleo mais complemento. O primeiro caso serve para tratar o verbo "haver" que não tem sujeito (impessoal) O segundo caso serve para todos os outros verbos ===============================================================*/ faz_sem(Sem2,Sem1,T1,Sem3) :extrai(T1,tipo_v,imp), subs(Sem2,Sem1,Sem3). faz_sem(Sem2,X^Sem1,_,X^Sem3) :subs(Sem2,Sem1,Sem3). /* ================================================================ verifica_comp(+cat,+Ltracos,+Ltracos2) Predicado que verifica se um verbo selecciona nomes que seleccionam complementos ==================================================================*/ verifica_comp(v,L1,L2):member(tipo_v:igual,L1),!, member(nom:comp,L2). verifica_comp(v,L1,L2):\+(member(tipo_v:igual,L1)),!, \+(member(nom:comp,L2)). verifica_comp(_,_,_). /* =============================================================== coordena(+Cat,+RepSem1,+RepSem2,+Ltraços1,+Ltracos2,-RepSEm) trata a coordenação de sns ou de svs. Distribui o quantificador quantos por todos os SNs coordendados ===============================================================*/ coordena(n,X^Sem1,Y^Sem2,Ltracos,[num:plu|Ltracos2],Sem3):abs_l(Sem2,Sem4,A), abs_l(Sem1,Sem5,_), verifica_det(Sem5,Sem4,Sem6), retira_elemento(Ltracos,num:_,Ltracos2), (A==[] -> coord_sn(X^Sem1,Y^Sem6,Sem3); parte_lista(A,C),coord_sn(X^Sem1,Y^C^Sem6,Sem3)). coordena(C,Sem1,Sem2,Ltracos,Ltracos,Sem3):\+C==n, coord_sx(Sem1,Sem2,Sem3). 138 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /*================================================================== verifica_det(+RepSemsemVariáveisAbstraídas1, +RepSemsemVariáveisAbstraídas2, -RepSemsemVariáveisAbstraídasFinal) Predicado que distribui a a quantificação do determinante quantos sobre todas as estruturas quantificadas (coordenações) ===================================================================*/ verifica_det(quantos(_)*>_,d(exi,_,X,A&D),quantos(X)*>A&D). verifica_det(A,Sem1&Sem3,Sem2&Sem4):verifica_det(A,Sem1,Sem2), verifica_det(A,Sem3,Sem4). verifica_det(_,d(A,B,C,D),d(A,B,C,D)). verifica_det(_,quantos(A)*>B,quantos(A)*>B). /* ================================================================== insere_cabeca(+Listatracos,+Traço,-Listacomtracoàcabeça) Predicado que insere um determinando traço, presente na lista, na cabeça da lista. Se esse traço não estiver presente devolve a própria lista ===================================================================*/ insere_cabeca(L,E,[E|L2]):retira_elemento(L,E,L2),!. insere_cabeca(L,_,L). /* ================================================================== verifica_sv(+Categoria,+Listatraços,+Listatraços2) Predicado que verifica se duas listas de traços de constituintes verbais contêm o mesmo valor para o atributo número. ===================================================================*/ verifica_sv(v,Ltracos,Ltracos2):extrai(Ltracos,num,N), extrai(Ltracos2,num,N). verifica_sv(C,_,_):- C\==v. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 139 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*=================================================================== testa_conjuncao(+TipoConj,+ListaTracos,-ListaTracos) Predicado que verifica o tipo de coordenação: se o segundo sn é simples e a conjunção for um e; e se o sn for composto e a conjunção uma vírgula ====================================================================*/ testa_conjuncao(f,Ltracos,[coord:s|Ltracos]):\+(extrai(Ltracos,conj,_)). testa_conjuncao(nf,Ltracos,[coord:s|Ltracos]):extrai(Ltracos,coord,s). /* =============================================================== coord_sn(+RepSem1,+RepSem2,-RepSemFinal) Predicado que devolve a representação semântica de SNs coordenado ==================================================================*/ coord_sn(A^SN1,SN2,A^Fr) :abs_l(SN2,SN2s,L), aplica(L,(SN1 & SN2s), Fr). /* =================================================================== abs_l(+RepSem,-RepSemsemVariáveisAbstraídas, -ListaVariáveisAbstraídas) Predicado que, dada uma Fórmula com abstracções, devolve essa Fórmula sem abstracções e uma Lista com todas as abstracções da Fórmula inicial ====================================================================*/ abs_l(A^F,Fr,[A|R]):abs_l(F,Fr,R),!. abs_l(F,F,[]). /*=================================================================== aplica(+ListaVariaveisAbstraidas,+RepSemsemVariaveisAbstraídas, -RepSemcomVariaveisAbstraídas) Predicado que, dada uma Lista de abstracções e uma Fórmula, devolve a aplicação das abstracções de LA em F ====================================================================*/ aplica([A|L],F,A^Fr) :aplica(L,F,Fr). aplica([A],F,A^F). 140 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /*============================================================= coord_sx(+RepSem1,+RepSem2,-RepSEmFinal) Predicado que faz a construção da representação semântica da coordenação de sintagmas não nominais ==============================================================*/ coord_sx(SV1a,SV2a,F):retira_abs(SV1a,A,SV1), retira_abs(SV2a,A,SV2), c(A,SV1,SV2,F). /*=================================================================== retira_abs(+RepSem,-VariavelmaisExternaAbstraida, -RepSemsemVariavelmaisExternaAbstraida) Predicado que dada uma representação semântica, devolve a sua variável mais externa abstraída e a restante representação semântica ===================================================================*/ retira_abs(A^F,A,F). /*========================================================== c(+Variavel,+RepSemSX1,+RepSemSX2,-RepSemSXFinal) Predicado que aplica a mesma variável a duas representações semânticas de SXs. (coordenação de SXs) ===========================================================*/ c(A,SX1,SX2,A^(SX1 & SX2)). /*=================================================================== subs(+RepSem1,+RepSem1,-RepSemFinal) Predicado que, dadas duas representações semânticas, devolve uma representação semântica resultado da substituição das suas variáveis abstraidas ===================================================================*/ subs(X^F,X,F):- var(X). subs((X^A)^F,V^SV,R) :substitute(X,V,SV,A),!, subs(F,V^SV,R). subs(F,_^_,F). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 141 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*============================================================== substitute(+Termo,+Variavel,+RepSem,-RepSemFinal) Predicado que dado um termo, uma variável e uma representação semântica substitui todas as ocorrências da Variavel pelo Termo ===============================================================*/ substitute(Term,Var,Exp,Result):Exp==Var, !, Result=Term. substitute(_Term,_Var,Exp,Result):\+ compound(Exp), !, Result=Exp. substitute(Term,Var,Formula,Result):compose(Formula,Functor,[Exp,F]), memberList(Functor,[todos,o,um,algum,exi]), !, (Exp==Var, !, Result=Formula; substitute(Term,Var,F,R), compose(Result,Functor,[Exp,R])). substitute(Term,Var,Formula,Result):compose(Formula,Functor,ArgList), substituteList(Term,Var,ArgList,ResultList), compose(Result,Functor,ResultList). substituteList(_Term,_Var,[],[]). substituteList(Term,Var,[Exp|Others],[Result|ResultOthers]):substitute(Term,Var,Exp,Result), substituteList(Term,Var,Others,ResultOthers). /* ============================================================== memberList(+Elemento,+Lista) Predicado que verifica se um dado elemento pertence a uma lista ================================================================*/ memberList(X,[X|_]). memberList(X,[_|Tail]):memberList(X,Tail). 142 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /*================================================================= compose(+Predicado,-Simbolo,-ListadeArgumentos) Predicado que, dado um predicado devolve o seu símbolo e uma lista com os seus argumentos ===================================================================*/ compose(Term,Symbol,ArgList):Term =.. [Symbol|ArgList]. /*=================================================================== adjunto(+cat,+cat2) Predicado que indica quais as categorias que podem estar em adjunção ====================================================================*/ adjunto(n,p). adjunto(n,vr). adjunto(det,n). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 143 Anexos ANEXO 7 – EXEMPLOS DO PROCESSAMENTO SINTÁCTICO E SEMÂNTICO DE INTERROGATIVAS • Os gatos são mamíferos? SV (F) “ os gatos são mamíferos” d(o, plu, A, gato(A)&d(exi, plu, B, mamífero(B)&ser(A, B))) SN SV “ os gatos” (A^C)^d(o, plu, A, gato(A)&C) “ são mamíferos” D^d(exi, plu, B, mamífero(B)&ser(D, B)) 1 2 1 D N’ N “ gatos” E^gato(E) “ os” (A^F)^(A^C)^d(o, plu, A, F&C) 2 V’ SN V N’ “ são” N H^D^são(H,D) (B^G)^d(exi, plu, B, mamífero(B)&G) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 145 INQUER – Interacção Pessoa – Máquina em Linguagem Natural • Quantos animais miam e andam? SV (F) “ quantos animais miam?” quantos(A)*>animal(A)& (miar(A)&andar(A)) SN SV “ quantos animais” “ miam e andam” (A^X)^(quantos(A)*>animal(A)&X) Z^(miar(Z)&andar(Z)) 2 1 1 D N’ N “ animais” A^animal(A) “ quantos” (A^Y)^ (A^X)^ (quantos(A)*>Y&X) 2 V’ V “ miam” B^miar(B) 146 V’ Conj V e “ andam” C^andar(C) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos • Quais são os hipónimos de “felino” que não rugem? SV (F) “ quais são os hipónimos de “felino” que não rugem?” qual(A)*>d(o,plu,B,d(exi,sing,C,felino(C)&hipónimo(B,C))& ~(rugir(B))>igual(A,B)) SN SV “ quais ” “ são os hipónios de “felino que não rugem” (A^X)^ (qual(A)*>X) E^d(o,plu,B,d(exi,sing,C,felino(C)& hipónimo(B,C))&~(rugir(B))>igual(E, B)) 1 1 V N’ N “ os hipónimos de “felino” que não rugem” (B^Y)^d(o,plu,B,d(exi,sing,C,felino(C)& “ são” hipónimo(B, C))& ~(rugir(B))>Y) E^T^igual(E, T) 2 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 147 INQUER – Interacção Pessoa – Máquina em Linguagem Natural 2 N’ VR N’ “ os hipónimos de “felino” ” “ que não rugem” (B^R)^d(o,plu,B,d(exi,sing,C, F^~(rugir(F)) felino(C)&hipónimo(B,C))>R) 3 3 D N’ “ os” “ hipónimos de “felino” ” (B^Q)^(B^R)^d(o,plu,B,Q>R) W^d(exi,sing,C,felino(C)&hipónimo(W,C) 4 4 N 148 Marc “ hipónimos” “ de “felino” ” G^H^hipónimo(G,H) (C^S)^d(exi,sing,C,felino(C)&S) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos ANEXO 8 – IMPLEMENTAÇÃO DO ALGORITMO DE CONVERSÃO /*================================================================= Predicado topo do módulo I. Recebe uma string em Língua natural e constrói a respectiva representação semântica ===================================================================*/ go:- read_line(S), analisador(S). /* =========================================================== read_line(-ListadePalavrasIntoduzidas) Predicado que lê, um a um, os caracteres introduzidos pelo Utilizador devolvendo uma lista de palavras =============================================================*/ read_line(Line):read_chars(Chars), processa(Chars,Line). /*===================================================== Predicado que aplica a gramática à string introduzida =====================================================*/ analisador(stop). analisador(S):nl, write('_________________________________________________'), nl, findall(S1,verifica_lexico(S,S1),F), reconhecedor(F,_),!, nl, write('_________________________________________________'), nl,nl, go. Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 149 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*=================================================================== reconhecedor(+ListaStrings) Predicado que aplica as regras da gramática a cada string resultante da ambiguidade lexical ====================================================================*/ reconhecedor([X|L]):semf(_,X), reconhecedor(L). reconhecedor([]). /*================================================================= sem(-RepSem,+ListaPalavras) Predicado que aplica uma lista de palavras às regras da gramática devolvendo uma interpretação semântica ==================================================================*/ semf(L,F):findall(A,(parse(r(v,_,[],[spr:[],comp:[],gap:[]],A),F), output_pprint(A)),L). /* ======================================================== output(+RepSem) Predicado que imprime no ecrã uma representação semântica ==========================================================*/ output_pprint(A):copy_term(A,A1), numbervars(A1,0,_),nl, pprint(A1,0),nl,nl,!. /*================================================================== read_Chars(+Caracter) Predicado que lê um caracter do ecrã e devolve a sua representação ASCII ===================================================================*/ read_chars( Chars ):get0(C), read_chars_2( C, Chars ). 150 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos read_chars_2(Ch, []) :end_of_input_char(Ch). read_chars_2(C, [C|T]):read_chars(T). /*=================================================================== processa(+ListacaractersAscii,-Listade PalvrasIntroduzidas) Predicado que recebe uma lista de caracteres ascii e retorna a lista de palavras correspondente ===================================================================*/ processa([102,105,109|_],stop). processa(Chars,Line):trata_virgula(Chars,Chars2), trata_inter(Chars2,Chars3), cicle(Chars3,L_char), char(L_char,Line). /* =================================================== Facto que indica o fim do input do utilizador (enter) =====================================================*/ end_of_input_char(10). /*==================================================================== trata_virgula(+ListaCaracteresAscii,-ListaCaracteresAscii) Predicdo que coloca um espaço em branco antes e depois de uma vírgula (se ainda não estiver) ====================================================================*/ trata_virgula([X,44,Y|L],[X,32,44,32,Y|L2]):X \== 32, Y \== 32, !, trata_virgula(L,L2). trata_virgula([X,44,32|L],[X,32,44,32|L2]):X \== 32,!, trata_virgula(L,L2). trata_virgula([32,44,Y|L],[32,44,32,Y|L2]):Y \== 32,!, trata_virgula(L,L2). trata_virgula([X|L],[X|L2]):trata_virgula(L,L2). trata_virgula([],[]). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 151 INQUER – Interacção Pessoa – Máquina em Linguagem Natural /*=================================================================== verifica_inter(+ListaCaracteresAscii,-ListaCaracteresAscii) Predicado que verifica se o último caracter da string de input é um ? ====================================================================*/ trata_inter(L,L2):last(63,L), delete(L,63,L2). /*=================================================================== cicle(+ListacracteresAscii,-ListaCaracteresAscciSeparadosemPalavras) Predicado que recebe uma lista Ascii e devolve outra lista cujos elementos são sequências de caracteres ascii (palavras) ====================================================================*/ cicle([],[]). cicle(F,[Y|L]):break(F,Y,T), cicle(T,L),!. /*=================================================================== break(+ListaCaractersAscii,-ListaTemp,-ListaCaracteresAscii) Recebe uma lista de ASCII correspondente à string de input, criando uma nova lista cujos elementos são sequências de símbolos ASCII correspondentes a palavras ====================================================================*/ break([],[],[]). break([34|L],[34|L4],L2):procura34(L,L4), retira_elems_lista(L,L4,L3), break(L3,_,L2). break([32|L],[],L):- !. break([X|L],[X|L2],L3):- break(L,L2,L3). /*================================================================== procura_34(+ListaCaracteresAscii,-ListaApartirdoElemento34) Predicado que recebe uma lista ASCII, procura o elemento 34 (correspondente a aspas) e devolve a lista a partir desse elemento ===================================================================*/ procura34([34|_],[34]):-!. procura34([X|L],[X|L2]):procura34(L,L2). 152 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /*================================================================= char(+ListaSequênciasAscii,-ListaPalavras) Predicado que recebe uma lista de sequências ascii e devolve uma lista das palavras correspondentes ==================================================================*/ char([],[]):-!. char([[34|X]|L],[Y|L2]):retira_aspas([34|X],34,Y), char(L,L2),!. char([X|L],[Y|L2]):name(Y,X), char(L,L2). /*================================================================== retira_aspas(+ListaCarateresAscii,+elemento, -ListaSemOcorresnciasdeElemento) Predicado que recebe uma lista de caracteres Ascii e um elemento e devolve uma lista sem qualquer ocrrência desse elemento ===================================================================*/ retira_aspas([],_,[]). retira_aspas([X|L],X,L2):retira_aspas(L,X,L2),!. retira_aspas([Y|L],X,[Y|L2]):retira_aspas(L,X,L2). /*==================================================================== verifica_lexico(+ListaPalavras,-ListaPalavras) Predicado que verifica se todas as palavras da lista estão presentes na base de dados lexical ====================================================================*/ verifica_lexico([],[]). verifica_lexico([Word1,Word2|L],L2):atom(Word1), atom(Word2), concat_atom([Word1,Word2],' ',Word3), verifica_lexico([Word3|L],L2). verifica_lexico([ASCII|L],[ASCII|L2]):is_list(ASCII),!, verifica_lexico(L,L2). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 153 INQUER – Interacção Pessoa – Máquina em Linguagem Natural verifica_lexico([Word|L],[Word|L2]):(_ ---> [Word]), !, verifica_lexico(L,L2). /*================================================================== pprint(+RepSem,+Tab) Predicado que imprime uma representação semântica indentada no ecrã ====================================================================*/ pprint(V,_):- var(V), write(V). pprint(d(Q,_,X,F),C) :tab(C),write(Q), write('('), write(X), write(','),nl,!, Cn is C+9, pprint(F,Cn), write(' )'). pprint(A *> B,C) :pprint(A,C),!, write('*>'),nl,nl, C1 is C + 10, pprint(B,C1). pprint(~(B),C) :tab(8), write(' ~ ('), nl, tab(5), pprint(B,C), write(')'). pprint(A & B,C) :pprint(A,C),!,nl, tab(C),write('&'),nl, pprint(B,C). pprint(A > B,C) :pprint(A,C),!, write(' -> '),nl, pprint(B,C). pprint(P,C):nonvar(P), P=..[Symb|X],!, tab(C), write(Symb),write('('), imprime(X), write(')'). 154 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos /*========================================================= imprime(+Lista) Predicado que imprime elemento de uma lista entre virgulas ===========================================================*/ imprime([]). imprime([X]):- write(X). imprime([X,Y|Z]):- write(X),write(’,’),imprime([Y|Z]). /* ================================================================== subst_contract(+ListaPalavras,-ListadePalavrasSemContraccões) Predicado que substitui as contracções presentes na lista pelos seus elementos básicos ====================================================================*/ subst_contrac([],[]). subst_contrac([X|L],[Z,Y|L2]):(contrac(X) ===> [Z,Y]),!, subst_contrac(L,L2). subst_contrac([X|L],[X|L1]):subst_contrac(L,L1). Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 155 Anexos ANEXO 9 – EXEMPLOS DA REPRESENTAÇÃO SEMÂNTICA DE INTERROGATIVAS EM PORTUGUÊS UTILIZANDO O ALGORITMO DE CONVERSÃO go. |: todos os gatos miam? _________________________________________________ Tempo de análise: 0.07 segundos. todo(A, gato(A) -> miar(A) ) ________________________________________________ |: todos os gatos e cães são animais? _________________________________________________ Tempo de análise: 0.161 segundos. todo(A, gato(A) -> exi(B, animal(B) & ser_v(A,B) ) ) & todo(C, cão(C) -> exi(B, animal(B) & ser_v(C,B) ) ) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 157 INQUER – Interacção Pessoa – Máquina em Linguagem Natural todo(A, gato(A) -> exi(B, animal(B) & ser_v(A,B) ) ) & exi(C, cão(C) & exi(B, animal(B) & ser_v(C,B) ) ) _________________________________________________ |: quantos gatos e cães são animais? _________________________________________________ Tempo de análise: 0.13 segundos. quantos(A)*> gato(A) & exi(B, animal(B) & ser_v(A,B) ) & quantos(C)*> cão(C) & exi(B, animal(B) & ser_v(C,B) ) _________________________________________________ 158 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG Anexos |: o hiperónimo do hiperónimo de cão é animal? _________________________________________________ Tempo de análise: 0.19 segundos. o(A, o(B, exi(C, cão(C) & hiperónimo(B,C) ) -> hiperónimo(A,B) ) -> exi(D, animal(D) & ser_v(A,D) ) ) _________________________________________________ |: os cães,gatos e aranhas que são animais têm patas? ___________________________________________________________ Tempo de análise: 0.3 segundos. o(A, cão(A) -> exi(B, pata_2(B) & ter(A,B) ) ) & exi(C, gato(C) & exi(B, pata_2(B) & ter(C,B) ) ) & exi(D, aranha(D) & exi(E, animal(E) & ser_v(D,E) ) & exi(B, pata_2(B) & ter(D,B) ) ) Grupo de Computação do Conhecimento Léxico-Gramatical – CLG 159 INQUER – Interacção Pessoa – Máquina em Linguagem Natural o(A, cão(A) -> exi(B, pato(B) & ter(A,B) ) ) & exi(C, gato(C) & exi(B, pato(B) & ter(C,B) ) ) & exi(D, aranha(D) & exi(E, animal(E) & ser_v(D,E) ) & exi(B, pato(B) & ter(D,B) ) ) _________________________________________________ |: os elefantes têm membros? _________________________________________________ Tempo de análise: 0.07 segundos. o(A, elefante(A) -> exi(B, membro(B) & ter(A,B) ) ) _________________________________________________ 160 Grupo de Computação do Conhecimento Léxico-Gramatical – CLG