MAC 499 - Trabalho de Formatura SupervisionadoInstituto de Matemática e Estatística - IMEUniversidade de São Paulo - USPOntologias e a Biblioteca Virtual
Aluno: Andrew Gan King Yuan
|
Sumário |
topo da página
![]() |
![]() |
1. Introdução |
topo da página
![]() |
![]() |
|
2. Inteligência Artificial |
topo da página
![]() |
![]() |
Um ser é considerado inteligente quando é capaz de atingir metas. Inteligência é a parte computacional da habilidade de alcançar essas metas no mundo. Inteligência Artificial é a ciência e a engenharia de construir máquinas inteligentes, especialmente programas de computador inteligentes. Essa é a definição de Inteligência Artificial. Para se criar uma máquina ou programa de computador capaz de alcançar um objetivo mais eficazmente, é desejável a compreensão de um contexto. O que temos usualmente são máquinas e programas que resolvem problemas, seguindo instruções programadas por seres humanos. Isso ocorre porque nem máquinas e nem programas possuem uma consciência, para terem a capacidade de criar suas próprias instruções. Assim, o que desenvolvedores fazem é aumentar a complexidade das instruções dadas aos programas ou às máquinas, criando a ilusão de elas estarem criando suas próprias soluções. O que sistemas de Inteligência Artificial buscam fazer é, de alguma forma, desenvolver máquinas e programas que tenham a capacidade de tomar decisões inteligentes para atingir uma meta. Um dos métodos adotados pela Inteligência Artificial, é o de dar ao agente (máquina ou programa) uma capacidade de compreensão de um contexto, para não simplesmente serem meros analisadores de strings e números, e executores de instruções. Em outras palavras, a compreensão de um contexto equivale a não apenas interpretar dados e a sintaxe de objetos, ou uma mera representação de objetos, mas interpretar a semântica deles, seus significados. Uma das áreas da Inteligência Artificial que estuda isso é a Ontologia. |
3. Ontologia |
topo da página
![]() |
![]() |
Ontologia é um termo adaptado para a computação, emprestado da filosofia. Pela filosofia, a ontologia é o estudo do ser enquanto ser, de acordo com Aristóteles. Em outras palavras, Ontologia é um estudo sobre a existência. Mas em sistemas de Inteligência Artificial, dizemos que algo existe quando pode ser representado, ou, tudo que pode ser representado, existe. Para ontologias em sistemas de Inteligência Artificial a definição mais utilizada atualmente é a dada por Tom Gruber, um pesquisador da área: "Ontologia é uma especificação formal e explícita de uma conceitualização compartilhada". Mas o que quer dizer isso? Na Inteligência Artificial, os programas e sentenças lidam com vários tipos de objetos, que representam diferentes aspectos de um determinado domínio. A ontologia estuda quais são esses tipos, quais são suas propriedades básicas e quais são as conexões entre eles (relações, dependências e predicações). É uma especificação explícita de uma conceitualização. Resumidamente, é uma forma de representar um conjunto de objetos (concretos ou abstratos, reais ou irreais) e as relações entre eles, possibilitando assim que uma máquina entenda não apenas a sintaxe ou representação desse conjunto de objetos, mas também sua semântica, o significado desses objetos, e o que eles representam no nosso domínio. Ontologias são desenvolvidas por filósofos e cientistas trabalhando na área de Inteligência Artificial, teoria de bancos de dados, processamento de linguagem natural e representação de conhecimento. Para ficar mais claro o significado de ontologias, usarei um exemplo. Vamos criar uma ontologia representando o mundo acadêmico universitário. Uma classe nesse mundo seria, obviamente, universidade. Algumas instanciações de universidade poderiam ser USP, Unicamp, Unesp, entre outras. Podemos também criar a classe estudante. Para essa classe, podemos estabelecer algumas propriedades, como nome, sexo, idade, etc. Para a classe estudante, criamos as subclasses aluno e aluna, e podemos dizer que aluno é um estudante do sexo masculino e aluna uma estudante do sexo feminino. Podemos criar uma relação estudaEm. Assim, podemos dizer que uma instanciação da classe estudante estudaEm uma instanciação da classe universidade. Essa esquematização desse domínio escolhido é uma ontologia. As possibilidades são infinitas. Podemos também criar ontologias de um mundo imaginário, ou um mundo abstrato, ou até criar um mundo novo e descrevê-lo em uma ontologia. Podemos criar uma ontologia descrevendo sentimentos, ou descrevendo uma área de conhecimento, ou até um lugar físico, como uma cozinha por exemplo. |
4. Web Semântica |
topo da página
![]() |
![]() |
Atualmente, a World Wide Web (WWW) possui uma imensa quantidade de informações, que vem se expandindo rapidamente. A maior parte desses dados é representada usando a Hypertext Markup Language (HTML), que foi desenvolvida para permitir que desenvolvedores web apresentem informação de uma maneira acessível para visualização por seres humanos via browser. Porém, HTML não disponibiliza um modo de descrever a informação de forma que facilite o uso de softwares para encontrá-la ou interpretá-la. Ele permite que a informação seja representada de uma forma bem estruturada, para visualização e compreensão por parte de seres humanos, mas para máquinas, toda essa informação não é de fácil compreensão. Máquinas e programas podem apenas armazenar a informação como meras sequências de caracteres, sem compreender seu significado. Um problema clássico que isso causa pode ser visto em sistemas de busca de palavras em um texto. Por exemplo, se quisermos buscar a palavra ar, poderiam aparecer diversos resultados indesejados, como andar, falar, armar, arcabouço, etc. Ou entramos em um site de busca, procurando pelo site de uma empresa chamada maçã, por exemplo :-). Certamente, receberíamos como resposta, milhares de sites sobre fazendas, plantações, feiras, supermercados, alimentação, refeições, e provavelmente, nem conseguiríamos encontrar o site realmente procurado em meio a tanta informação. Aí que entra a Web Semântica. A Web Semântica é um esforço conjunto para representação de dados na Web, liderado pela W3C (World Wide Web Consortium), com a participação de muitos parceiros e pesquisadores. Pelo uso de ontologias, a Web Semântica permite uma descrição bastante detalhada da informação contida em cada site. Mas como fazemos para representar uma ontologia? Para isso, foram desenvolvidas diversas linguagens de representação, baseadas em XML.. Alguns exemplos de linguagens são RDF (Resource Description Framework), SHOE (Simple HTML Ontology Extensions), XOL (Ontology Exchange Language), OML (Ontology Markup Language), DAML(DARPA Agent Markup Language), OIL(Ontology Inference Layer), DAML+OIL, OWL (Web Ontology Language), entre outros. Como essa é uma área de pequisa relativamente recente, ainda não se estabeleceu uma linguagem oficial para ontologias. De certa forma, uma linguagem é a evolução da outra, sendo que OWL é a linguagem mais atual. |
5. URI (Universal Resource Identifier) |
topo da página
![]() |
![]() |
URIs são strings utilizadas para identificar recursos na web, como páginas, serviços, documentos, imagens, músicas, arquivos, caixas de e-mail, notícias, entre muitos outros. Há um grande número de formas de endereçamento, e mais outros podem ser ainda incorporados com o tempo. O URL (Universal Resource Locator) e o URN (Universal Resource Name) são tipos de URIs. Alguns exemplos de URI:
A sintaxe do URI básica é <esquema>:<parte específica do esquema> Mas muitos tipo de URI possuem, em suas partes específicas, uma sintaxe semelhante, que é da forma <esquema>://<<autoridade><caminho>?<pergunta> Informações mais detalhadas podem ser encontradas em [9]. |
6. Modelo RDF (Resource Description Framework) |
topo da página
![]() |
![]() |
Darei uma breve descrição da sintaxe do RDF. Um modelo RDF é semelhante a um diagrama entidade relacionamento, e possui um sistema de classes, semelhante a programação orientada a objetos e sistemas de modelagem. Uma coleção de classes, normalmente criadas para um propósito ou domínio específico, é chamada de schema. As classes podem ser organizadas em uma hierarquia, além de haver também a possibilidade do uso de subclasses. Esse agrupamento de classes em uma coleção tem o propósito de especificar o significado de cada termo de uma forma mais precisa. Isso se dá pois, num mundo como a World Wide Web, existe uma infinidade de termos, tornando muito possível uma confusão entre eles. Assim, podemos entender o schema como uma espécie de dicionário, procurando especificar os termos e seus domínios de forma mais precisa. Cada termo é ligado ao seu schema através de um identificador do domínio, do contexto em que o objeto se encontra: o namespace . O modelo RDF é composto basicamente por 3 tipo de objetos: recursos (resources), propriedades (properties) e declarações (statements). Todas as coisas (classes) descritas por expressões RDF são recursos. Um recurso pode ser algum objeto presente em uma página Web, ou mesmo a própria página Web ou um conjunto delas. Um recurso não necessariamente é acessivel diretamente via Web. Pode ser também uma pessoa que trabalha em uma determinada empresa, ou um modelo de aparelho celular. Tudo aquilo que é descrito em uma ontologia, é um recurso. Cada recurso é identificado por um URI (Universal Resource Identifier) . Uma propriedade é um aspecto, uma característica, um atributo ou uma relação usada para descrever um recurso. Cada propriedade tem um significado específico, define seus valores permitidos, os tipos de recursos que ela pode descrever e sua relação com outras propriedades . Um certo recurso junto com uma propriedade nomeada mais o valor da propriedade para esse recurso é uma declaração. Esses 3 indivíduos de uma declaração são chamados, respectivamente, de sujeito (subject), predicado (predicate) e objeto (object). O objeto de uma declaração (ou seja, o valor da propriedade) pode ser um outro recurso (especificado por um URI) ou simplesmente uma string ou algum valor de tipo primitivo, definido pelo XML. Por exemplo, um sujeito (ou recurso) poderia ser a Robótica Cognitiva, indentificada pela URI file:/home/renata/ontologias/ontologies/IABibVirt.daml#RobóticaCognitiva em nossa ontologia. Um predicado (ou propriedade) poderia ser subClassOf, definida pelo RDF. E então, um objeto poderia ser um outro recurso, a Inteligência Artificial, de URI file:/home/renata/ontologias/ontologies/IABibVirt.daml#InteligênciaArtificial RDF também permite algumas informações adicionais sobre os recursos ou propriedades, através das propriedades rdfs:label, rdfs:comment, rdfs:seeAlso e rdfs:isDefinedBy. Uma representação em DAML do modelo descrito, seria: <daml:Class rdf:about="file:/home/renata/ontologias/ontologies/IABibVirt.daml#RobóticaCognitiva"> <rdfs:label>RobóticaCognitiva</rdfs:label> <rdfs:comment> <![CDATA[]]> </rdfs:comment> <oiled:creationDate> <![CDATA[ 2003-07-02T14:42:30Z ]]> </oiled:creationDate> <oiled:creator> <![CDATA[ renata ]]> </oiled:creator> <rdfs:subClassOf> <daml:Class rdf:about="file:/home/renata/ontologias/ontologies/IABibVirt.daml#InteligênciaArtificial" /> </rdfs:subClassOf> </daml:Class> Para uma descrição mais detalhada, olhar em [10]. |
7. OWL (Web Ontology Language) |
topo da página
![]() |
![]() |
Aqui, darei uma breve descrição da linguagem OWL. A linguagem OWL foi desenvolvida para uso em aplicações que precisam processar o conteúdo de informações ao invés de simplesmente apresentá-las para humanos. Ela permite uma melhor interpretação de conteúdo Web do que a suportada por XML, RDF e RDFS, fornecendo vocabulário adicional acompanhado de uma semântica formal. Pode ser usada para representar o significado de termos de vocabulários explicitamente, e as relações entre esses termos. OWL é uma revisão da linguagem DAML+OIL. Ela é dividida em 3 sublinguagens: OWL Lite, OWL DL e OWL Full . Além das propriedades do RDF, OWL possui algumas peculiaridades, que aumentam a expressividade da linguagem. Algumas delas são: Para maiores informações sobre OWL, consultar [11]. |
8. Jena |
topo da página
![]() |
![]() |
Jena é uma Framework Java de código aberto para construção de aplicações de Web Semântica. É um conjunto de diversos pacotes e classes para manipulação, consulta e criação de ontologias. Foi desenvolvida em conjunto com a HP Labs Semantic Web Programme, e atualmente está na versão 2.0, disponivel em http://jena.sourceforge.net/ O Jena é formado por diversos subsistemas. Um dos subsistemas é formado por uma API RDF, para manipulação de modelos RDF. Há um subsistema para persistência, que implementa uma extensão da classe Model, que disponibiliza persistência para modelos, pelo uso de banco de dados. Outro subsistema é o subsistema de raciocínio (reasoning subsystem). Ele incluí uma máquina para inferência baseado em regras genéricas. Ele possui alguns conjuntos de regras pré-configuradas, para cada linguagem, como RDFS, DAML+OIL, OWL e afins. Outro subsistema é o de ontologia. O Jena possui uma API para ontologias, para auxiliar programadores no uso de dados de ontologias baseados em RDF. Com o Jena, podemos criar ou manipular um modelo RDF como um conjunto de triplas RDF (sujeito-predicado-objeto), através de métodos baseados em declarações (statements), ou também como um conjunto de recursos com propriedades, através de métodos baseados em recursos. A API de ontologias possui suporte para OWL, DAML+OIL e RDFS. Essa API possui as classes Resource, Property e Statement, que, através de algumas abstrações, abrangem essas 3 linguagens, inclusive implementando também as relações entre elas. Esse subsistema trabalha diretamente ligado com o subsistema de raciocínio. Para consultas em modelos de ontologias, o Jena também implementa uma linguagem de consulta, o RDQL (RDF Data Query Language). Ele possui uma estrutura semelhande à do SQL. Para ficarmos mais claros sobre o funcionamento do Jena, vou dar algumas breves explicações sobre o seu uso e funcionamento. Para se criar uma nova ontologia, devemos criar um objeto da classe Model. A ontologia fica armazenada nessa classe. Mas para criar esse objeto, precisamos usar a classe ModelFactory. Essa classe fornece alguns métodos para a criação de um modelo. Ela permite criar diversos tipos de modelos, e também modelos para diferentes linguagens. O modo mais fácil é criar um modelo default, através do método ModelFactory.createDefaultModel(), que retorna um modelo RDF guardado em memória, que não faz inferências e não possui nenhuma interface ontológica especial. Para usar RDFS, OWL ou DAML, criamos um ontology model, que é um modelo que apresenta o RDF como uma ontologia. Para definir alguma dessas linguagens, precisamos usar perfis, que são fornecidos como argumento para a função createOntologyModel(java.lang.String languageURI). Essa função retorna um objeto do tipo OntModel. Um exemplo de criação de um ontology model usando OWL Full pode ser: OntModel m = ModelFactory.createOntologyModel( ProfileRegistry.OWL_LANG ); Criado o modelo, podemos adicionar recursos, propriedades e declarações. Para criar um recurso, usamos o método createResource(String URI) da classe Model, que retorna um objeto da classe Resource. Podemos também criar proprierades e adicioná-las aos recursos, pelo método addProperty().
Query query = new Query( "SELECT ?x WHERE (<file:/home/renata/ontologias/ontologies/IABibVirt.daml#ArtificialIntelligence>,<http://www.daml.org/2001/03/daml+oil#sameClassAs>, ?x)"); query.setSource(model); QueryExecution qe = new QueryEngine(query); QueryResults results = qe.exec(); Iterator it = results. Os resultados da consulta estão no iterador.
|
9. O Aplicativo |
topo da página
![]() |
![]() |
A proposta desta iniciação científica foi pesquisar a respeito de ontologias e modificar o esquema de busca realizado pela Biblioteca Virtual , fazendo com que essa busca fosse realizada não somente pela palavra fornecida, mas também por seus sinônimos. Os sinônimos são indicados por uma ontologia a ser fornecida pela minha professora orientadora. O aplicativo é um tanto simples. Ele é um projeto inicial, criado para demonstrar as possibilidades do uso de ontologias e do Jena. Tendo em vista o proposto, a solução escolhida foi o desenvolvimento de um programa Java com interface gráfica awt. O programa realiza a consulta na ontologia utilizando-se do Jena 2, procurando em uma ontologia os sinônimos de palavras fornecidas. Assim, o programa gera os sinônimos das palavras e então abre a página de consulta da Biblioteca Virtual com o campo de consulta já preenchido pelos sinônimos. Porém, como na busca da Biblioteca Virtual não estava implementado o uso de mais de uma palavra na busca, foi necessária uma mudança em sua implementação. A seguir, darei detalhes sobre a implementação de ambos. O programa pode ser encontrado aqui. Para ele rodar, é necessário estar instalado na máquina o J2SDK e o Jena2, com a variável CLASSPATH apontando devidamente para as bibliotecas do J2SDK e também do Jena2, que são arquivos jar. |
10. Implementação |
topo da página
![]() |
![]() |
Foi desenvolvido um aplicativo de nome Teste.java. A seguir, fornecerei detalhes das diferentes partes da implementação. 10.1. Leitura das configurações Configurações como o nome do arquivo contendo a ontologia, o namespace da ontologia, o URI da propriedade SameClassAs e a URL da Biblioteca Virtual podem ser modificados, editando-se o arquivo teste.conf. O aplicativo, durante sua inicialização, realiza uma leitura nesse arquivo, checando os valores definidos para as variáveis contidas no arquivo, e carrega-os no aplicativo. A leitura desse arquivo é realizada utilizando-se da classe BufferedReader, que possibilita a leitura da entrada desejada linha por linha, já que se utiliza de um buffer para armazenamento dos caracteres lidos. Essa leitura é realizada pela função readLine(). É fornecido ao construtor do BufferedReader um FileReader do arquivo teste.conf, setando o arquivo como a entrada lida pelo BufferedReader.A formatação do arquivo foi pré-definida. Sua forma é:
arquivoEntrada=teste.daml namespace=file:/home/renata/ontologias/ontologies/IABibVirt.daml# sameClassAs=http://www.daml.org/2001/03/daml+oil#sameClassAs bibliotecaVirtual=http://www.ime.usp.br/~ayuan/mac499/biblioteca/redirector.phpAssim, sua leitura se torna mais imediata, não sendo necessário o uso de StringTokenizer ou algo do tipo para checagem do arquivo. Foi definido que essa disposição do arquivo deve ser mantida, inclusive a ordem das variáveis. A leitura é realizada linha por linha, sendo definido, por exemplo, que todos os caracteres da primeira linha a partir do décimo quinto caractere é o nome do arquivo da ontologia. Assim foi realizada a leitura de cada uma das variáveis, que é realizada pela função leArquivoConf(String arquivo). Essa função lança 2 tipos de excessões. IOException e FileNotFoundException. Ela lança uma IOException caso haja algum problema com a leitura do arquivo, como a formatação do arquivo esperada não corresponder à encontrada. Ela lança uma FileNotFoundException caso o arquivo de configurações não seja encontrado. O código dessa função encontra-se logo abaixo. private void leArquivoConf(String arquivo) throws IOException, FileNotFoundException { FileReader entrada; try { entrada = new FileReader(arquivo); BufferedReader conf = new BufferedReader(entrada); try { String linha = conf.readLine(); this.nomeArquivo = linha.substring(15, linha.length()); linha = conf.readLine(); this.namespace = linha.substring(10, linha.length()); linha = conf.readLine(); this.sameClassAs = linha.substring(12, linha.length()); linha = conf.readLine(); this.bibVirtual = linha.substring(18, linha.length()); } catch (IOException e) { throw new IOException(); } } catch (FileNotFoundException e1) { throw new FileNotFoundException(); } } 10.2. Leitura do arquivo da Ontologia
Agora que já sabemos o nome do arquivo contendo a ontologia,
podemos carregá-la em um objeto da classe OntModel,
criado pela função ModelFactory.createOntologyModel().
Então, criamos um objeto da classe FileInputStream apontando
para o arquivo da ontologia, e então passamos esse objeto para
a função read() da classe OntModel. Passamos também
como argumento dessa função o namespace da ontologia.
O arquivo da ontologia está no formato XML. 10.3. Interface gráfica 10.3.1. Gerar sinônimos 10.3.2. Remover 10.3.3. Pesquisar |
11. Dificuldades encontradas |
topo da página
![]() |
![]() |
O primeiro problema encontrado foi descobrir algum meio de manipular uma ontologia, já que a Biblioteca Virtual foi implementada em PHP, e não foi encontrado nada em PHP que manipulasse ontologias. Foram encontrados alguns programas servidores que faziam isso, mas não pareceu ser uma solução muito boa, já que o servidor teria que ser instalado na rede IME. Para isso, a solução mais direta encontrada foi usar Java, através do Jena. Assim, já que a Biblioteca Virtual é uma aplicação Web, decidi desenvolver um applet que utilizasse o Jena. Porém, foram encontrados alguns problemas para isso. As bibliotecas do Jena são grandes demais. Os arquivos são muito pesados para serem carregados pela internet toda vez que quisermos rodar o applet. Então, decidi estabelecer que todas as máquinas que quiserem se utilizar do applet deveriam ter o Jena instalado. Mas então, descobri que applet não pode carregar bibliotecas externas, como restrição de segurança. Outro problema seria ter que carregar toda vez o arquivo da ontologia, que também pode ser um arquivo grande demais. Por isso, decidi não usar applet, mas criar um aplicativo Java normal, que então abriria o Browser e carregaria a Biblioteca Virtual, alimentando o campo de busca. Como essa é uma área de pesquisa relativamente nova, houve uma certa dificuldade para encontrar fontes para estudo e também ferramentas. Além disso, é uma área bastante complexa, com muitos pequenos detalhes imprescindíveis para a compreensão do todo. Assim, foi necessária muita leitura e muito estudo para a compreensão do assunto. Todas as fontes de estudo necessárias foram citadas na bibliografia deste documento. |
12. Matérias do IME |
topo da página
![]() |
![]() |
Matérias do IME que contribuíram para a realização desta Iniciação Científica: MAC110 - Introdução a Computação
Antes de ingressar no curso de Ciência da Computação do IME, eu era apenas um usuário do computador. Não tinha a menor noção de programação. Essas matérias foram essenciais para que eu me familiarizasse com as técnicas e metodologias de programação, em especial, a linguagem C, que me deu uma base para a lógica de programação. Assim, essas matérias foram as que me familiarizaram com a programação, imprescindível para esta Iniciação Científica. Além disso, em MAC211 aprendi a usar sistemas Unix e seus comandos, usados no desenvolvimento do projeto tanto no próprio ambiente Linux, como em SSHs, sendo que a Biblioteca Virtual está hospedada na rede IME, ambiente Linux.
MAC242 - Laboratório de Programação II Nessa matéria foi que eu aprendi os conceitos da programação orientada a objetos, e a linguagem Java em particular, utilizada em todo o desenvolvimento do programa que interage com a Biblioteca Virtual. Além disso, aprendi a linguagem Perl, semelhante a PHP, que foi a linguagem utilizada no desenvolvimento da Biblioteca Virtual. Aprendi também expressões regulares, utilizadas no aplicativo para manipulação de strings.
MAC426 - Sistemas de Bancos de Dados Nessa matéria foi aprendida a linguagem SQL, semelhante a RDQL utilizada no Jena, dando-me uma base do funcionamento de uma busca, e de como se deve pensar ao querer realizar uma busca num banco de dados, em especial a noção de tuplas.
MAC425 - Inteligência Artificial Esta foi a matéria mais importante para a Iniciação Científica, já que nela, além de ter criado sistemas de IA em Java, foram dados alguns conceitos adotados em ontologias. Foi um curso em que eu desenvolvi bastante os meus conhecimentos da linguagem Java, pois desenvolvi diversos projetos nessa linguagem. Mas mais importante do que isso, foram algumas noções sobre a Inteligência Artificial, como o armazenamento de informações e relacionamentos entre elas, que é a forma utilizada para uma máquina compreender melhor um determinado ambiente. As ontologias giram em torno disso, pois definem classes, objetos e relacionamentos e propriedades. Toda essa maneira de pensar e encarar as ontologias foi adquirida nesse curso, que foi essencial para a realização e compreensão deste projeto.
MAC438 - Programação Concorrente Apesar de o aplicativo não utilizar de programação concorrente diretamente, essa matéria foi bastante útil já que nela realizei em EPs muita programação Java, em projetos relativamente grandes, podendo assim desenvolver bastante meus conhecimentos sobre a linguagem.
MAC332 - Engenharia de Software Apesar de o aplicativo criado ser apenas um aplicativo de testes, alguns conceitos de engenharia de software foram utilizados para melhor organização do código do aplicativo, em particular a abstração de funções e a modularização do código, que facilitam o entendimento do mesmo. |
13. Bibliografia |
topo da página
![]() |
![]() |
Seminários
|