Algoritmo de Tradução de Interrogações Lógicas para SQL Porfírio P. Filipe1, Nuno J. Mamede2 1Inst. Sup. de Eng. de Lisboa, R. Conselheiro Emídio Navarro, 1949-014 Lisboa, Portugal [email protected], Tel: +351.1.8317211 2Instituto Superior Técnico, Av. Rovisco Pais, 1049-001 Lisboa, Portugal [email protected], Tel: +351.1.8419159 ARQUITECTURA DO SISTEMA A arquitectura do sistema de interrogações em língua natural representada na Figura 1 é baseada numa linguagem de representação intermédia, designada por linguagem de interrogação lógica (LIL), para a qual a pergunta em língua natural é transformada antes de ser realizada a tradução para uma interrogação SQL. A linguagem LIL expressa o significado da pergunta em conceitos de alto nível, independentes da estrutura da base de dados do domínio [1][2]. A arquitectura do sistema pode ser dividida em dois módulos. O primeiro módulo processa a língua natural (componente linguística), onde a pergunta é submetida à análise morfológica, sintáctica e semântica sendo obtidas como resultado uma ou mais interrogações LIL que correspondem às possíveis interpretações da pergunta formulada em língua natural. Face á dimensão do domínio e à flexibilidade da língua natural é normal existirem várias interpretações para a mesma pergunta. Sistema de Interrogações Edite Pergunta em Língua Natural Português, Francês, Inglês,... Descoberta do Contexto da Pergunta Análise Morfológica Informação Sobre Palavras Modelo Conceptual Análise Sintáctica Hierarquia de Tipos Estrutura Sintáctica (árvore sintáctica) Representação Geral Análise Semântica Interrogação Lógica Apoio à Tradução (linguagem LIL) Tradução LIL/SQL Dados de Apoio á Tradução LIL/SQL Interrogação SQL (SELECT) Acesso Via ODBC Base de Dados do Domínio SGBD Resposta Consulta que são passadas ao sistema de gestão da base de dados do domínio com o objectivo de obter dados para produzir as respostas. A principal vantagem desta arquitectura é a separação completa entre a componente linguística e o conhecimento dependente da base de dados do domínio. A portabilidade do sistema de interrogações para outro domínio (outra base de dados do domínio) é garantida pelo preenchimento adequado do modelo conceptual. O processamento da pergunta em língua natural é feito por etapas: a partir da língua natural é gerada uma árvore sintáctica que permite a construção de uma interrogação lógica sendo esta finalmente transformada, aplicando o algoritmo de tradução de uma interrogação lógica para SQL, numa instrução SELECT. A comunicação com o sistema de gestão da base de dados do domínio é independente da realização prática porque é executada através de um driver ODBC. O modelo conceptual é a componente do sistema de interrogações que representa simbolicamente os constrangimentos conceptuais associados ao domínio da aplicação [4]. O modelo conceptual tem três componentes: (i) uma hierarquia de tipos que contém a informação sobre a herança; (ii) uma representação geral que é uma representação explícita dos constrangimentos conceptuais do domínio e (iii) dados de apoio à tradução LIL/SQL. Durante a análise semântica é seleccionada uma interpretação da pergunta que respeite os constrangimentos conceptuais do domínio. Por exemplo, se for perguntado ao sistema de interrogações: “Quais os hotéis com piscina com água salgada?” existem duas interpretações possíveis. Pode ser interpretado que “água salgada” se refere ao “hotel” ou que se refere à “piscina”. São executadas duas consultas ao modelo conceptual e a consulta que pergunta se a entidade “hotel” tem a propriedade “água salgada” vai falhar. O facto “hotel tem água salgada” é irrelevante e por isso não é representado no modelo conceptual. Quando uma pergunta não tem pelo menos uma interpretação que respeita os constrangimentos conceptuais do domínio, diz-se que está semanticamente incorrecta. Interpretação da Resposta Figura 1 - Arquitectura do Sistema de Interrogações O segundo módulo está relacionado com o processamento dependente da estrutura da base de dados do domínio, traduzindo as interrogações LIL para interrogações SQL A LINGUAGEM FONTE A linguagem LIL é inspirada no formalismo apresentado no projecto de MASQUE/SQL [2] e foi descrita em [6][7][8]. A sintaxe da linguagem LIL é a de uma lógica de primeira ordem com o poder expressivo de uma lógica de predicados que permite representar, de uma forma bastante intuitiva, os conceitos do mundo real: (a) Um termo pode ser uma constante uma variável ou um símbolo de função aplicado a um tuplo de termos. As constantes representam objectos do mundo, incluindo objectos abstractos como eventos e situações. Exemplos de constantes: Ritz, sauna, -5 e 1997. Exemplos de variáveis: _3 e X. (b) Uma fórmula primitiva é constituída por um símbolo de predicado (que se escreve como um termo) e por um ou dois argumentos (termos). Uma fórmula primitiva tem a seguinte sintaxe: simbolo_de_predicado(termo1[, termo2]) definidas cinco funções para explorar a estrutura de dados auxiliar que devolvem uma cadeia de caracteres. Função TRANSLATION(X,Y,Z) Todos os argumentos são símbolos. O primeiro argumento refere uma associação, o segundo uma entidade e o terceiro uma entidade, uma propriedade, um valor de propriedade, ou um nome próprio. O caracter ‘_’ pode ser usado para expressar o conceito “qualquer símbolo”. Esta função devolve a tradução do facto (parte da pergunta) especificado nos argumentos. São exemplos de fórmulas primitivas: hotel(X) e ter(X, sauna) (c) Uma expressão LIL é um conjunto de fórmulas LIL separadas por vírgulas e tem a seguinte sintaxe: fórmula1, …, fórmulan É exemplo de uma expressão LIL: autor(X), ter(X, livro) (d) Um conectivo lógico liga duas fórmulas LIL originando outra fórmula. A conjunção (&) com a seguinte sintaxe: &(prd1(trm1,trm2),…,prdn(trmn1,trmn2)) A disjunção (V) com a seguinte sintaxe: V(prd1(trm1,trm2),…,prdn(trmn1,trmn2)) São exemplos de utilização de conectivos lógicos: &(ter(X, restaurante), ter(X, sauna)) V(ter(X, livro), ter(X, disco)) (e) Fórmulas predefinidas na linguagem LIL: EXACT(termo1, termocte) (igual) SUP(termo1, termocte) (maior) INF(termo1, termocte) (menor) TRADUÇÃO Estrutura de Dados Auxiliar Os dados de apoio à tradução da linguagem LIL para SQL dependentes da estrutura da base de dados do domínio são representados na Figura 2 (a sombreado) como uma extensão do modelo conceptual. A notação usada na Figura 2 é o IDEF1X (Integration DEFinition for Information Modeling). Função CLASS(X) Usando a coluna CLASSIFICATION.DESG_CLASS, esta função indica se o argumento, um símbolo, é representado por uma tabela ‘Table’ ou por uma coluna ‘Column’ na base de dados do domínio. Função DEFAULT(X) Esta função é usada para determinar as propriedades omitidas ou entidades omitidas dependendo do tipo do argumento indicado: Se o argumento é uma propriedade devolve a entidade omitida associada a essa propriedade. Se o argumento é uma entidade devolve a propriedade omitida associada a essa entidade. Esta função devolve o símbolo representado na coluna DEFAULT.SYMBOL2 quando o seu argumento figurar na coluna DEFAULT.SYMBOL1. Função EQUIVALENT(X) O argumento desta função pode ser um símbolo de propriedade ou de entidade retornando a expressão que foi usada na definição desse argumento. Se na definição do argumento figurar um símbolo de função é devolvido o nome da função existente na coluna CLASSIFICATION.DESC_CLASS e os argumentos presentes na tabela EQ_SYMBOL, caso contrário é devolvido o próprio argumento. Função FORMATTER(X) O argumento desta função refere uma propriedade e devolve o nome de uma função. A função identificada nesta consulta deve ser utilizada para apresentar ao utilizador os dados associados à propriedade indicada em argumento de forma adequada. O ALGORITMO DE TRADUÇÃO Figura 2 – Modelo Relacional da Estrutura de Dados Funções Auxiliares Para definir o acesso aos dados de apoio ao algoritmo de tradução LIL/SQL sobre como cada conceito é representado na base de dados do domínio foram O algoritmo de tradução da linguagem LIL para SQL assume que a instrução SELECT é obtida concatenando traduções parciais de cada fórmula LIL que figuram na interrogação LIL. As fórmulas LIL com um argumento variável identificam propriedades ou entidades que a resposta deve contemplar. A tradução de fórmulas LIL com um argumento originam elementos da cláusula SELECT ou FROM, enquanto as restantes fórmulas definem a cláusula FROM ou WHERE, isto é, as condições às quais a resposta deve satisfazer. Depois de traduzir todas as fórmulas pertencentes à interrogação LIL, é necessário verificar se a cláusula FROM contém todas as tabelas referidas na cláusula SELECT e na cláusula WHERE. As tabelas em falta devem ser acrescentadas na cláusula FROM separadas por vírgula. Uma operação semelhante deve ser realizada para identificar colunas em falta que pertencem a tabelas que não têm explicitada nenhuma coluna em toda a instrução SELECT. O processo de tradução usa oito regras: uma para substituir variáveis pelo seu tipo, duas para traduzir fórmulas primitivas, uma para traduzir fórmulas que tenham conectivos lógicos, uma para traduzir fórmulas predefinidas, duas para garantir que a instrução SQL está completa e ainda outra para definir a formatação do resultado. Regra 1 — Substituição de Variáreis Durante o processo de tradução é assumido que as variáveis são substituídas pelos seus tipos, isto é, pelos nomes das classes a que pertencem. A expressão LIL: prd1(X1), prd2(X1,trm2), depois de ser aplicada a substituição X1/prd1 (assumindo que prd1 é o tipo da variável X1), é transformada em prd2(prd1,trm2). Quando a substituição ocorre refere-se o tipo de X1 como X1cte. Regra 2 — Fórmulas Primitivas Unárias A tradução de uma fórmula primitiva com um argumento (prd(trm)) identifica uma tabela ou uma expressão que envolve colunas. Existem duas possibilidades, dependendo do valor retornado pela função CLASS(prd): (a) Se o valor retornado é ‘Table’, então o valor retornado pela função EQUIVALENT(prd) é concatenado, com uma vírgula, à cláusula FROM. Se trm é constante (um nome próprio), então a expressão retornada pela função TRANSLATION(_,pred,trm) é concatenada, com o operador ‘AND’, à cláusula WHERE; (b) Se o valor retornado é ‘Column’, então Se a interrogação LIL contém uma fórmula do tipo prd2(trm2,prd), então Se trm é constante (valor de uma propriedade), então a expressão retornada pela função TRANSLATION(prd2,trm2cte,prd(trm)) é concatenada, com o operador ‘AND’, à cláusula WHERE; Se trm é variável, então Se o valor retornado pela função EQUIVALENT(prd) contém um símbolo de função, então o valor retornado pela função EQUIVALENT(prd) é concatenado, com uma vírgula, à cláusula SELECT. Senão o valor retornado pela avaliação de EQUIVALENT(trm2cte).EQUIVALENT(prd) é concatenado, com uma vírgula, à cláusula SELECT. Se a interrogação LIL não contém uma fórmula do tipo pred2(trm2,prd), então Se o valor retornado pela função EQUIVALENT(prd) contém um símbolo de função, então o valor retornado pela avaliação de EQUIVALENT(prd) é concatenado, com uma vírgula, à cláusula SELECT. Senão o valor retornado pela avaliação de DEFAULT(prd).EQUIVALENT(prd) é concatenado, com uma vírgula, à cláusula SELECT. Regra 3 — Fórmulas Primitivas Binárias A tradução de uma fórmula primitiva com dois argumentos (prd(trm1,term2)) é a expressão retornada pela função TRANSLATION(prd,trm1cte, trm2cte), que deve ser concatenada, com o operador ‘AND’, à cláusula WHERE. Regra 4 — Fórmulas com Conectivas Lógicas A tradução de uma fórmula que usa o conectivo ‘e’ (&(prd1(trm2, trm3), ..., prda(trmb, trmc))) é a expressão retornada pela avaliação de TRANSLATION(prd1cte, trm2cte, trm3cte) AND ... AND TRANSLATION(prdacte, trmbcte, trmcct), que deve ser concatenada, com o operador ‘AND’, à cláusula WHERE. A tradução de uma fórmula que usa o conectivo ‘ou’ (V(prd1(trm2,trm3),...,prda(trmb,trmc))) é a expressão retornada pela avaliação de (TRANSLATION(prd1cte,trm2cte,trm3cte) OR ... OR TRANSLATION(prdacte,trmbcte, trmccte)), que deve ser concatenada, com o operador ‘AND’, à cláusula WHERE. Regra 5 — Fórmulas Predefinidas A tradução de uma fórmula com o predicado EXACT (EXACT(trm, cte)) é concatenada, com o operador ‘AND’, à cláusula WHERE e é determinada por: (a) Se a interrogação LIL contém uma fórmula do tipo prd2(trm2,trm), então a expressão é retornada pela avaliação de TRANSLATION(prd2, trm2cte, EXACT(trm, cte)) (b) Senão a expressão é retornada pela avaliação de DEFAULT(trmcte).EQUIVALENT(trmcte)=cte A tradução de uma fórmula com o predicado SUP (SUP(trm, cte)) é concatenada, com o operador ‘AND’, à cláusula WHERE e é determinada por: (a) Se a interrogação LIL contém uma fórmula do tipo prd2(trm2,trm), então a expressão é retornada pela avaliação de TRANSLATION(prd2, trm2cte, SUP(trm, cte)) (b) Senão a expressão é retornada pela avaliação DEFAULT(trmcte).EQUIVALENT(trmcte)>cte de A tradução de uma fórmula com o predicado INF (INF(trm,cte)) é concatenada, com o operador ‘AND’, à cláusula WHERE e é determinada por: (a) Se a interrogação LIL contém uma fórmula do tipo prd2(trm2,trm), então a expressão é retornada pela avaliação de TRANSLATION(prd2, trm2cte, INF(trm, cte)) (b) Senão a expressão é retornada pela avaliação de DEFAULT(trmcte).EQUIVALENT(trmcte)<cte Regra 6 — Tabelas em Falta Se a cláusula FROM não contém todas as tabelas referenciadas na cláusula SELECT e WHERE, então todas as tabelas em falta devem ser concatenadas, com uma vírgula, à cláusula FROM. Regra 7 — Colunas em Falta Procurar as tabelas que são referenciadas na interrogação LIL em fórmulas com um argumento variável e que não têm colunas na cláusula SELECT. Para cada uma das tabelas encontradas (designadas por T) deve ser concatenado, com uma vírgula, à cláusula SELECT o valor retornado pela avaliação de EQUIVALENT(T).DEFAULT(T). Regra 8 — Formatação Opcional Aplicar a função FORMATTER a cada coluna (ou expressão que envolve funções de equivalência) da cláusula SELECT para obter o formato final de cada propriedade. Algoritmo Iniciar com uma instrução SELECT vazia Para cada fórmula LIL fazer Inicio Tentar aplicar a Regra 1 Escolher a Regra apropriada do conjunto {2,3,4,5} Aplicar a regra escolhida Fim Tentar aplicar a Regra 6 e a Regra 7 Aplicar a Regra 8 EXEMPLO Para demonstrar a aplicação do algoritmo de tradução LIL/SQL apresenta-se o seguinte exemplo comentado, assumindo que na base de dados do domínio o extracto do modelo relacional significativo para o exemplo está conforme o representado na Figura 3. O caracter ‘?’ é usado para representar uma cláusula vazia da instrução SELECT. Interrogação em língua natural: “Quais os nomes dos alunos com notas superiores a 15 valores que efectuaram o exame da disciplina de Física?” Interrogação na linguagem LIL: nome(X), ter(aluno, nome),ter(aluno, nota), SUP(nota,15), efectuar(aluno, exame), ter(exame, disciplina), disciplina(fisica) Aplicação do algoritmo de Tradução LIL/SQL: 1) Interrogação SQL: SELECT ? FROM ? Tradução de: nome(X), usando a Regra 2: A chamada à função CLASS(nome) retorna ‘Column’ e existe na interrogação LIL a fórmula ter(aluno, nome) À cláusula SELECT é concatenado o valor obtido pela avaliação da expressão: EQUIVALENT(ALUNO).EQUIVALENT(NOME), que é “ALUNO.NOME” 2) Interrogação SQL: SELECT ALUNO.NOME FROM ? Tradução de: ter(aluno, nome), usando a Regra 3: À cláusula WHERE é concatenado o valor obtido pela função: TRANSLATION(TER, ALUNO, NOME), que é “” 3) Interrogação SQL: (sem alterações). Tradução de: ter(aluno, nota), usando a Regra 3: À cláusula WHERE é concatenado o valor obtido pela função: TRANSLATION(TER, ALUNO, NOTA), que é “ALUNO.NUMERO = EXAME.NUMERO” 4) Interrogação SQL: SELECT ALUNO.NOME FROM ? WHERE ALUNO.NUMERO = EXAME.NUMERO Tradução de: SUP(nota, 15), usando a Regra 5: Existe na interrogação LIL a fórmula ter(aluno, nota) À cláusula WHERE é concatenado o valor obtido pela avaliação da expressão: TRANSLATION(TER, ALUNO, SUP(NOTA, 15)), que é “EXAME.NOTA > 15” 5) Interrogação SQL: Figura 3 – Modelo Relacional da BD do Domínio SELECT ALUNO.NOME FROM ? WHERE ALUNO.NUMERO = EXAME.NUMERO AND ALUNO.NOTA>15 Tradução de: efectuar(aluno, exame), usando a Regra 3: À cláusula WHERE é concatenado o valor obtido pela função: TRANSLATION(EFECTUAR, ALUNO, EXAME), que é “ALUNO.NUMERO = EXAME.NUMERO” 6) Interrogação SQL: (sem alterações), devido à expressão determinada já existir na cláusula WHERE. Tradução de: ter(exame, disciplina), usando a Regra 3: À cláusula WHERE é concatenado o valor obtido pela função: TRANSLATION(TER, EXAME, DISCIPLINA), que é “EXAME.C_DISCIPLINA = DISCIPLINA.C_DISCIPLINA” concebido para aceder a dados existentes numa base de dados relacional. O objectivo principal do Edite é proporcionar aos utilizadores a capacidade de obter informação armazenada numa base de dados relacional [3]. O utilizador não é obrigado a aprender uma linguagem de comunicação artificial sendo-lhe facilitada a possibilidade de formular perguntas na sua língua nativa. O Edite responde a perguntas escritas sobre recursos turísticos transformando as questões colocadas em interrogações SQL. As respostas dependem do tipo de pergunta podendo ser: listas nominais de recursos, texto, imagens, ou gráficos. Actualmente, a base de dados do domínio contém 53000 recursos turísticos organizados em 253 tipos distintos preenchendo 209 tabelas. REFERÊNCIAS [1] Androutsopoulos I., Ritchie G., Thanisch P., “An Efficient and Portable Natural Language Query Interface for Relational Databases”, Proceedings of the 6th International Conference on Industrial & Engineering Applications of Artificial Intelligence and Expert Tradução de: disciplina(fisica), usando a Regra 2: Systems, Edinburgh, U.K. Gordon and Breach Publishers Inc., Langhorne, PA, U.S.A., pages 327-330, 1993. A chamada à função CLASS(disciplina) retorna [2] Androutsopoulos I., “Interfacing a Natural Language ‘Column’ e existe na interrogação LIL a fórmula Front-End to a Relational Database (MSc thesis)”. ter(exame, disciplina) Technical paper 11, Dept. of AI, Univ. of Edinburgh, À cláusula WHERE é concatenado o valor obtido 1993. pela função: TRANSLATION(TER, EXAME, DISCIPLINA(FISICA)), [3] Androutsopoulos I., “Natural Language Interfaces An Introduction”. Journal of Natural Language que é “DISCIPLINA.D_DISCIPLINA = ‘FISICA’” Engineering, Cambridge University Press, 1994. [4] Filipe P., “Sistema de Interrogações em Língua 8) Interrogação SQL: Natural para Bases de Dados: Modelo Conceptual, SELECT ALUNO.NOME FROM ? WHERE ALUNO.NUMERO = EXAME.NUMERO AND ALUNO.NOTA>15 AND Aquisição de Vocabulário e Tradução”, M.Sc. EXAME.C_DISCIPLINA = Dissertation. Instituto Superior Técnico, Universidade DISCIPLINA.C_DISCIPLINA AND Técnica de Lisboa, 1999. DISCIPLINA.D_DISCIPLINA = ‘FISICA’ [5] Grosz B. J., Appelt D. E., Martin P. A., Pereira C. N., Aplicando a Regra 6 é concatenada, com uma vírgula, à “TEAM: An Experiment in the Design of Transportable Natural-Language Interfaces”. Artificial Intelligence 32, cláusula FROM “ALUNO, EXAME, DISCIPLINA”. pages 173-243. Elsevier Science Publishers B.V. (NorthHolland), 1987. 9) Interrogação SQL resultado da aplicação do algoritmo: [6] Marques L., “Edite - Um Sistema de Acesso a Base de SELECT ALUNO.NOME FROM ALUNO, EXAME, Dados em Língua Natural Análise Morfológica, Sintáctica DISCIPLINA WHERE ALUNO.NUMERO = EXAME.NUMERO AND ALUNO.NOTA>15 AND e Semântica”, .M.Sc. Dissertation. Instituto Superior EXAME.C_DISCIPLINA = Técnico, Universidade Técnica de Lisboa, 1996. DISCIPLINA.C_DISCIPLINA AND [7]. Reis P., Mamede N. “LIL-SQL. Processamento de DISCIPLINA.D_DISCIPLINA = ‘FISICA’ Interrogações LIL por Tradução para SQL”. Technical Aplicando a função FORMATTER à coluna NOME da Report. Grupo de Sistemas e Serviços Telemáticos, cláusula SELECT, obtém-se informação complementar à INESC, 1996. tradução. Neste exemplo, a função FORMATTER retorna [8]. Reis P., Mamede N., Matias J., Edite – A Natural Language Interface to Databases: a New Dimension for Nome_Próprio, servindo esta palavra chave para an Old Approach in “Proceeding of the Fourth identificar o formato dos nomes próprios. International Conference on Information and Communication Technology in Tourism”, ENTER’ 97, CONCLUSÃO Edinburgh, Scottland, 1997. 7) Interrogação SQL: SELECT ALUNO.NOME FROM ? WHERE ALUNO.NUMERO = EXAME.NUMERO AND ALUNO.NOTA>15 AND EXAME.C_DISCIPLINA = DISCIPLINA.C_DISCIPLINA O algoritmo apresentado é independente da base de dados e do domínio considerado [5]. Foi implementado como um módulo do Edite que é um sistema de interrogações em língua natural (português, francês, inglês, e espanhol)