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&uacute;ncio</a><img src="00conteudo/images/check2.gif"
alt="Concurso apurado" border="0"> &nbsp;&nbsp;&nbsp;&nbsp;
<a href="00conteudo/anuncio.asp?anuncioID=648#juri"
target="_blank">J&uacute;ri do Concurso</a> &nbsp;&nbsp;&nbsp;&nbsp;
<a href="00conteudo/anuncio.asp?anuncioID=648#lista"
target="_blank">Lista de Candidatos</a> &nbsp;&nbsp;&nbsp;&nbsp;
<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
Download

Relatório - Universidade do Porto