Extracção de Conhecimento da Internet Mestrado em Inteligência Artificial e Computação Extracção de Anúncios e Notificação de Utilizadores do Site do Emprego Científico da Fundação para a Ciência e a Tecnologia Daniel Cardoso de Moura 29 de Maio de 2003 Índice 1. DESCRIÇÃO DO TRABALHO........................................................................ 3 2. DESCRIÇÃO DO PROCESSO ......................................................................... 3 3. 2.1. OBTENÇÃO DA PÁGINA .................................................................................... 3 2.2. EXTRACÇÃO DE ANÚNCIOS .............................................................................. 4 2.3. ACTUALIZAÇÃO DA BASE DE DADOS................................................................ 6 2.4. CLASSIFICAÇÃO DOS ANÚNCIOS PARA CADA UTILIZADOR ................................ 6 2.5. NOTIFICAÇÃO DOS UTILIZADORES POR CORREIO ELECTRÓNICO ........................ 7 IMPLEMENTAÇÃO ......................................................................................... 7 3.1. FERRAMENTAS UTILIZADAS ............................................................................. 7 3.2. ESQUEMA DA BASE DE DADOS ......................................................................... 8 4. CONCLUSÕES .................................................................................................. 8 5. MELHORIAS..................................................................................................... 9 6. BIBLIOGRAFIA................................................................................................ 9 MIAC – ECI 2 1. Descrição do Trabalho O principal objectivo deste trabalho consiste em analisar uma página da Internet onde são publicados anúncios de emprego de modo a extrair as principais informações associadas a cada um. Para tal, a aplicação utiliza conhecimento à priori relativo à estrutura do HTML da página. A informação extraída é mantida numa base de dados. A aplicação também possui um sistema de notificação de utilizadores responsável por detectar a publicação de novos anúncios e avisar os utilizadores interessados. A determinação da relevância de um dado anúncio para um utilizador está implementada de um modo relativamente básico uma vez que não é a componente em que este trabalho é focado. Sempre que são detectados novos anúncios os utilizadores são notificados via correio electrónico. A página que é alvo de análise pertence ao “Site do Emprego Científico” da FCT e pode ser acedida através do endereço: http://www.fct.mces.pt/pt/emprego/oportunidades/bdados/default.asp. 2. Descrição do Processo Na figura 1 são identificadas as fases do processo de análise da página e notificação de utilizadores. Obtenção da Página Extracção de Anúncios Actualização da BD Classificação dos Anúncios p/ cada Utilizador Notificação por e-mail Figura 1 – Processo de análise da página e notificação de utilizadores 2.1. Obtenção da Página Esta fase consiste em enviar um pedido HTTP ao servidor web de modo a obter a página HTML com os anúncios. No entanto, esta operação não corresponde a um simples comando GET para obter a página. A página de anúncios não pode ser acedida directamente. Existe uma página de entrada (figura 2), onde deve ser indicado o ano de publicação dos anúncios, que invoca outra página com os anúncios do respectivo ano. Figura 2 – Página de entrada do site de emprego científico MIAC – ECI 3 Através da análise da página de entrada concluiu-se que para obter a página de anúncios seria necessário executar um comando HTTP POST enviando alguma informação anexada, nomeadamente o ano dos anúncios (figura 3). POST /pt/emprego/oportunidades/bdados/default.asp HTTP/1.0\n Content-Length: 25\n Content-Type: application/x-www-form-urlencoded\n \n ano=2003&submit=Pesquisar\n \n Figura 3 – Exemplo do comando HTTP para obter os anúncios do ano de 2003 Não é por isso possível obter a página de anúncios apenas pela indicação do seu URL. Por esta razão o método htmlTreeParse do R não pôde ser usado para obter a página da Internet. Apenas foi utilizado para estruturar a informação da página após esta ter sido obtida através de um pedido HTTP e escrita num ficheiro local. 2.2. Extracção de Anúncios Esta fase consiste na extracção de informação da página relativa aos anúncios publicados. Para implementar a rotina de extracção de informação foi primeiro necessário estudar o HTML da página de modo a descobrir como poderia ser obtida a informação relevante. Graficamente, o aspecto da página está ilustrado na figura 4. A página é relativamente complexa principalmente se for tido em conta que não são usados frames. Existe por isso uma fracção considerável de informação a ignorar. A fracção que interessa corresponde a um conjunto de tabelas numeradas, uma tabela por anúncio. Na figura são visíveis as duas primeiras tabelas. Figura 4 – Página de anúncios do site de emprego científico A estrutura do HTML utilizado nesta página é algo complexa. O conjunto de tabelas alvo está contido dentro de um tabela que por sua vez está contida noutra que MIAC – ECI 4 por sua vez está contida em mais outra. Através da seguinte instrução conseguem-se isolar as tabelas onde estão contidos os anúncios: which(names(tp$children$html[['body']][['table']][['tr']] [['td']][[8]][[2]][['td']][['table']][['tr']][[2]])=='table') No entanto a primeira, a segunda e a última tabela não correspondem a anúncios, pelo que têm de ser retiradas. <table width="550" border="0" bgcolor="#e4e4e4" class="adds"> <tr bgcolor="#cccccc"> <td width="41"> <div align="left">1. </div> </td> <td width="499"><a href="" target="_blank"><b>Instituto Politécnico de Saúde Lisboa - Escola Superior de Enfermagem de Francisco Gentil</b></a></td> </tr> <tr> <td colspan="2"> <b>Posição:</b> professor-coordenador<br> <b>Domínio científico:</b> Enfermagem de Saúde Comunitária<br> <b>Número de vagas:</b> 1<br> <b>Data de publicação no Diário da República:</b> 1/4/2003<br> <b>Prazo de candidatura:</b> 30 dias úteis a partir da data de publicação no Diário da República<br> <a href="00conteudo/anuncio.asp?anuncioID=648" target="_blank">Anúncio</a><img src="00conteudo/images/check2.gif" alt="Concurso apurado" border="0"> <a href="00conteudo/anuncio.asp?anuncioID=648#juri" target="_blank">Júri do Concurso</a> <a href="00conteudo/anuncio.asp?anuncioID=648#lista" target="_blank">Lista de Candidatos</a> <a href="00conteudo/anuncio.asp?anuncioID=648#aprovados" target="_blank">Lista de Candidatos Aprovados</a> </td> </tr> </table> Figura 5 – HTML de um anúncio Na figura 5 pode ser observado o HTML da tabela com o primeiro anúncio. Através da sua análise tiram-se algumas conclusões importantes para a compreensão da sua estrutura: • A tabela está dividida em duas linhas. A primeira tem o nome da instituição e a segunda a informação restante. • Na segunda linha os títulos dos campos dos dados estão a bold e os respectivos dados aparecem imediatamente a seguir. • Na primeira hiperligação da segunda linha da tabela pode ser obtido o código pelo qual o anúncio é referenciado pela base de dados da FCT e que é usado para obter o texto integral do anúncio. Esta informação é suficiente para que seja possível extrair toda a informação relevante relativa a um anúncio. No entanto, existe um problema que ainda não foi referido. Na figura 4 pode ser observado que a informação relativamente à data limite pode variar. Basicamente, pode assumir duas formas: (i) é apresentado um campo com a data limite ou (ii) são apresentados dois campos: a data de publicação do anúncio e um prazo em dias a partir desta data. MIAC – ECI 5 A forma em que a data limite é expressa é facilmente detectada a partir de uma contagem do número de campos (na segunda forma é necessário mais um campo). A data limite é uma informação bastante importante para determinar se um utilizador pode ou não candidatar-se. Quando é dada com base num prazo tem, por isso, de ser calculada. Existe ainda a hipótese de o prazo ser dado em dias úteis. Neste caso, fins-desemana e feriados devem ser ignorados na contagem dos dias, se bem que a aplicação neste momento apenas ignora os fins-de-semana. 2.3. Actualização da Base de Dados Esta fase consiste em colocar na base de dados os anúncios novos desde a última actualização. Isto é conseguido verificando quais são os anúncios retirados da Internet que não estão na base de dados, como é possível ver a seguir: anuncios.db <- sqlQuery(db, "SELECT * FROM anuncios") anuncios <- anuncios.web[is.element(anuncios.web$id, setdiff(anuncios.web$id, anuncios.db$id)),] O ID do anúncio é utilizado como chave primária. Nos casos em que a data limite tem de ser calculada o que é guardado é a data resultante do cálculo e não a data de publicação e o prazo em dias. Devido a problemas com a execução de métodos como o sqlSave, foram utilizados comandos SQL a partir do método sqlQuery, o único que mostrou ter um comportamento estável e que permite realizar qualquer operação SLQ. Para actualizar a tabela de anúncios são, por isso, executadas instruções INSERT INTO que permitem adicionar os anúncios um a um. Apesar de não ser um método aparentemente muito eficiente não apresentou qualquer problema neste tópico, sendo as inserções rápidas. 2.4. Classificação dos Anúncios para cada Utilizador Esta fase consiste em determinar para cada utilizador quais os anúncios com potencial interesse em relação aos quais o utilizador ainda não foi notificado. Esta fase processase em duas etapas: 1. Identificação dos anúncios ainda não analisados para um dado utilizador; 2. Classificação dos anúncios não analisados como interessantes ou não. Para levar a cabo a primeira etapa, é mantida na base de dados informação que indica quais os anúncios que são analisados para cada utilizador. Confrontando os anúncios extraídos da página com os anúncios anteriormente analisados obtêm-se todos os anúncios ainda não analisados para um dado utilizador. Podiam ter sido usados apenas os anúncios classificados como novos da fase de extracção de anúncios da página, mas, deste modo, conseguem-se cobrir os casos em que são adicionados utilizadores novos e para os quais existem anúncios antigos ainda válidos e com interesse. Depois de determinado o conjunto de anúncios não analisados para um utilizador dá-se início à etapa de classificação. Para cada utilizador é possível definir uma expressão regular por campo de texto do anúncio. Os campos de texto são a Posição, o Domínio e a Instituição. Por exemplo, um utilizador ao definir a expressão para a Instituição como “Universidade” e a expressão do Domínio como “Informática” seria notificado sempre que aparecessem anúncios colocados por Universidades para o Domínio de Informática, independentemente do valor do campo Posição. Anúncios que não satisfaçam simultaneamente as expressões definidas para cada um dos campos são descartados. MIAC – ECI 6 2.5. Notificação dos Utilizadores por Correio Electrónico Esta fase tem como objectivo notificar por correio electrónico todos os utilizadores para os quais foram encontrados anúncios com interesse. É guardada informação na base de dados que indica se um utilizador já foi notificado relativamente a um dado anúncio. De um modo geral esta fase é executada nos seguintes passos: 1. Para cada utilizador seleccionar os anúncios com interesse sobre os quais ainda não foi notificado e cuja data limite não tenha sido ultrapassada; 2. Enviar uma mensagem de correio electrónico com informação relativa a cada um dos anúncios do ponto 1 e com hiperligações para os anúncios completos disponibilizados pelo site da FCT; 3. Marcar os anúncios como processados pela fase de notificação. Na figura 6 está ilustrado um exemplo de uma mensagem de correio electrónico enviada pela aplicação. Este exemplo contém apenas um anúncio mas poderia ter vários. Figura 6 – Exemplo de uma mensagem de notificação Através do exemplo pode-se observar um problema que não foi ultrapassado: os caracteres com acentos ou cedilhas são mal interpretados pelo R. 3. Implementação 3.1. Ferramentas Utilizadas É objectivo da cadeira usar a ferramenta R para a realização do trabalho. No entanto, esta ferramenta apesar de ser bastante completa no que diz respeito a tratamento de informação, não disponibiliza algumas funcionalidades de carácter tecnológico como por exemplo uma API para correio electrónico. Por isso, das fases descritas no capítulo anterior, a primeira (obtenção da página através de um comando POST ao servidor web) e a última (notificação dos utilizadores por correio electrónico) foram implementadas numa linguagem que ultrapassa estas faltas facilmente, o Java. De salientar que o R suporta Sockets pelo que estas duas fase poderiam ter sido implementadas sem recorrer ao Java. No entanto, para o envio de mensagens de correio electrónico seria necessário implementar um protocolo de envio de mensagens (ex. SMTP). Além disso é referido na documentação do R que as rotinas de leitura e escrita em sockets (read.socket e write.socket) fazem muito poucas verificações de erro tornando-se, por isso, pouco fiáveis. As fases de extracção de informação da página, actualização da base de dados e classificação dos anúncios para cada utilizador, foram totalmente implementadas em R. Relativamente à base de dados foi usado o Microsoft Access. Apesar de ser uma base de dados de uso pessoal serve perfeitamente para as necessidades deste trabalho. MIAC – ECI 7 Houve uma tentativa de usar instruções SQL standard de modo a facilitar uma eventual mudança de base de dados. 3.2. Esquema da base de Dados Na figura 7 está ilustrado o esquema da base de dados utilizada neste trabalho. Figura 7 – Esquema da Base de Dados Basicamente, a base de dados é constituída por três tabelas: anúncios, utilizadores (users) e outra que relaciona anúncios com utilizadores (anunciosusers). Na tabela anúncios são guardados todos os anúncios extraídos da página. A chave primária é o número identificador utilizado pela FCT e a data limite pode ser resultado de um cálculo ou não (mediante as características do anúncio). Na tabela users estão armazenados os utilizadores, os seus endereços de correio electrónico e informação relativa ao padrão que os anúncios devem respeitar de acordo com três parâmetros: a instituição a posição e o domínio. Por fim, sempre que um anúncio é analisado para um dado utilizador é criado um registo na tabela anúnciosusers. O campo match indica se o anúncio foi classificado como interessante ou não, e o campo dt indica a data em que o processo de notificação considerou o anúncio (este campo é nulo caso o processo de notificação ainda não tenha considerado o anúncio para envio por correio electrónico ou no caso de ter surgido um erro no envio da mensagem). 4. Conclusões O R mostrou ser uma ferramenta bastante prática para operações relacionadas com extracção de dados. Permite analisar a estrutura de uma página HTML de um modo relativamente intuitivo e depois utilizar a informação relativamente a essa estrutura facilmente. No entanto, os níveis de performance na extracção de informação relativa aos anúncios são relativamente baixos (cerca de 1 a 2 segundos por anúncio). Provavelmente, a complexidade da estrutura HTML da página e o seu tamanho relativamente elevado (cerca de 500 KB) foram os principais responsáveis por esta situação. As restantes operações, incluindo as de acesso à base de dados, atingiram níveis de performance bastante mais razoáveis. MIAC – ECI 8 5. Melhorias Relativamente a melhorias à aplicação, as essenciais são: • Disponibilização de um site para os utilizadores poderem definir os seus padrões de anúncio e a sua informação pessoal, e poderem visualizar os anúncios abertos com potencial interesse; • Flexibilização do modo de definir padrões de anúncios; • Permitir uma classificação quantitativa dos anúncios, ou uma classificação qualitativa com maior espectro (ex. Muito Interessante, Interessante, Eventualmente Interessante, Desinteressante) • Corrigir o problema de interpretação de caracteres com acentuação do R; • Permitir a definição de dias não úteis para além dos fins-de-semana; • Verificar quando um anúncio é alterado de modo a corrigir a informação da base de dados. 6. Bibliografia jGuru. “JDBC 2.0 Fundamentals – Short Course”. Sun Microsystems. 2000. jGuru. “Fundamentals of the JavaMail API – Short Course”. Sun Microsystems. 2001. Luís Torgo. “Programação, Análise de Dados e Sistemas de Apoio à Decisão usando o R”. Faculdade de Economia, Universidade do Porto. Outubro de 2002. Luís Torgo. “Data Mining with R: learning by case studies”. Laboratório de Inteligência Artificial e Ciências dos Computadores, Universidade do Porto. Novembro de 2002. Luís Torgo, Pavel Brazdil, Alípio Jorge. “Diapositivos da cadeira de Extracção de Conhecimento da Internet do Mestrado de Inteligência Artificial e Ciências de Computação”. Laboratório de Inteligência Artificial e Ciências dos Computadores, Universidade do Porto. 2003. MIAC – ECI 9